github.com/ethereum-optimism/optimism@v1.7.2/packages/contracts-bedrock/test/libraries/Clone.t.sol (about)

     1  // SPDX-License-Identifier: MIT
     2  pragma solidity ^0.8.15;
     3  
     4  import "forge-std/Test.sol";
     5  
     6  import { ClonesWithImmutableArgs } from "@cwia/ClonesWithImmutableArgs.sol";
     7  
     8  import { Clone } from "src/libraries/Clone.sol";
     9  
    10  contract ExampleClone is Clone {
    11      uint256 argOffset;
    12  
    13      constructor(uint256 _argOffset) {
    14          argOffset = _argOffset;
    15      }
    16  
    17      function addressArg() public view returns (address) {
    18          return _getArgAddress(argOffset);
    19      }
    20  
    21      function uintArg() public view returns (uint256) {
    22          return _getArgUint256(argOffset);
    23      }
    24  
    25      function fixedBytesArg() public view returns (bytes32) {
    26          return _getArgFixedBytes(argOffset);
    27      }
    28  
    29      function uintArrayArg(uint64 arrLen) public view returns (uint256[] memory) {
    30          return _getArgUint256Array(argOffset, arrLen);
    31      }
    32  
    33      function dynBytesArg(uint64 arrLen) public view returns (bytes memory) {
    34          return _getArgDynBytes(argOffset, arrLen);
    35      }
    36  
    37      function uint64Arg() public view returns (uint64) {
    38          return _getArgUint64(argOffset);
    39      }
    40  
    41      function uint8Arg() public view returns (uint8) {
    42          return _getArgUint8(argOffset);
    43      }
    44  }
    45  
    46  contract ExampleCloneFactory {
    47      using ClonesWithImmutableArgs for address;
    48  
    49      ExampleClone public implementation;
    50  
    51      constructor(ExampleClone implementation_) {
    52          implementation = implementation_;
    53      }
    54  
    55      function createAddressClone(address arg) external returns (ExampleClone clone) {
    56          bytes memory data = abi.encodePacked(arg);
    57          clone = ExampleClone(address(implementation).clone(data));
    58      }
    59  
    60      function createUintClone(uint256 arg) external returns (ExampleClone clone) {
    61          bytes memory data = abi.encodePacked(arg);
    62          clone = ExampleClone(address(implementation).clone(data));
    63      }
    64  
    65      function createFixedBytesClone(bytes32 arg) external returns (ExampleClone clone) {
    66          bytes memory data = abi.encodePacked(arg);
    67          clone = ExampleClone(address(implementation).clone(data));
    68      }
    69  
    70      function createUintArrayClone(uint256[] memory arg) external returns (ExampleClone clone) {
    71          bytes memory data = abi.encodePacked(arg);
    72          clone = ExampleClone(address(implementation).clone(data));
    73      }
    74  
    75      function createDynBytesClone(bytes memory arg) external returns (ExampleClone clone) {
    76          bytes memory data = abi.encodePacked(arg);
    77          clone = ExampleClone(address(implementation).clone(data));
    78      }
    79  
    80      function createUint64Clone(uint64 arg) external returns (ExampleClone clone) {
    81          bytes memory data = abi.encodePacked(arg);
    82          clone = ExampleClone(address(implementation).clone(data));
    83      }
    84  
    85      function createUint8Clone(uint8 arg) external returns (ExampleClone clone) {
    86          bytes memory data = abi.encodePacked(arg);
    87          clone = ExampleClone(address(implementation).clone(data));
    88      }
    89  
    90      function createClone(bytes memory randomCalldata) external returns (ExampleClone clone) {
    91          clone = ExampleClone(address(implementation).clone(randomCalldata));
    92      }
    93  }
    94  
    95  contract Clones_Test is Test {
    96      function testFuzz_clone_addressArg_succeeds(uint256 argOffset, address param) public {
    97          ExampleClone implementation = new ExampleClone(argOffset);
    98          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
    99          ExampleClone clone = factory.createAddressClone(param);
   100          address fetched = clone.addressArg();
   101          assertEq(fetched, param);
   102      }
   103  
   104      function testFuzz_clone_uintArg_succeeds(uint256 argOffset, uint256 param) public {
   105          ExampleClone implementation = new ExampleClone(argOffset);
   106          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
   107          ExampleClone clone = factory.createUintClone(param);
   108          uint256 fetched = clone.uintArg();
   109          assertEq(fetched, param);
   110      }
   111  
   112      function testFuzz_clone_fixedBytesArg_succeeds(uint256 argOffset, bytes32 param) public {
   113          ExampleClone implementation = new ExampleClone(argOffset);
   114          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
   115          ExampleClone clone = factory.createFixedBytesClone(param);
   116          bytes32 fetched = clone.fixedBytesArg();
   117          assertEq(fetched, param);
   118      }
   119  
   120      function testFuzz_clone_uintArrayArg_succeeds(uint256 argOffset, uint256[] memory param) public {
   121          ExampleClone implementation = new ExampleClone(argOffset);
   122          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
   123          ExampleClone clone = factory.createUintArrayClone(param);
   124          uint256[] memory fetched = clone.uintArrayArg(uint64(param.length));
   125          assertEq(fetched, param);
   126      }
   127  
   128      function testFuzz_clone_dynBytesArg_succeeds(uint256 argOffset, bytes memory param) public {
   129          ExampleClone implementation = new ExampleClone(argOffset);
   130          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
   131          ExampleClone clone = factory.createDynBytesClone(param);
   132          bytes memory fetched = clone.dynBytesArg(uint64(param.length));
   133          assertEq(fetched, param);
   134      }
   135  
   136      function testFuzz_clone_uint64Arg_succeeds(uint256 argOffset, uint64 param) public {
   137          ExampleClone implementation = new ExampleClone(argOffset);
   138          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
   139          ExampleClone clone = factory.createUint64Clone(param);
   140          uint64 fetched = clone.uint64Arg();
   141          assertEq(fetched, param);
   142      }
   143  
   144      function testFuzz_clone_uint8Arg_succeeds(uint256 argOffset, uint8 param) public {
   145          ExampleClone implementation = new ExampleClone(argOffset);
   146          ExampleCloneFactory factory = new ExampleCloneFactory(implementation);
   147          ExampleClone clone = factory.createUint8Clone(param);
   148          uint8 fetched = clone.uint8Arg();
   149          assertEq(fetched, param);
   150      }
   151  }