Skip to content

Commit 363cb13

Browse files
Extend test case to forced unstaking of all validators
1 parent 172f8b2 commit 363cb13

File tree

3 files changed

+111
-54
lines changed

3 files changed

+111
-54
lines changed

src/BaseDelegation.sol

+5-4
Original file line numberDiff line numberDiff line change
@@ -853,17 +853,18 @@ abstract contract BaseDelegation is IDelegation, PausableUpgradeable, Ownable2St
853853
);
854854
(success, data) = DEPOSIT_CONTRACT.call(callData);
855855
require(success, DepositContractCallFailed(callData, data));
856-
$.validators[j].futureStake = 0;
857856
$.validators[j].status = ValidatorStatus.FullyUndeposited;
858857
totalContribution -= contribution[j];
859858
contribution[j] = 0;
860-
if (amount > minimumDeposit)
861-
amount -= minimumDeposit;
859+
if (amount > $.validators[j].futureStake) {
860+
amount -= $.validators[j].futureStake;
861+
$.validators[j].futureStake = 0;
862+
}
862863
else {
863864
// store the excess deposit withdrawn that was not requested
864865
// by the unstaking delegator so that we can distuingish it
865866
// later from the claimable amount unstaked by the delegator
866-
$.validators[j].futureStake = minimumDeposit - amount;
867+
$.validators[j].futureStake -= amount;
867868
$.pendingRebalancedDeposit += $.validators[j].futureStake;
868869
return;
869870
}

test/LiquidDelegation.t.sol

+53-24
Original file line numberDiff line numberDiff line change
@@ -1660,35 +1660,22 @@ contract LiquidDelegationTest is BaseDelegationTest {
16601660
assertEq(totalStaked, 100 ether, "Incorrect total stake");
16611661
}
16621662

1663-
function test_UnstakeNotTooMuch() public {
1663+
function test_LargeUnstakeUndepositValidators() public {
16641664
uint256 depositAmount = 10_000_000 ether;
16651665
depositFromPool(BaseDelegation(delegation), 2 * depositAmount, DepositMode.Bootstrapping);
16661666
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("2"), 2);
16671667
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("3"), 3);
16681668
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("4"), 4);
1669-
vm.startPrank(makeAddr("2"));
1670-
delegation.unstake(lst.balanceOf(makeAddr("2")));
1671-
vm.stopPrank();
1672-
assertEq(delegation.getDeposit(validator(1)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1673-
assertEq(delegation.getDeposit(validator(2)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1674-
assertEq(delegation.getDeposit(validator(3)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1675-
assertEq(delegation.getDeposit(validator(4)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1676-
vm.startPrank(makeAddr("3"));
1677-
delegation.unstake(lst.balanceOf(makeAddr("3")));
1669+
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("5"), 5);
1670+
vm.startPrank(makeAddr("5"));
1671+
delegation.leavePool(validator(5));
16781672
vm.stopPrank();
1679-
assertEq(delegation.getDeposit(validator(1)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1680-
assertEq(delegation.getDeposit(validator(2)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1681-
assertEq(delegation.getDeposit(validator(3)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1682-
assertEq(delegation.getDeposit(validator(4)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1683-
}
1684-
1685-
function test_UnstakeTooMuchUndepositValidators() public {
1686-
uint256 depositAmount = 10_000_000 ether;
1687-
depositFromPool(BaseDelegation(delegation), 2 * depositAmount, DepositMode.Bootstrapping);
1688-
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("2"), 2);
1689-
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("3"), 3);
1690-
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("4"), 4);
16911673
assertEq(delegation.getStake(), 80 * depositAmount / 10, "incorrect stake");
1674+
assertEq(delegation.validators().length, 4, "incorrect number of validators");
1675+
assertEq(delegation.getDeposit(validator(1)), 20 * depositAmount / 10, "validator deposits are decreased equally");
1676+
assertEq(delegation.getDeposit(validator(2)), 20 * depositAmount / 10, "validator deposits are decreased equally");
1677+
assertEq(delegation.getDeposit(validator(3)), 20 * depositAmount / 10, "validator deposits are decreased equally");
1678+
assertEq(delegation.getDeposit(validator(4)), 20 * depositAmount / 10, "validator deposits are decreased equally");
16921679
vm.startPrank(makeAddr("2"));
16931680
delegation.unstake(lst.balanceOf(makeAddr("2")));
16941681
assertEq(delegation.getDeposit(validator(1)), 15 * depositAmount / 10, "validator deposits are decreased equally");
@@ -1715,12 +1702,14 @@ contract LiquidDelegationTest is BaseDelegationTest {
17151702
assertEq(delegation.getStake(), 40 * depositAmount / 10, "incorrect stake");
17161703
assertEq(delegation.validators().length, 4, "incorrect number of validators");
17171704
vm.stopPrank();
1718-
uint256 lstBalance = lst.balanceOf(makeAddr("4"));
17191705
vm.startPrank(makeAddr("4"));
1720-
delegation.unstake(15 * lstBalance / 20);
1706+
delegation.unstake(15 * lst.balanceOf(makeAddr("4")) / 20);
17211707
assertEq(delegation.getStake(), 25 * depositAmount / 10, "incorrect stake");
1708+
assertEq(delegation.validators().length, 4, "incorrect number of validators");
17221709
assertEq(delegation.getDeposit(validator(1)), 10 * depositAmount / 10, "validator deposit mismatch");
17231710
assertEq(delegation.getDeposit(validator(2)), 10 * depositAmount / 10, "validator deposit mismatch");
1711+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1712+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
17241713
vm.roll(block.number + delegation.unbondingPeriod());
17251714
balanceBefore = makeAddr("4").balance;
17261715
delegation.claim();
@@ -1729,6 +1718,46 @@ contract LiquidDelegationTest is BaseDelegationTest {
17291718
assertEq(delegation.validators().length, 2, "incorrect number of validators");
17301719
assertEq(delegation.getDeposit(validator(1)), 125 * depositAmount / 100, "validator deposit mismatch");
17311720
assertEq(delegation.getDeposit(validator(2)), 125 * depositAmount / 100, "validator deposit mismatch");
1721+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1722+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1723+
vm.stopPrank();
1724+
vm.startPrank(owner);
1725+
delegation.unstake(lst.balanceOf(owner));
1726+
assertEq(delegation.getStake(), 5 * depositAmount / 10, "incorrect stake");
1727+
assertEq(delegation.validators().length, 2, "incorrect number of validators");
1728+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1729+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1730+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1731+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1732+
vm.roll(block.number + delegation.unbondingPeriod());
1733+
balanceBefore = owner.balance;
1734+
delegation.claim();
1735+
assertEq(owner.balance - balanceBefore, 20 * depositAmount / 10, "unstaked vs claimed amount mismatch");
1736+
assertEq(delegation.getStake(), 5 * depositAmount / 10, "incorrect stake");
1737+
assertEq(delegation.validators().length, 0, "incorrect number of validators");
1738+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1739+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1740+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1741+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1742+
vm.stopPrank();
1743+
vm.startPrank(makeAddr("4"));
1744+
delegation.unstake(lst.balanceOf(makeAddr("4")));
1745+
assertEq(delegation.getStake(), 0, "incorrect stake");
1746+
assertEq(delegation.validators().length, 0, "incorrect number of validators");
1747+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1748+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1749+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1750+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1751+
vm.roll(block.number + delegation.unbondingPeriod());
1752+
balanceBefore = makeAddr("4").balance;
1753+
delegation.claim();
1754+
assertEq(makeAddr("4").balance - balanceBefore, 5 * depositAmount / 10, "unstaked vs claimed amount mismatch");
1755+
assertEq(delegation.getStake(), 0, "incorrect stake");
1756+
assertEq(delegation.validators().length, 0, "incorrect number of validators");
1757+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1758+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1759+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1760+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
17321761
vm.stopPrank();
17331762
}
17341763

test/NonLiquidDelegation.t.sol

+53-26
Original file line numberDiff line numberDiff line change
@@ -1521,7 +1521,7 @@ contract NonLiquidDelegationTest is BaseDelegationTest {
15211521
assertEq(totalStaked, 100 ether, "Incorrect total stake");
15221522
}
15231523

1524-
function test_UnstakeNotTooMuch() public {
1524+
function test_LargeUnstakeUndepositValidators() public {
15251525
uint256 depositAmount = 10_000_000 ether;
15261526
depositFromPool(BaseDelegation(delegation), 2 * depositAmount, DepositMode.Bootstrapping);
15271527
stakers.push(owner);
@@ -1531,33 +1531,17 @@ contract NonLiquidDelegationTest is BaseDelegationTest {
15311531
stakers.push(makeAddr("3"));
15321532
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("4"), 4);
15331533
stakers.push(makeAddr("4"));
1534-
vm.startPrank(makeAddr("2"));
1535-
delegation.unstake(2 * depositAmount);
1534+
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("5"), 5);
1535+
stakers.push(makeAddr("5"));
1536+
vm.startPrank(makeAddr("5"));
1537+
delegation.leavePool(validator(5));
15361538
vm.stopPrank();
1537-
assertEq(delegation.getDeposit(validator(1)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1538-
assertEq(delegation.getDeposit(validator(2)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1539-
assertEq(delegation.getDeposit(validator(3)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1540-
assertEq(delegation.getDeposit(validator(4)), 15 * depositAmount / 10, "validator deposits are decreased equally");
1541-
vm.startPrank(makeAddr("3"));
1542-
delegation.unstake(2 * depositAmount);
1543-
vm.stopPrank();
1544-
assertEq(delegation.getDeposit(validator(1)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1545-
assertEq(delegation.getDeposit(validator(2)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1546-
assertEq(delegation.getDeposit(validator(3)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1547-
assertEq(delegation.getDeposit(validator(4)), 10 * depositAmount / 10, "validator deposits are decreased equally");
1548-
}
1549-
1550-
function test_UnstakeTooMuchUndepositValidators() public {
1551-
uint256 depositAmount = 10_000_000 ether;
1552-
depositFromPool(BaseDelegation(delegation), 2 * depositAmount, DepositMode.Bootstrapping);
1553-
stakers.push(owner);
1554-
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("2"), 2);
1555-
stakers.push(makeAddr("2"));
1556-
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("3"), 3);
1557-
stakers.push(makeAddr("3"));
1558-
joinPool(BaseDelegation(delegation), 2 * depositAmount, makeAddr("4"), 4);
1559-
stakers.push(makeAddr("4"));
15601539
assertEq(delegation.getStake(), 80 * depositAmount / 10, "incorrect stake");
1540+
assertEq(delegation.validators().length, 4, "incorrect number of validators");
1541+
assertEq(delegation.getDeposit(validator(1)), 20 * depositAmount / 10, "validator deposits are decreased equally");
1542+
assertEq(delegation.getDeposit(validator(2)), 20 * depositAmount / 10, "validator deposits are decreased equally");
1543+
assertEq(delegation.getDeposit(validator(3)), 20 * depositAmount / 10, "validator deposits are decreased equally");
1544+
assertEq(delegation.getDeposit(validator(4)), 20 * depositAmount / 10, "validator deposits are decreased equally");
15611545
vm.startPrank(makeAddr("2"));
15621546
delegation.unstake(20 * depositAmount / 10);
15631547
assertEq(delegation.getDeposit(validator(1)), 15 * depositAmount / 10, "validator deposits are decreased equally");
@@ -1587,8 +1571,11 @@ contract NonLiquidDelegationTest is BaseDelegationTest {
15871571
vm.startPrank(makeAddr("4"));
15881572
delegation.unstake(15 * depositAmount / 10);
15891573
assertEq(delegation.getStake(), 25 * depositAmount / 10, "incorrect stake");
1574+
assertEq(delegation.validators().length, 4, "incorrect number of validators");
15901575
assertEq(delegation.getDeposit(validator(1)), 10 * depositAmount / 10, "validator deposit mismatch");
15911576
assertEq(delegation.getDeposit(validator(2)), 10 * depositAmount / 10, "validator deposit mismatch");
1577+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1578+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
15921579
vm.roll(block.number + delegation.unbondingPeriod());
15931580
balanceBefore = makeAddr("4").balance;
15941581
delegation.claim();
@@ -1597,6 +1584,46 @@ contract NonLiquidDelegationTest is BaseDelegationTest {
15971584
assertEq(delegation.validators().length, 2, "incorrect number of validators");
15981585
assertEq(delegation.getDeposit(validator(1)), 125 * depositAmount / 100, "validator deposit mismatch");
15991586
assertEq(delegation.getDeposit(validator(2)), 125 * depositAmount / 100, "validator deposit mismatch");
1587+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1588+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1589+
vm.stopPrank();
1590+
vm.startPrank(owner);
1591+
delegation.unstake(20 * depositAmount / 10);
1592+
assertEq(delegation.getStake(), 5 * depositAmount / 10, "incorrect stake");
1593+
assertEq(delegation.validators().length, 2, "incorrect number of validators");
1594+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1595+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1596+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1597+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1598+
vm.roll(block.number + delegation.unbondingPeriod());
1599+
balanceBefore = owner.balance;
1600+
delegation.claim();
1601+
assertEq(owner.balance - balanceBefore, 20 * depositAmount / 10, "unstaked vs claimed amount mismatch");
1602+
assertEq(delegation.getStake(), 5 * depositAmount / 10, "incorrect stake");
1603+
assertEq(delegation.validators().length, 0, "incorrect number of validators");
1604+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1605+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1606+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1607+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1608+
vm.stopPrank();
1609+
vm.startPrank(makeAddr("4"));
1610+
delegation.unstake(5 * depositAmount / 10);
1611+
assertEq(delegation.getStake(), 0, "incorrect stake");
1612+
assertEq(delegation.validators().length, 0, "incorrect number of validators");
1613+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1614+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1615+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1616+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
1617+
vm.roll(block.number + delegation.unbondingPeriod());
1618+
balanceBefore = makeAddr("4").balance;
1619+
delegation.claim();
1620+
assertEq(makeAddr("4").balance - balanceBefore, 5 * depositAmount / 10, "unstaked vs claimed amount mismatch");
1621+
assertEq(delegation.getStake(), 0, "incorrect stake");
1622+
assertEq(delegation.validators().length, 0, "incorrect number of validators");
1623+
assertEq(delegation.getDeposit(validator(1)), 0, "validator deposit mismatch");
1624+
assertEq(delegation.getDeposit(validator(2)), 0, "validator deposit mismatch");
1625+
assertEq(delegation.getDeposit(validator(3)), 0, "validator deposit mismatch");
1626+
assertEq(delegation.getDeposit(validator(4)), 0, "validator deposit mismatch");
16001627
vm.stopPrank();
16011628
}
16021629

0 commit comments

Comments
 (0)