Platform: Code4rena
Start Date: 28/09/2023
Pot Size: $36,500 USDC
Total HM: 5
Participants: 115
Period: 6 days
Judge: 0xDjango
Total Solo HM: 1
Id: 290
League: ETH
Rank: 106/115
Findings: 1
Award: $4.37
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: Bauchibred
Also found by: 0x3b, 0xDetermination, 0xMosh, 0xScourgedev, 0xTheC0der, 0xTiwa, 0xWaitress, 0xdice91, 0xfusion, 0xpiken, 0xprinc, 0xweb3boy, ArmedGoose, Aymen0909, Breeje, Brenzee, Daniel526, DavidGiladi, DeFiHackLabs, Flora, Fulum, HChang26, Hama, IceBear, J4X, Krace, KrisApostolov, Maroutis, Mirror, MohammedRizwan, Norah, PwnStars, SPYBOY, TangYuanShen, Testerbot, ThreeSigma, Tricko, al88nsk, alexweb3, ast3ros, berlin-101, bin2chen, blutorque, btk, d3e4, deth, e0d1n, ether_sky, ge6a, gkrastenov, glcanvas, hals, imare, inzinko, jkoppel, jnforja, joaovwfreire, josephdara, kutugu, lotux, lsaudit, mahdirostami, merlin, n1punp, nadin, neumo, nisedo, nobody2018, oakcobalt, orion, peanuts, pep7siup, pina, ptsanev, rokinot, rvierdiiev, said, santipu_, sashik_eth, seerether, squeaky_cactus, terrancrypt, tonisives, twicek, vagrant, xAriextz, y4y
4.3669 USDC - $4.37
Inaccuracy of block.number
will affect the calculation of accrueTokens()
. That will affect functions like PrimeLiquidityProvider.sol#_setTokenDistributionSpeed()
, Prime.sol#accrueInterest()
.
Blockchains where this code will be deployed: BNB Chain, Ethereum mainnet, Arbitrum, Polygon zkEVM, opBNB.
block.number
works reasonably well on Ethereum's mainnet, where new blocks are produced at ~12s
intervals, it can become problematic on other chains, especially L2 networks, where blocks can be produced much more frequently, potentially every few seconds, and/or have variable rates of production. This can cause inconsistencies in the timing mechanism, therefore significantly affecting the time-weighted aspect to the PrimeLiquidityProvider.sol#accrueTokens()
function.block.number
returns the most recently synced L1 block number. Once per minute, the block number in the Sequencer
is synced to the actual L1 block number. Using block.number
as a clock can lead to inaccurate timing.Polygon zkEVM
, opBNB
.276: function getBlockNumber() public view virtual returns (uint256) { 277: return block.number; 278: } ---SNIP--- 249: function accrueTokens(address token_) public { ---SNIP--- 254: uint256 blockNumber = getBlockNumber(); 255: uint256 deltaBlocks = blockNumber - lastAccruedBlock[token_]; // @audit do not use of block.number on L2 to calculate this
Manual review
Use block.timestamp
rather than block.number
.
Timing
#0 - c4-pre-sort
2023-10-05T00:49:37Z
0xRobocop marked the issue as duplicate of #132
#1 - c4-judge
2023-10-31T19:34:39Z
fatherGoose1 changed the severity to QA (Quality Assurance)
#2 - c4-judge
2023-11-03T01:43:00Z
fatherGoose1 marked the issue as grade-b