github.com/ethereum-optimism/optimism@v1.7.2/packages/contracts-bedrock/test/invariants/AddressAliasHelper.t.sol (about) 1 // SPDX-License-Identifier: MIT 2 pragma solidity 0.8.15; 3 4 import { Test } from "forge-std/Test.sol"; 5 import { StdInvariant } from "forge-std/StdInvariant.sol"; 6 import { AddressAliasHelper } from "src/vendor/AddressAliasHelper.sol"; 7 import { InvariantTest } from "test/invariants/InvariantTest.sol"; 8 9 contract AddressAliasHelper_Converter { 10 bool public failedRoundtrip; 11 12 /// @dev Allows the actor to convert L1 to L2 addresses and vice versa. 13 function convertRoundTrip(address addr) external { 14 // Alias our address 15 address aliasedAddr = AddressAliasHelper.applyL1ToL2Alias(addr); 16 17 // Unalias our address 18 address undoneAliasAddr = AddressAliasHelper.undoL1ToL2Alias(aliasedAddr); 19 20 // If our round trip aliasing did not return the original result, set our state. 21 if (addr != undoneAliasAddr) { 22 failedRoundtrip = true; 23 } 24 } 25 } 26 27 contract AddressAliasHelper_AddressAliasing_Invariant is StdInvariant, InvariantTest { 28 AddressAliasHelper_Converter internal actor; 29 30 function setUp() public override { 31 super.setUp(); 32 // Create a converter actor. 33 actor = new AddressAliasHelper_Converter(); 34 35 targetContract(address(actor)); 36 37 bytes4[] memory selectors = new bytes4[](1); 38 selectors[0] = actor.convertRoundTrip.selector; 39 FuzzSelector memory selector = FuzzSelector({ addr: address(actor), selectors: selectors }); 40 targetSelector(selector); 41 } 42 43 /// @custom:invariant Address aliases are always able to be undone. 44 /// 45 /// Asserts that an address that has been aliased with 46 /// `applyL1ToL2Alias` can always be unaliased with 47 /// `undoL1ToL2Alias`. 48 function invariant_round_trip_aliasing() external { 49 // ASSERTION: The round trip aliasing done in testRoundTrip(...) should never fail. 50 assertEq(actor.failedRoundtrip(), false); 51 } 52 }