// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import { ProposalUtils } from "./utils/ProposalUtils.sol"; import { RelayerCompensationProposal } from "@root/RelayerCompensationProposal.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import { console2 } from "@forge-std/console2.sol"; contract TestExampleProposal is ProposalUtils, RelayerCompensationProposal { modifier executeCurrentProposalBefore() { createAndExecuteProposal(); _; } function createAndExecuteProposal() public { address proposalAddress = address(new RelayerCompensationProposal()); proposeAndExecute(proposalAddress); } function getRelayerLosses() internal pure returns (RelayerLoss[4] memory) { return [ RelayerLoss(0x864DF9CD806D58341f13602103Bf853066ff962a, 625_894_225_496_155_734_516), RelayerLoss(0x5555555731006f71f121144534Ca7C8799F66AA3, 43_970_301_082_908_267_318), RelayerLoss(0x2Ee39Ff05643bC7cc9ed31B71e142429044A425C, 189_640_345_451_160_934_437), RelayerLoss(0x03392600086874456E08D2bAc104380BCdEBCfC0, 129_757_783_603_193_410_350) ]; } function testRelayerGotCompensation() public { RelayerLoss[4] memory relayerLosses = getRelayerLosses(); uint256[4] memory balancesBeforeProposal; for (uint256 i = 0; i < relayerLosses.length; i++) { balancesBeforeProposal[i] = TORN.balanceOf(relayerLosses[i].relayer); } createAndExecuteProposal(); for (uint256 i = 0; i < relayerLosses.length; i++) { uint256 updatedBalance = TORN.balanceOf(relayerLosses[i].relayer); require(balancesBeforeProposal[i] + relayerLosses[i].lostAmountInTorn == updatedBalance, "Compensation failed"); } } function testLossesDataIsValid() public pure { RelayerLoss[4] memory relayerLosses = getRelayerLosses(); uint256 tornDecimals = 1e18; require(relayerLosses[0].lostAmountInTorn / tornDecimals == 625); require(relayerLosses[1].lostAmountInTorn / tornDecimals == 43); require(relayerLosses[2].lostAmountInTorn / tornDecimals == 189); require(relayerLosses[3].lostAmountInTorn / tornDecimals == 129); } }