pragma solidity 0.8.17; import "@interfaces/IGovernance.sol"; import "@interfaces/IERC20.sol"; import "@proprietary/Parameters.sol"; import "@forge-std/Test.sol"; import "@forge-std/console2.sol"; contract ProposalTest is Test, Parameters { IGovernance internal governance = IGovernance(_governanceAddress); uint256 internal currentGovernanceVaultBalance = getGovernanceVaultBalance(); modifier conditionStateChecks() { checkCurrentState(); _; checkResults(); } function testProposal() public conditionStateChecks { waitUntilVotingEnds(); governance.execute(_attackerProposalId); } function getAttackerLockedBalance() internal returns (uint256) { uint256 attackerLockedBalance; for (uint i = 0; i < _attackerAddresses.length; i++) { uint256 lockedBalance = governance.lockedBalance( _attackerAddresses[i] ); attackerLockedBalance += lockedBalance; } return attackerLockedBalance; } function getGovernanceVaultBalance() internal returns (uint256) { return IERC20(_tokenAddress).balanceOf(_governanceVaultAddress); } function waitUntilVotingEnds() internal { vm.warp(block.timestamp + PROPOSAL_DURATION); } function checkCurrentState() internal { console2.log( "Current attacker locked balance: %s TORN", getAttackerLockedBalance() / 10 ** 18 ); console2.log( "Current governance Vault balance: %s TORN", getGovernanceVaultBalance() / 10 ** 18 ); } function checkResults() internal { uint256 attackerBalanceAfterProposalExecution = getAttackerLockedBalance(); uint256 governanceVaultBalanceAfterProposalExecution = getGovernanceVaultBalance(); console2.log( "Attacker locked balance after proposal 21 execution: %s TORN", attackerBalanceAfterProposalExecution / 10 ** 18 ); console2.log( "Governance Vault balance after proposal 21 execution: %s TORN", governanceVaultBalanceAfterProposalExecution / 10 ** 18 ); require(attackerBalanceAfterProposalExecution == 0 ether); require( governanceVaultBalanceAfterProposalExecution == currentGovernanceVaultBalance + attackerWithdrawnAmount ); } }