The execute() function in the governance contract is responsible for executing proposals, including those that may involve sending Ether. However, it lacks the payable modifier, meaning the function cannot send Ether as part of a proposal execution.
Additionally, execution is delegated to the Timelock contract, which does not have a receive() function. This means that if a proposal attempts to transfer Ether, the transaction will fail because the contract cannot receive Ether so no ether will be in the contract.
The execute() function is not payable, which means it cannot send Ether as part of a proposal execution. If a proposal involves transferring Ether to a contract or an address, the execution will fail.
Since execution is passed to _timelock.executeBatch(), the Timelock contract must hold Ether. However, the Timelock contract does not implement receive() or fallback() to accept Ether, leading to transaction failures.
Even if the proposal were executed directly on the Timelock contract by an admin with executor role, it would not update the proposal executed state in the governance contract.
This means the proposal state would indicate that it has not been executed in governance, causing inconsistencies.
Proposals that involve sending ETH will fail, rendering governance unable to execute critical transactions.
Manual Review
Modify the execute() function to include the payable modifier.
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.