Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/stake/LayerEdgeStaking.sol
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,7 @@ contract LayerEdgeStaking is

function _stake(uint256 amount, address userAddr, bool isNative) internal {
require(amount > 0, "Cannot stake zero amount");
require(nextJoinId <= MAX_USERS, "Max users reached");

UserInfo storage user = users[userAddr];

Expand Down Expand Up @@ -892,9 +893,9 @@ contract LayerEdgeStaking is
}
// Handle case where Tier 2 count stays the same
else if (isRemoval) {
_findAndRecordTierChange(new_t1 + new_t2, n);
} else if (!isRemoval) {
_findAndRecordTierChange(old_t1 + old_t2, n);
} else if (!isRemoval) {
_findAndRecordTierChange(new_t1 + new_t2, n);
}
}
}
Expand Down
27 changes: 27 additions & 0 deletions test/stake/LayerEdgeStakingTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2659,4 +2659,31 @@ contract LayerEdgeStakingTest is Test {
);
vm.stopPrank();
}

function test__checkBoundariesAndRecord_downgradingIssue() public {
for (uint256 i = 1; i <= 15; i++) {
address staker = makeAddr(string(abi.encodePacked("staker", i))); //staker 1 - 15
vm.prank(admin);
token.transfer(staker, MIN_STAKE);

vm.startPrank(staker);
token.approve(address(staking), MIN_STAKE);
staking.stake(MIN_STAKE);
vm.stopPrank();
}

address staker7 = makeAddr(string(abi.encodePacked("staker", uint256(7))));

(, LayerEdgeStaking.Tier expectedTier,,, LayerEdgeStaking.TierEvent[] memory tierHistory) =
staking.getAllInfoOfUser(staker7);

LayerEdgeStaking.Tier lastUpdateTier = tierHistory[tierHistory.length - 1].to;

//From audit report:
// expectedTier is the tier calculated from rank using getCurrentTier, while lastUpdateTier is the last update of the tier history which will be used to get the apy for reward cal for the current period
//vm.assertLt(uint(expectedTier), uint(lastUpdateTier));

//Fix
assertEq(uint256(expectedTier), uint256(lastUpdateTier));
}
}