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  }