Platform: Code4rena
Start Date: 10/11/2023
Pot Size: $28,000 USDC
Total HM: 5
Participants: 185
Period: 5 days
Judge: 0xDjango
Id: 305
League: ETH
Rank: 140/185
Findings: 1
Award: $2.76
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: m_Rassska
Also found by: 0x1337, 0xAadi, 0xHelium, 0xLeveler, 0xblackskull, 0xbrett8571, 0xepley, 0xffchain, 0xluckhu, 0xmystery, 0xrugpull_detector, 0xvj, ABAIKUNANBAEV, Aamir, AerialRaider, Amithuddar, Bauchibred, Bauer, CatsSecurity, Cryptor, Daniel526, Draiakoo, Eigenvectors, ElCid, GREY-HAWK-REACH, Inspecktor, Juntao, King_, LinKenji, Madalad, MaslarovK, Matin, MatricksDeCoder, McToady, Noro, PENGUN, Pechenite, Phantasmagoria, RaoulSchaffranek, SBSecurity, SandNallani, Shaheen, Soul22, Stormreckson, T1MOH, Tadev, TeamSS, TheSchnilch, Topmark, Tumelo_Crypto, Udsen, Yanchuan, ZanyBonzy, _thanos1, adeolu, adriro, alexfilippov314, almurhasan, amaechieth, anarcheuz, ayden, baice, bareli, boredpukar, bronze_pickaxe, btk, cartlex_, catellatech, chaduke, cheatc0d3, circlelooper, codynhat, crack-the-kelp, critical-or-high, debo, deepkin, desaperh, dipp, eeshenggoh, evmboi32, ge6a, gesha17, glcanvas, gumgumzum, hals, hihen, hunter_w3b, jasonxiale, joaovwfreire, ke1caM, leegh, lsaudit, marchev, merlinboii, niser93, osmanozdemir1, paritomarrr, passion, pep7siup, phoenixV110, pipidu83, poneta, ro1sharkm, rouhsamad, rvierdiiev, sakshamguruji, seerether, shealtielanz, soliditytaker, spark, squeaky_cactus, stackachu, supersizer0x, tallo, taner2344, turvy_fuzz, twcctop, ubl4nk, wisdomn_, xAriextz, zach, zhaojie, zhaojohnson, ziyou-
2.7592 USDC - $2.76
https://github.com/code-423n4/2023-11-kelp/blob/main/src/LRTDepositPool.sol#L183-L197 https://github.com/code-423n4/2023-11-kelp/blob/main/src/NodeDelegator.sol#L74-L89
The function attempts to transfer a specified amount of an asset to a contract. However, there is no check to ensure that the current contract has sufficient balance of the asset before attempting the transfer. If the specified amount is greater than the contract's current balance of the asset, the transfer will fail and the entire transaction will revert. Even though there is a check which reverts if the transfer fails, the transaction will revert before this, when the external call fails due to insufficient amount of tokens and the gas used to this moment will still be consumed.
I made slight change in the test below which shows the possibility of transfer attempt with amount bigger than the current balance:
function test_TransferAssetToNodeDelegator() external { // deposit 3 ether rETH vm.startPrank(alice); rETH.approve(address(lrtDepositPool), 3 ether); lrtDepositPool.depositAsset(address(rETH), 3 ether); vm.stopPrank(); uint256 indexOfNodeDelegatorContractOneInNDArray; address[] memory nodeDelegatorArray = lrtDepositPool.getNodeDelegatorQueue(); for (uint256 i = 0; i < nodeDelegatorArray.length; i++) { if (lrtDepositPool.nodeDelegatorQueue(i) == nodeDelegatorContractOne) { indexOfNodeDelegatorContractOneInNDArray = i; break; } } // transfer 4 ether rETH to node delegator contract one vm.startPrank(manager); lrtDepositPool.transferAssetToNodeDelegator(indexOfNodeDelegatorContractOneInNDArray, address(rETH), 4 ether); vm.stopPrank(); assertEq(rETH.balanceOf(address(lrtDepositPool)), 2 ether, "Asset amount in lrtDepositPool is incorrect"); assertEq(rETH.balanceOf(nodeDelegatorContractOne), 1 ether, "Asset is not transferred to node delegator"); }
resulting in this:
[FAIL. Reason: ERC20: transfer amount exceeds balance] test_TransferAssetToNodeDelegator() (gas: 232868)
Manual Review
I recommend to add the following check to ensure that the contract has sufficient balance before attempting the transfer.
uint256 balance = IERC20(asset).balanceOf(address(this)); require(balance >= amount, "Insufficient balance");
Token-Transfer
#0 - c4-pre-sort
2023-11-15T21:52:47Z
raymondfam marked the issue as insufficient quality report
#1 - c4-pre-sort
2023-11-15T21:52:51Z
raymondfam marked the issue as primary issue
#2 - c4-pre-sort
2023-11-15T21:53:34Z
raymondfam marked the issue as duplicate of #69
#3 - c4-judge
2023-11-29T20:58:12Z
fatherGoose1 changed the severity to QA (Quality Assurance)
#4 - c4-judge
2023-11-29T20:58:45Z
fatherGoose1 marked the issue as grade-b