Skip to content

Instantly share code, notes, and snippets.

@k1rill-fedoseev
Created April 24, 2023 06:31
Show Gist options
  • Save k1rill-fedoseev/931f56f89c5bca1cbfada30c8d074220 to your computer and use it in GitHub Desktop.
Save k1rill-fedoseev/931f56f89c5bca1cbfada30c8d074220 to your computer and use it in GitHub Desktop.
// 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