Platform: Code4rena
Start Date: 01/12/2022
Pot Size: $26,900 USDC
Total HM: 3
Participants: 19
Period: 4 days
Judge: GalloDaSballo
Id: 188
League: ETH
Rank: 8/19
Findings: 1
Award: $1,309.61
🌟 Selected for report: 0
🚀 Solo Findings: 0
1309.6144 USDC - $1,309.61
In CrossChainRelayerArbitrum.processCalls
, msg.sender
is set as the address to receive any refund (both excess fee refund and call value refund) in the createRetryableTicket
call. Arbitrium credits the refunded value to L2 balance, so if the user doesn't control the refund address on L2, or the code at the address doesn't support ETH withdrawals, then the funds are lost.
This situation is possible when the caller is a contract. It may be impossible to deploy a new contract at that same address on Arbitrium to claim the funds in some cases, such as:
uint256 _ticketID = inbox.createRetryableTicket{value: msg.value}( address(executor), 0, _maxSubmissionCost, msg.sender, msg.sender, _gasLimit, _gasPriceBid, _data );
Manual Review
processCalls
may accept a new parameter refundAddress
and pass that address as excessFeeRefundAddress
and callValueRefundAddress
in the createRetryableTicket
call. This would make it the caller's responsibility to send a proper address for refund.
Alternatively, processCalls
call can be restricted to EOAs, although that would be very limiting for applications.
#0 - c4-judge
2022-12-11T21:00:26Z
GalloDaSballo marked the issue as duplicate of #63
#1 - c4-judge
2022-12-26T23:45:09Z
GalloDaSballo marked the issue as satisfactory