[H-2] In Function:deposit, stakedAsset[receiver] uses = to update insteadof +=, incorrectly updating the state of stakedAsset[receiver]
Description
In Function:deposit, stakedAsset[receiver] uses = to update insteadof +=:
function deposit(uint256 assets, address receiver) public override returns (uint256) {
require(receiver != address(0));
if (block.timestamp >= eventStartDate) {
revert eventStarted();
}
......
@> stakedAsset[receiver] = stakeAsset;
......
}
Impact
Assume there is no fee.
If userA first deposits 5 ether into the contract, and then deposits another 1 ether, stakedAsset[userA] now equals 1 ether instead of 6 ether.
Proof of Concepts
Run the test funtion below in test/briVault.t.sol:
function test_incorrect_stakedAsset_update() public {
uint256 base = 10000;
uint256 expected_stakedAsset;
vm.startPrank(user1);
mockToken.approve(address(briVault), 5 ether);
briVault.deposit(5 ether, user1);
expected_stakedAsset = 5 ether - (5 ether * participationFeeBsp) / base;
assertEq(briVault.stakedAsset(user1), expected_stakedAsset);
mockToken.approve(address(briVault), 5 ether);
briVault.deposit(5 ether, user1);
expected_stakedAsset += 5 ether - (5 ether * participationFeeBsp) / base;
assertLt(briVault.stakedAsset(user1), expected_stakedAsset);
console.log("actual_stakedAsset", briVault.stakedAsset(user1));
}
Recommended mitigation
function deposit(uint256 assets, address receiver) public override returns (uint256) {
require(receiver != address(0));
if (block.timestamp >= eventStartDate) {
revert eventStarted();
}
......
- stakedAsset[receiver] = stakeAsset;
+ stakedAsset[receiver] += stakeAsset;
......
}