Platform: Code4rena
Start Date: 07/08/2023
Pot Size: $36,500 USDC
Total HM: 11
Participants: 125
Period: 3 days
Judge: alcueca
Total Solo HM: 4
Id: 274
League: ETH
Rank: 109/125
Findings: 1
Award: $4.23
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: RED-LOTUS-REACH
Also found by: 0x3b, 0x4non, 0xCiphky, 0xDING99YA, 0xDetermination, 0xE1, 0xG0P1, 0xStalin, 0xWaitress, 0xbrett8571, 0xhacksmithh, 0xkazim, 0xmuxyz, 0xweb3boy, 14si2o_Flint, AlexCzm, Alhakista, Bube, Bughunter101, Deekshith99, Eeyore, Giorgio, HChang26, InAllHonesty, JP_Courses, KmanOfficial, MatricksDeCoder, Mike_Bello90, MrPotatoMagic, Naubit, QiuhaoLi, RHaO-sec, Raihan, Rolezn, SUPERMAN_I4G, Shubham, Silverskrrrt, Strausses, T1MOH, Topmark, Tripathi, Watermelon, _eperezok, aakansha, auditsea, audityourcontracts, ayden, carlos__alegre, castle_chain, cducrest, ch0bu, d23e, deadrxsezzz, deth, devival, erebus, fatherOfBlocks, halden, hassan-truscova, hpsb, hunter_w3b, imkapadia, immeas, jat, kaden, kaveyjoe, klau5, koxuan, kutugu, ladboy233, lanrebayode77, leasowillow, lsaudit, markus_ether, matrix_0wl, merlin, nemveer, ni8mare, nonseodion, oakcobalt, owadez, p_crypt0, pipidu83, piyushshukla, popular00, ppetrov, rjs, sandy, sl1, supervrijdag, tay054, thekmj, wahedtalash77, windhustler, zhaojie
4.2289 USDC - $4.23
https://github.com/code-423n4/2023-08-verwa/blob/main/src/LendingLedger.sol#L188-L199
Rewards can be set to any amount for different epochs, but there are no checks to enforce if there is enough CANTO to back up the total allocated rewards for the specified ephocs.
The consequence of not enforcing that the rewards are really fully back up with CANTO tokens are that epochs can run out of rewards before all the users have claimed their corresponding rewards, thus, some users will lost their rewards.
The only way this contract can receive CANTO tokens is by directly depositing them using the LendingLedger::receive()
, but this function also doesn't validate if the amount of CANTO tokens been deposited are enough to fully back up the total rewards allocated for all the epochs for all the users.
The most optimal approach is to ensure that all the allocated rewards for all the epochs are fully backed up by CANTO tokens, the contract should have a 100% of the rewards to be distributed, not more not less.
Manual Audit
+ function setRewards(....) .... payable { + uint256 totalAllocatedRewards = 0; for(...){ ... + totalAllocatedRewards += _amountPerEpoch; } + //If msg.value is greather than the total allocated rewards, refund the excess + if(msg.value > totalAllocatedRewards) { + uint refundExcess = msg.value - totalAllocatedRewards; + (bool success, ) = msg.sender.call{refundExcess}(""); + require(success, "Failed to send CANTO"); + } else { + revert("Not enough CANTO tokens were sent to back up all the allocated rewards for all the epochs"); + } }
Invalid Validation
#0 - c4-pre-sort
2023-08-13T02:51:43Z
141345 marked the issue as primary issue
#1 - 141345
2023-08-13T02:52:19Z
privileged role mistake
QA might be more appropriate.
#2 - c4-sponsor
2023-08-16T14:57:58Z
OpenCoreCH marked the issue as sponsor acknowledged
#3 - OpenCoreCH
2023-08-16T14:58:18Z
True, but intended behaviour, as governance should send CANTO to the contract separately.
#4 - c4-judge
2023-08-24T21:28:56Z
alcueca changed the severity to QA (Quality Assurance)
#5 - c4-judge
2023-08-24T21:29:00Z
alcueca marked the issue as grade-b