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: 124/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#L162-L176 https://github.com/code-423n4/2023-11-kelp/blob/main/src/LRTDepositPool.sol#L71-L89
The duplicate node delegator addresses in the nodeDelegatorQueue
leads to inaccurate calculations of asset amount distribution data of NDCs
, and eigenLayer
.
This issue is unrecoverable, as the current implementation lacks a mechanism to undo the addition of duplicates.
The addNodeDelegatorContractToQueue
function of the LRTDepositPool
contract restricts to only the LRT admin to add new node delegator contract addresses by passing the nodeDelegatorContracts
array.
File: src/LRTDepositPool.sol 162: function addNodeDelegatorContractToQueue(address[] calldata nodeDelegatorContracts) external onlyLRTAdmin {
However, this function does not check check whether the given node delegator contract addresses are already added in the nodeDelegatorQueue
.
File: src/LRTDepositPool.sol 168: for (uint256 i; i < length;) { 169: UtilLib.checkNonZeroAddress(nodeDelegatorContracts[i]); 170: nodeDelegatorQueue.push(nodeDelegatorContracts[i]); 171: emit NodeDelegatorAddedinQueue(nodeDelegatorContracts[i]); 172: unchecked { 173: ++i; 174: } 175: }
As a result, if the LRT admin mistakenly adds node delegator contract addresses that are already included, the calculation of asset amount distribution data of NDCs
, and eigenLayer
from the getAssetDistributionData
function will be incorrect.
File: src/LRTDepositPool.sol 81: uint256 ndcsCount = nodeDelegatorQueue.length; 82: for (uint256 i; i < ndcsCount;) { 83: assetLyingInNDCs += IERC20(asset).balanceOf(nodeDelegatorQueue[i]); 84: assetStakedInEigenLayer += INodeDelegator(nodeDelegatorQueue[i]).getAssetBalance(asset); 85: unchecked { 86: ++i; 87: } 88: }
Furthermore the result of that calculation will always incorrect since implementation lacks functionality to remove duplicates from the nodeDelegatorQueue
.
Foundry
nodeDelegatorQueue
array is unique.For example, introducing the mapping (address => bool) isNodeDelegatorAdded;
addNodeDelegatorContractToQueue
function (L169-171, and L174).File: src/LRTDepositPool.sol 168: for (uint256 i; i < length;) { 169: if (isNodeDelegatorAdded[nodeDelegatorContracts[i]]) { 170: revert AlredayAddedNodeDelegator(); 171: } 172: UtilLib.checkNonZeroAddress(nodeDelegatorContracts[i]); 173: nodeDelegatorQueue.push(nodeDelegatorContracts[i]); 174: isNodeDelegatorAdded[nodeDelegatorContracts[i]] = true; 175: emit NodeDelegatorAddedinQueue(nodeDelegatorContracts[i]); 176: unchecked { 177: ++i; 178: } 179: }
This improvement will ensure accurate calculations in the getAssetDistributionData
function.
The recommendation should be considered in alignment with the project's business requirements, and any updates should be tested to ensure they meet the specific needs of the project.
Invalid Validation
#0 - c4-pre-sort
2023-11-15T23:49:12Z
raymondfam marked the issue as insufficient quality report
#1 - c4-pre-sort
2023-11-15T23:49:42Z
raymondfam marked the issue as duplicate of #36
#2 - c4-judge
2023-11-29T21:35:52Z
fatherGoose1 changed the severity to QA (Quality Assurance)
#3 - c4-judge
2023-11-29T21:36:49Z
fatherGoose1 marked the issue as grade-b