-
-
Save k1rill-fedoseev/931f56f89c5bca1cbfada30c8d074220 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: CC0-1.0 | |
pragma solidity 0.8.15; | |
import "forge-std/Test.sol"; | |
import "@openzeppelin/contracts/governance/TimelockController.sol"; | |
import "../src/proxy/EIP1967Proxy.sol"; | |
contract VerifyGnosisSafeTx_Gov32 is Test { | |
address constant bob = address(0xB0B195aEFA3650A6908f15CdaC7D92F8a5791B0B); | |
address constant timelockOptimism = address(0xbe7D4E55D80fC3e67D80ebf988eB0E551cCA4eB7); | |
function testOptimism() external { | |
vm.createSelectFork("https://rpc.ankr.com/optimism"); | |
address executor = address(0x39F0bD56c1439a22Ee90b4972c16b7868D161981); | |
address from = address(0x14fc6a1a996A2EB889cF86e5c8cD17323bC85290); | |
address to = address(0xA1dabEF33b3B82c7814B6D82A79e50F4AC44102B); | |
bytes memory data = hex"8d80ff0a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f200b0b195aefa3650a6908f15cdac7d92f8a5791b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024704b6c02000000000000000000000000be7d4e55d80fc3e67d80ebf988eb0e551cca4eb700b0b195aefa3650a6908f15cdac7d92f8a5791b0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024f2fde38b000000000000000000000000be7d4e55d80fc3e67d80ebf988eb0e551cca4eb70000000000000000000000000000"; | |
prankDelegate(from).delegatecall(to, data); | |
vm.prank(from); | |
vm.expectRevert("EIP1967Admin: not an admin"); | |
EIP1967Proxy(payable(bob)).setAdmin(address(this)); | |
vm.prank(from); | |
TimelockController(payable(timelockOptimism)).schedule(bob, 0, abi.encodeWithSelector(EIP1967Proxy.setAdmin.selector, address(this)), bytes32(0), bytes32(0), 1 days); | |
vm.prank(executor); | |
vm.expectRevert("TimelockController: operation is not ready"); | |
TimelockController(payable(timelockOptimism)).execute(bob, 0, abi.encodeWithSelector(EIP1967Proxy.setAdmin.selector, address(this)), bytes32(0), bytes32(0)); | |
skip(1 days); | |
vm.prank(executor); | |
TimelockController(payable(timelockOptimism)).execute(bob, 0, abi.encodeWithSelector(EIP1967Proxy.setAdmin.selector, address(this)), bytes32(0), bytes32(0)); | |
assertEq(EIP1967Proxy(payable(bob)).admin(), address(this)); | |
} | |
function prankDelegate(address _target) internal returns (Delegator) { | |
vm.etch(_target, type(Delegator).runtimeCode); | |
return Delegator(payable(_target)); | |
} | |
} | |
contract Delegator { | |
function delegatecall(address dest, bytes memory cd) external payable virtual { | |
assembly { | |
let result := delegatecall(gas(), dest, add(cd, 32), mload(cd), 0, 0) | |
returndatacopy(0, 0, returndatasize()) | |
switch result | |
case 0 { revert(0, returndatasize()) } | |
default { return(0, returndatasize()) } | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment