Proposal 50 attempts to donate 51 ETH to Unchain Ukraine through the Rescue Toadz project.
Rescue Toadz gamifies the donation process, enabling users to 'capture' minted Toadz by matching or surpassing the previous donation.
The transaction included in this proposal attempts to 'capture' 7 Toadz, including one donation of 40 ETH, one donation of 10 ETH, and 5 donations of 0.2 ETH.
The proposal description is accurate and does not attempt to deceive the DAO. The charity address is correct and cannot be updated.
Note: While there is no attempt to deceive the DAO, the proposal transaction will fail due to a technical oversight. See Execution Risks for more information.
The transaction included in the proposal will fail to execute. While it only takes one REVERT
to stop execution and revert state changes, there are multiple possible execution failures.
Included among these are one unavoidable revert that will cause the transaction to fail with 100% certainty AND two possible reverts.
- The capture function calls _safeTransferFrom to transfer the Rescue Toad to the DAO. This call will revert because the Nouns DAO executor does not expose an onERC1155Received function, which is called in the _doSafeTransferAcceptanceCheck. This cannot be remedied prior to execution.
- At time of writing, Rescue Toad #15 does not exist. This has the potential to cause the first revert, but can be remedied prior to execution by minting Toad #15.
- Anyone can cause the proposal transaction to fail by donating an amount greater than the DAO's donation to any of the 7 Rescue Toadz listed in the proposal.
The owner of the Rescue Toadz contract has the ability to cause the proposal transaction to fail by pausing the contract prior to execution.
No
Follow the steps in the README to simulate proposal 50.
Note: If you would like to test the unavoidable revert, you must mint Toad #15 on the fork (if not yet minted). To accomplish this, paste the following code after the fork is created in simulate-proposal.ts:
const FORK_MINTER_ADDRESS = '0x000000000000000000000000000000000000dead';
// Impersonate an account with ETH & mint Toad #15
await fork.send('hardhat_impersonateAccount', [FORK_MINTER_ADDRESS]);
const minter = fork.getSigner(FORK_MINTER_ADDRESS);
await minter.sendTransaction({
to: '0x57605D3A2C7726e9A7801307AF0C893bA5199F66',
value: EthersBN.from(10).pow(16),
data: '0xa0712d68000000000000000000000000000000000000000000000000000000000000000F', // 15
});
await fork.send('hardhat_stopImpersonatingAccount', [FORK_MINTER_ADDRESS]);