The Governance system allows proposals to be created with ETH values (transfers), but the current implementation makes it impossible to execute such proposals due to limitations in the ETH transfer flow between contracts.
The issue arises from the interaction between the Governance
and TimelockController
contracts.
Proposals can be created with non-zero ETH values:
However, the execution flow is restricted:
The execution fails because:
Only Governance can call TimelockController.executeBatch
(EXECUTOR_ROLE
)
Governance.execute
is not payable, so it cannot receive or forward ETH
TimelockController
cannot send ETH via call{value}
without having ETH balance
No mechanism exists for TimelockController
to receive ETH from other source
High: TimelockController.executeBatch
attempts to send ETH using call{value: values[i]}
, but since TimelockController
does not hold ETH, this transfer fails. Proposals can never be executed.
Redesign the system's ETH transfer mechanism since the current design cannot support ETH transfers regardless of TimelockController's balance. The core issue is the flow that prevents ETH from reaching TimelockController
. Consider adding a way for TimelockController
to receive and manage ETH.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.