Platform: Code4rena
Start Date: 18/10/2023
Pot Size: $36,500 USDC
Total HM: 17
Participants: 77
Period: 7 days
Judge: MiloTruck
Total Solo HM: 5
Id: 297
League: ETH
Rank: 74/77
Findings: 1
Award: $8.30
🌟 Selected for report: 0
🚀 Solo Findings: 0
🌟 Selected for report: MrPotatoMagic
Also found by: 0xMosh, 0xPsuedoPandit, 0xhacksmithh, 8olidity, Al-Qa-qa, Baki, Bughunter101, Krace, Stormreckson, T1MOH, Tendency, eeshenggoh, fibonacci, hals, immeas, kutugu, lsaudit, m4k2, mrudenko, okolicodes, phoenixV110, spark, twicek, xAriextz
8.3007 USDC - $8.30
https://github.com/open-dollar/od-contracts/blob/v1.5.5-audit/src/contracts/proxies/ODProxy.sol#L26
the execute function in the ODProxy
contract has a payable modifier, which implies that it can receive Ether. However, the function utilizes delegatecall to execute code in another contract (Action contracts like BasicAction
), which does not forward the Ether sent to the execute function. As a result, any Ether sent to this function becomes trapped within the contract.
// ODProxy::execute // @audit [M: payable function with no handled ETH] function execute( address _target, bytes memory _data ) external payable onlyOwner returns (bytes memory _response) { if (_target == address(0)) revert TargetAddressRequired(); bool _succeeded; (_succeeded, _response) = _target.delegatecall(_data); if (!_succeeded) { revert TargetCallFailed(_response); } }
Manual Review
Since The protocol doesn't depend on the native ETH coin, the payable modifier should be removed from the execute function in the ODProxy
contract.
ETH-Transfer
#0 - c4-pre-sort
2023-10-26T06:24:25Z
raymondfam marked the issue as sufficient quality report
#1 - c4-pre-sort
2023-10-26T06:24:35Z
raymondfam marked the issue as duplicate of #172
#2 - c4-judge
2023-11-02T05:16:51Z
MiloTruck changed the severity to QA (Quality Assurance)
#3 - c4-judge
2023-11-03T18:00:04Z
MiloTruck marked the issue as grade-b