@@ -5,6 +5,8 @@ import {Test} from "forge-std/Test.sol";
55import {StdUtils} from "forge-std/StdUtils.sol " ;
66
77import {IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol " ;
8+ import {ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol " ;
9+
810import {Predeploys} from "@contracts-bedrock/libraries/Predeploys.sol " ;
911
1012import {Relayer} from "@interop-lib/test/Relayer.sol " ;
@@ -20,95 +22,95 @@ interface ICreate2Deployer {
2022
2123contract RemoteSuperchainERC20Test is StdUtils , Test , Relayer {
2224 ICreate2Deployer public deployer = ICreate2Deployer (0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2 );
23- IERC20 public cbBTC = IERC20 (0xcbB7C0000aB88B473b1f5aFd9ef808440eed33Bf );
2425
2526 bytes32 public salt = bytes32 (0 );
26- RemoteSuperchainERC20 public remoteCbBTC;
2727
28- // Chain A (Base), Chain B (OPM)
29- constructor () Relayer ( " https://mainnet.base.org " , " https://mainnet.optimism.io " ) {}
28+ ERC20 public erc20;
29+ RemoteSuperchainERC20 public remoteERC20;
3030
31- function spender () public view virtual returns (address ) {
32- return address (0x1 );
33- }
34-
35- function setUp () public virtual {
36- // home chain is base, remotely controlled by the spender on OPM
37- bytes memory remoteERC20CreationCode =
38- abi.encodePacked (type (RemoteSuperchainERC20).creationCode, abi.encode (8453 , address (cbBTC), 10 , spender ()));
31+ // Run against supersim locally so forking is fast
32+ constructor () Relayer ("http://127.0.0.1:9545 " , "http://127.0.0.1:9546 " ) {
33+ // ERC20 only exists on A
34+ vm.selectFork (chainA);
35+ erc20 = new ERC20 ("ERC20 " , "ERC20 " );
3936
40- remoteCbBTC = RemoteSuperchainERC20 (deployer.computeAddress (salt, keccak256 (remoteERC20CreationCode)));
37+ // home chain is A, remotely controlled by the spender on B
38+ bytes memory args = abi.encode (chainIdByForkId[chainA], address (erc20), chainIdByForkId[chainB], spender ());
39+ bytes memory remoteERC20CreationCode = abi.encodePacked (type (RemoteSuperchainERC20).creationCode, args);
40+ remoteERC20 = RemoteSuperchainERC20 (deployer.computeAddress (salt, keccak256 (remoteERC20CreationCode)));
4141
42- // Setup Base
43- vm.selectFork (chainA);
42+ // Setup Remote on A
4443 deployer.deploy (0 , salt, remoteERC20CreationCode);
4544 vm.etch (Predeploys.CROSS_L2_INBOX, address (new CrossL2Inbox ()).code);
4645 vm.etch (Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, address (new L2ToL2CrossDomainMessenger ()).code);
4746
48- // Setup OPM
47+ // Setup Remote on B
4948 vm.selectFork (chainB);
5049 deployer.deploy (0 , salt, remoteERC20CreationCode);
5150 vm.etch (Predeploys.CROSS_L2_INBOX, address (new CrossL2Inbox ()).code);
5251 vm.etch (Predeploys.L2_TO_L2_CROSS_DOMAIN_MESSENGER, address (new L2ToL2CrossDomainMessenger ()).code);
5352 }
5453
55- function test_approve (address _holder ) public {
54+ function spender () public virtual returns (address ) {
55+ return address (0x1 );
56+ }
57+
58+ function setUp () public virtual {}
59+
60+ function test_approve () public {
5661 vm.selectFork (chainA);
57- vm.assume (cbBTC.balanceOf (_holder) == 0 );
58- vm.assume (_holder != spender () && _holder != address (0 ));
59- vm.assume (_holder != address (remoteCbBTC) && _holder != address (cbBTC));
62+ vm.assume (erc20.balanceOf (address (this )) == 0 );
6063
61- deal (address (cbBTC ), _holder , 1e18 );
62- assertEq (cbBTC .balanceOf (_holder ), 1e18 );
64+ deal (address (erc20 ), address ( this ) , 1e18 );
65+ assertEq (erc20 .balanceOf (address ( this ) ), 1e18 );
6366
6467 // Approve
65- vm.startPrank (_holder );
66- cbBTC .approve (address (remoteCbBTC ), 1e18 );
67- remoteCbBTC .approve (spender (), 1e18 );
68- assertEq (cbBTC .balanceOf (_holder ), 0 );
68+ vm.startPrank (address ( this ) );
69+ erc20 .approve (address (remoteERC20 ), 1e18 );
70+ remoteERC20 .approve (spender (), 1e18 );
71+ assertEq (erc20 .balanceOf (address ( this ) ), 0 );
6972
7073 // Check allowance
7174 relayAllMessages ();
7275 vm.selectFork (chainB);
73- assertEq (remoteCbBTC .balanceOf (_holder ), 1e18 );
74- assertEq (remoteCbBTC .balanceOf (spender ()), 0 );
75- assertEq (remoteCbBTC .allowance (_holder , spender ()), 1e18 );
76+ assertEq (remoteERC20 .balanceOf (address ( this ) ), 1e18 );
77+ assertEq (remoteERC20 .balanceOf (spender ()), 0 );
78+ assertEq (remoteERC20 .allowance (address ( this ) , spender ()), 1e18 );
7679
77- // Claim these fudns
7880 vm.stopPrank ();
7981 }
8082
81- function test_transferFrom (address _holder ) public {
82- test_approve (_holder );
83+ function test_transferFrom () public {
84+ test_approve ();
8385
8486 vm.selectFork (chainB);
8587
8688 // Claim approval
8789 vm.startPrank (spender ());
88- remoteCbBTC .transferFrom (_holder , spender (), 1e18 );
90+ remoteERC20 .transferFrom (address ( this ) , spender (), 1e18 );
8991
90- assertEq (remoteCbBTC .balanceOf (_holder ), 0 );
91- assertEq (remoteCbBTC .balanceOf (spender ()), 1e18 );
92- assertEq (remoteCbBTC .allowance (_holder , spender ()), 0 );
92+ assertEq (remoteERC20 .balanceOf (address ( this ) ), 0 );
93+ assertEq (remoteERC20 .balanceOf (spender ()), 1e18 );
94+ assertEq (remoteERC20 .allowance (address ( this ) , spender ()), 0 );
9395
9496 vm.stopPrank ();
9597 }
9698
97- function test_transfer (address _holder ) public {
98- test_transferFrom (_holder );
99+ function test_transfer () public {
100+ test_transferFrom ();
99101
100102 vm.selectFork (chainB);
101103
102104 // Transfer back to the holder (remote tokens burned)
103105 vm.startPrank (spender ());
104- remoteCbBTC .transfer (_holder , 1e18 );
105- assertEq (remoteCbBTC .balanceOf (spender ()), 0 );
106- assertEq (remoteCbBTC .balanceOf (_holder ), 0 );
106+ remoteERC20 .transfer (address ( this ) , 1e18 );
107+ assertEq (remoteERC20 .balanceOf (spender ()), 0 );
108+ assertEq (remoteERC20 .balanceOf (address ( this ) ), 0 );
107109 vm.stopPrank ();
108110
109111 // Tokens only transferred on the home chain.
110112 relayAllMessages ();
111113 vm.selectFork (chainA);
112- assertEq (cbBTC .balanceOf (_holder ), 1e18 );
114+ assertEq (erc20 .balanceOf (address ( this ) ), 1e18 );
113115 }
114116}
0 commit comments