Skip to content

Commit f43ae3d

Browse files
authored
Merge pull request #1004 from ryzhak/fix/1001
Fix staking migration
2 parents 4097072 + c09cf21 commit f43ae3d

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

packages/contracts/migrations/development/Deploy002_Staking.s.sol

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,10 @@ contract Deploy002_Staking is Script, DiamondTestHelper {
9898
stakingFacet.setGovernancePerBlock(0.2 ether); // 0.2 reward token minted per block
9999
stakingFacet.setGovernanceTreasuryDivider(5); // `100 / 5 = 20%` extra reward tokens minted for treasury
100100
stakingFacet.setStakingRewardToken(address(rewardToken)); // reward token address
101-
stakingFacet.setStakingStartBlock(block.number); // activate staking from current block
101+
stakingFacet.setStakingStartBlock(block.number + 10); // activate staking 10 blocks later
102102
stakingFacet.createStakingPool( // add a new staking pool
103103
100, // allocation points
104-
IERC20(stakeToken), // staking token
105-
true // whether to update all pools
104+
IERC20(stakeToken) // staking token
106105
);
107106

108107
// stop sending admin transactions

packages/contracts/migrations/mainnet/Deploy002_Staking.s.sol

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,10 @@ contract Deploy002_Staking is Script, DiamondTestHelper {
7373
stakingFacet.setGovernancePerBlock(0.2 ether); // 0.2 reward token minted per block
7474
stakingFacet.setGovernanceTreasuryDivider(5); // `100 / 5 = 20%` extra reward tokens minted for treasury
7575
stakingFacet.setStakingRewardToken(ubqToken); // reward token address
76-
stakingFacet.setStakingStartBlock(block.number); // activate staking from current block
76+
stakingFacet.setStakingStartBlock(block.number + 10); // activate staking 10 blocks later
7777
stakingFacet.createStakingPool( // add a new staking pool
7878
100, // allocation points
79-
IERC20(lusdUusdLpToken), // staking token
80-
true // whether to update all pools
79+
IERC20(lusdUusdLpToken) // staking token
8180
);
8281

8382
// Stop sending owner transactions

packages/contracts/src/dollar/libraries/LibStaking.sol

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ library LibStaking {
295295

296296
PoolInfo storage pool = stakingStore.poolInfo[poolId];
297297
UserInfo storage user = stakingStore.userInfo[poolId][msg.sender];
298+
299+
require(pool.allocationPoints > 0, "Pool disabled");
300+
298301
updateStakingPool(poolId);
299302
if (user.amount > 0) {
300303
uint256 pending = user
@@ -442,6 +445,7 @@ library LibStaking {
442445
newGovernanceBonusEndBlock >= block.number,
443446
"Bonus end block can't be in the past"
444447
);
448+
massUpdateStakingPools();
445449
StakingStorage storage stakingStore = stakingStorage();
446450
stakingStore.bonusEndBlock = newGovernanceBonusEndBlock;
447451
emit GovernanceBonusEndBlockSet(newGovernanceBonusEndBlock);
@@ -454,6 +458,7 @@ library LibStaking {
454458
function setGovernanceBonusMultiplier(
455459
uint256 newGovernanceBonusMultiplier
456460
) internal {
461+
massUpdateStakingPools();
457462
StakingStorage storage stakingStore = stakingStorage();
458463
stakingStore.governanceBonusMultiplier = newGovernanceBonusMultiplier;
459464
emit GovernanceBonusMultiplierSet(newGovernanceBonusMultiplier);
@@ -467,6 +472,7 @@ library LibStaking {
467472
*/
468473
function setGovernancePerBlock(uint256 newGovernancePerBlock) internal {
469474
require(newGovernancePerBlock >= 0.0001 ether, "Rewards are too small");
475+
massUpdateStakingPools();
470476
StakingStorage storage stakingStore = stakingStorage();
471477
stakingStore.governancePerBlock = newGovernancePerBlock;
472478
emit GovernancePerBlockSet(newGovernancePerBlock);
@@ -482,6 +488,7 @@ library LibStaking {
482488
function setGovernanceTreasuryDivider(
483489
uint256 newGovernanceTreasuryDivider
484490
) internal {
491+
massUpdateStakingPools();
485492
StakingStorage storage stakingStore = stakingStorage();
486493
stakingStore.governanceTreasuryDivider = newGovernanceTreasuryDivider;
487494
emit GovernanceTreasuryDividerSet(newGovernanceTreasuryDivider);
@@ -508,8 +515,11 @@ library LibStaking {
508515
* @param newStartBlock Block number when staking should be active
509516
*/
510517
function setStakingStartBlock(uint256 newStartBlock) internal {
511-
require(newStartBlock >= block.number, "Can't start in the past");
512518
StakingStorage storage stakingStore = stakingStorage();
519+
520+
require(newStartBlock >= block.number, "Can't start in the past");
521+
require(newStartBlock > stakingStore.startBlock, "Must be greater than the previous start block");
522+
513523
stakingStore.startBlock = newStartBlock;
514524
emit StakingStartBlockSet(newStartBlock);
515525
}

packages/contracts/test/diamond/facets/StakingFacet.t.sol

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,20 @@ contract StakingFacetTest is DiamondTestSetup {
254254
assertEq(poolInfo2.lastRewardBlock, 11);
255255
}
256256

257+
function testStake_ShouldRevert_IfPoolHasZeroAllocationPoints() public {
258+
// admin pool allocation points to 0
259+
vm.startPrank(admin);
260+
stakingFacet.updateStakingPool(
261+
0, // pool id
262+
0 // allocation points
263+
);
264+
vm.stopPrank();
265+
266+
vm.prank(user);
267+
vm.expectRevert("Pool disabled");
268+
stakingFacet.stake(0, 50 ether);
269+
}
270+
257271
function testStake_ShouldStakeTokens() public {
258272
// user stakes 50 STK
259273
vm.prank(user);
@@ -350,7 +364,7 @@ contract StakingFacetTest is DiamondTestSetup {
350364
* Step 1, admin creates 3 staking pools
351365
* - Pool 1: 100 allocation points
352366
* - Pool 2: 300 allocation points
353-
* - Pool 3: 0 allocation points
367+
* - Pool 3: 600 allocation points
354368
*
355369
* Step 2
356370
* - user stakes 50 STK in `Pool 1`
@@ -362,9 +376,9 @@ contract StakingFacetTest is DiamondTestSetup {
362376
* Step 4, users unstake half of the tokens
363377
*
364378
* Step 5, assert that:
365-
* - user gets 2.5 reward tokens (25% pool allocation)
366-
* - user2 gets 7.5 reward tokens (75% pool allocation)
367-
* - user3 gets 0 reward tokens (0% pool allocation)
379+
* - user gets 1 reward token (10% pool allocation)
380+
* - user2 gets 3 reward tokens (30% pool allocation)
381+
* - user3 gets 6 reward tokens (60% pool allocation)
368382
*/
369383
function testUnstake_ShouldUnstakeTokens_WhenMultipleUsersUnstakeFromMultiplePools()
370384
public
@@ -379,7 +393,7 @@ contract StakingFacetTest is DiamondTestSetup {
379393
stakeToken
380394
);
381395
stakingFacet.createStakingPool(
382-
0, // allocation points
396+
600, // allocation points
383397
stakeToken
384398
);
385399
vm.stopPrank();
@@ -462,29 +476,29 @@ contract StakingFacetTest is DiamondTestSetup {
462476
userInfo = stakingFacet.getStakingUserInfo(0, user);
463477
poolInfo = stakingFacet.getStakingPoolInfo(0);
464478
assertEq(poolInfo.lastRewardBlock, 11);
465-
assertEq(rewardToken.balanceOf(user), 2.5 ether);
479+
assertEq(rewardToken.balanceOf(user), 1 ether);
466480
assertEq(userInfo.amount, 25 ether);
467-
assertEq(userInfo.rewardDebt, 1.25 ether);
481+
assertEq(userInfo.rewardDebt, 0.5 ether);
468482
assertEq(poolInfo.amount, 25 ether);
469483
assertEq(stakeToken.balanceOf(user), 75 ether);
470484

471485
// after (user2)
472486
userInfo2 = stakingFacet.getStakingUserInfo(1, user2);
473487
poolInfo2 = stakingFacet.getStakingPoolInfo(1);
474488
assertEq(poolInfo2.lastRewardBlock, 11);
475-
assertEq(rewardToken.balanceOf(user2), 7.5 ether);
489+
assertEq(rewardToken.balanceOf(user2), 3 ether);
476490
assertEq(userInfo2.amount, 25 ether);
477-
assertEq(userInfo2.rewardDebt, 3.75 ether);
491+
assertEq(userInfo2.rewardDebt, 1.5 ether);
478492
assertEq(poolInfo2.amount, 25 ether);
479493
assertEq(stakeToken.balanceOf(user2), 75 ether);
480494

481495
// after (user3)
482496
userInfo3 = stakingFacet.getStakingUserInfo(2, user3);
483497
poolInfo3 = stakingFacet.getStakingPoolInfo(2);
484498
assertEq(poolInfo3.lastRewardBlock, 11);
485-
assertEq(rewardToken.balanceOf(user3), 0);
499+
assertEq(rewardToken.balanceOf(user3), 6 ether);
486500
assertEq(userInfo3.amount, 25 ether);
487-
assertEq(userInfo3.rewardDebt, 0);
501+
assertEq(userInfo3.rewardDebt, 3 ether);
488502
assertEq(poolInfo3.amount, 25 ether);
489503
assertEq(stakeToken.balanceOf(user3), 75 ether);
490504
}
@@ -813,6 +827,14 @@ contract StakingFacetTest is DiamondTestSetup {
813827
stakingFacet.setStakingStartBlock(0);
814828
}
815829

830+
function testSetStakingStartBlock_ShouldRevert_IfStartBlockIsLessOrEqualToCurrentStartBlock()
831+
public
832+
{
833+
vm.prank(admin);
834+
vm.expectRevert("Must be greater than the previous start block");
835+
stakingFacet.setStakingStartBlock(1);
836+
}
837+
816838
function testSetStakingStartBlock_ShouldUpdateStakingStartBlock() public {
817839
(, , , , , , , uint256 oldStartBlock) = stakingFacet
818840
.getStakingSettings();

0 commit comments

Comments
 (0)