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 }