Skip to content

Commit 0ec7efe

Browse files
committed
speed up iteration by forking supersim instead of live networks
1 parent e7daea0 commit 0ec7efe

File tree

2 files changed

+56
-54
lines changed

2 files changed

+56
-54
lines changed

contracts/test/RemoteSuperchainERC20.t.sol

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import {Test} from "forge-std/Test.sol";
55
import {StdUtils} from "forge-std/StdUtils.sol";
66

77
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
8+
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
9+
810
import {Predeploys} from "@contracts-bedrock/libraries/Predeploys.sol";
911

1012
import {Relayer} from "@interop-lib/test/Relayer.sol";
@@ -20,95 +22,95 @@ interface ICreate2Deployer {
2022

2123
contract 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
}

contracts/test/RemoteSuperchainERC20Uniswap.t.sol

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,19 @@ contract RemoteSuperchainERC20UniswapTest is Test, RemoteSuperchainERC20Test, Un
4646
}
4747

4848
function setUp() public override {
49-
// Setup RemoteSuperchainERC20 for the cbBTC token on chain A & B
49+
// Setup RemoteSuperchainERC20 for the erc20 token on chain A & B
5050
super.setUp();
5151

52-
// The v4 pool only exists on the remote chain with no cbBTC (B)
52+
// The v4 pool only exists on the remote chain with no erc20 (B)
5353
vm.selectFork(chainB);
5454

5555
// creates the pool manager, utility routers, and test tokens
5656
deployFreshManagerAndRouters();
5757
deployMintAndApprove2Currencies();
5858
deployAndApprovePosm(manager);
5959

60-
// setup the create eth/cbBTC pool
61-
poolKey = PoolKey(Currency.wrap(address(0)), Currency.wrap(address(remoteCbBTC)), 3000, 60, IHooks(address(0)));
60+
// setup the create eth/erc20 pool
61+
poolKey = PoolKey(Currency.wrap(address(0)), Currency.wrap(address(remoteERC20)), 3000, 60, IHooks(address(0)));
6262
poolId = poolKey.toId();
6363
manager.initialize(poolKey, SQRT_PRICE_1_1);
6464
}
@@ -76,18 +76,18 @@ contract RemoteSuperchainERC20UniswapTest is Test, RemoteSuperchainERC20Test, Un
7676
liquidityAmount
7777
);
7878

79-
// Deal cbBTC on the home chain
79+
// Deal erc20 on the home chain
8080
vm.selectFork(chainA);
81-
deal(address(cbBTC), address(this), amount1Expected + 1);
82-
cbBTC.approve(address(remoteCbBTC), amount1Expected + 1);
81+
deal(address(erc20), address(this), amount1Expected + 1);
82+
erc20.approve(address(remoteERC20), amount1Expected + 1);
8383

8484
// Approve Permit2 with the remote token to be pulled
85-
remoteCbBTC.approve(address(permit2), amount1Expected + 1);
85+
remoteERC20.approve(address(permit2), amount1Expected + 1);
8686
relayAllMessages();
8787

8888
// On remote, approve permit2 for the posm (could also just be a signature)
8989
vm.selectFork(chainB);
90-
permit2.approve(address(remoteCbBTC), address(posm), type(uint160).max, type(uint48).max);
90+
permit2.approve(address(remoteERC20), address(posm), type(uint160).max, type(uint48).max);
9191

9292
// Mint Pool Liquidity (add the expected eth)
9393
vm.deal(address(this), amount0Expected + 1);
@@ -109,16 +109,16 @@ contract RemoteSuperchainERC20UniswapTest is Test, RemoteSuperchainERC20Test, Un
109109

110110
// No Balance on the home chain
111111
vm.selectFork(chainA);
112-
console.log(cbBTC.balanceOf(address(this)));
112+
assertEq(erc20.balanceOf(address(this)), 0);
113113

114114
// Swap in ETH on the remote chain
115115
vm.selectFork(chainB);
116116
vm.deal(address(this), 1 ether);
117117
swap(poolKey, true, -1 ether, ZERO_BYTES);
118118
relayAllMessages();
119119

120-
// Check balance on the home hcain
120+
// THERE IS A BALANCE
121121
vm.selectFork(chainA);
122-
console.log(cbBTC.balanceOf(address(this)));
122+
assertGt(erc20.balanceOf(address(this)), 0);
123123
}
124124
}

0 commit comments

Comments
 (0)