Multisig Proposal
Overview
Proposal contract
function name() public pure override returns (string memory) { return "MULTISIG_MOCK"; }function description() public pure override returns (string memory) { return "Multisig proposal mock"; }function deploy() public override { // get multisig address address multisig = addresses.getAddress("DEV_MULTISIG"); // Deploy vault address if not already deployed and transfer ownership to multisig. if (!addresses.isAddressSet("MULTISIG_VAULT")) { Vault multisigVault = new Vault(); addresses.addAddress( "MULTISIG_VAULT", address(multisigVault), true ); multisigVault.transferOwnership(multisig); } // Deploy token address if not already deployed, transfer ownership to multisig // and transfer all initial minted tokens from deployer to multisig. if (!addresses.isAddressSet("MULTISIG_TOKEN")) { Token token = new Token(); addresses.addAddress("MULTISIG_TOKEN", address(token), true); token.transferOwnership(multisig); // During forge script execution, the deployer of the contracts is // the DEPLOYER_EOA. However, when running through forge test, the deployer of the contracts is this contract. uint256 balance = token.balanceOf(address(this)) > 0 ? token.balanceOf(address(this)) : token.balanceOf(addresses.getAddress("DEPLOYER_EOA")); token.transfer(multisig, balance); } }function build() public override buildModifier(addresses.getAddress("DEV_MULTISIG")) { /// STATICCALL -- non-mutative and hence not recorded for the run stage // Get multisig address address multisig = addresses.getAddress("DEV_MULTISIG"); // Get vault address address multisigVault = addresses.getAddress("MULTISIG_VAULT"); // Get token address address token = addresses.getAddress("MULTISIG_TOKEN"); // Get multisig's token balance uint256 balance = Token(token).balanceOf(address(multisig)); /// CALLS -- mutative and recorded // Whitelists the deployed token on the deployed vault. Vault(multisigVault).whitelistToken(token, true); // Approve the token for the vault. Token(token).approve(multisigVault, balance); // Deposit all tokens into the vault. Vault(multisigVault).deposit(token, balance); }function run() public override { // Create and select sepolia fork for proposal execution primaryForkId = vm.createFork("sepolia"); vm.selectFork(primaryForkId); string memory addressesFolderPath = "./addresses"; uint256[] memory chainIds = new uint256[](1); chainIds[0] = 11155111; // Set addresses object reading addresses from json file. setAddresses( new Addresses(addressesFolderPath, chainIds) ); // Call the run function of parent contract 'Proposal.sol'. super.run(); }function simulate() public override { // Get multisig address address multisig = addresses.getAddress("DEV_MULTISIG"); // multisig is the caller for all the proposal actions _simulateActions(multisig); }function validate() public override { // Get vault address Vault multisigVault = Vault(addresses.getAddress("MULTISIG_VAULT")); // Get token address Token token = Token(addresses.getAddress("MULTISIG_TOKEN")); // Get multisig address address multisig = addresses.getAddress("DEV_MULTISIG"); // Ensure token total supply is 10 million assertEq(token.totalSupply(), 10_000_000e18); // Ensure multisig is owner of deployed token. assertEq(token.owner(), multisig); // Ensure multisig is owner of deployed vault assertEq(multisigVault.owner(), multisig); // Ensure vault is not paused assertFalse(multisigVault.paused()); // Ensure token is whitelisted on vault assertTrue(multisigVault.tokenWhitelist(address(token))); // Get vault's token balance uint256 balance = token.balanceOf(address(multisigVault)); // Get multisig deposits in vault (uint256 amount, ) = multisigVault.deposits(address(token), multisig); // Ensure multisig deposit is same as vault's token balance assertEq(amount, balance); // Ensure all minted tokens are deposited into the vault assertEq(token.balanceOf(address(multisigVault)), token.totalSupply()); }
Proposal simulation
Deploying a Gnosis Safe Multisig on Testnet
Setting Up the Addresses JSON
Running the Proposal
Last updated