Skip to content

Commit f4eb7eb

Browse files
authored
Update coin tests to use non forked environment - significantly speeding up test time. (#1426)
Migrated coin tests to use non-forked environment when testing, significantly speeding up test time. Comparison: * CoinUniV4.t.sol: before 214.26s, after 9.27s * CreatorCoin.t.sol: before 36.68s, after 677.10ms
1 parent 21b0762 commit f4eb7eb

23 files changed

+855
-39
lines changed

packages/coins/test/Coin.t.sol

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ contract CoinTest is BaseTest {
1616
using stdJson for string;
1717

1818
function setUp() public override {
19-
super.setUp();
19+
super.setUpNonForked();
2020
}
2121

2222
function test_contract_ierc165_support() public {
@@ -107,23 +107,35 @@ contract CoinTest is BaseTest {
107107
}
108108

109109
function test_burn() public {
110-
_deployV4Coin();
111-
vm.deal(users.buyer, 1 ether);
112-
vm.prank(users.buyer);
113-
_swapSomeCurrencyForCoin(coinV4, address(weth), 1 ether, users.coinRecipient);
110+
// Deploy a mock ERC20 currency
111+
MockERC20 mockCurrency = new MockERC20("Mock Currency", "MOCK");
112+
mockCurrency.mint(users.buyer, 1000 ether);
113+
// Pool manager needs currency for liquidity operations
114+
mockCurrency.mint(address(poolManager), 1000000 ether);
115+
116+
// Deploy coin with mock currency
117+
coinV4 = ContentCoin(payable(address(_deployV4Coin(address(mockCurrency), address(0), bytes32(0)))));
114118

115-
uint256 beforeBalance = coinV4.balanceOf(users.coinRecipient);
119+
// Approve with permit2 and swap
120+
uint128 swapAmount = 1 ether;
121+
vm.startPrank(users.buyer);
122+
UniV4SwapHelper.approveTokenWithPermit2(permit2, address(router), address(mockCurrency), swapAmount, uint48(block.timestamp + 1 days));
123+
vm.stopPrank();
124+
125+
_swapSomeCurrencyForCoin(coinV4, address(mockCurrency), swapAmount, users.buyer);
126+
127+
uint256 beforeBalance = coinV4.balanceOf(users.buyer);
116128
uint256 beforeTotalSupply = coinV4.totalSupply();
117129

118130
uint256 burnAmount = beforeBalance / 2;
119131

120-
vm.prank(users.coinRecipient);
132+
vm.prank(users.buyer);
121133
coinV4.burn(burnAmount);
122134

123-
uint256 afterBalance = coinV4.balanceOf(users.coinRecipient);
135+
uint256 afterBalance = coinV4.balanceOf(users.buyer);
124136
uint256 afterTotalSupply = coinV4.totalSupply();
125137

126-
assertEq(beforeBalance - afterBalance, burnAmount, "coinRecipient coin balance");
138+
assertEq(beforeBalance - afterBalance, burnAmount, "buyer coin balance");
127139
assertEq(beforeTotalSupply - afterTotalSupply, burnAmount, "coin total supply");
128140
}
129141

packages/coins/test/CoinUniV4.t.sol

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ contract CoinUniV4Test is BaseTest {
3838
MockERC20 internal mockERC20B;
3939

4040
function setUp() public override {
41-
super.setUpWithBlockNumber(30267794);
41+
super.setUpNonForked();
4242

43-
quoter = IV4Quoter(V4_QUOTER);
4443
mockERC20A = new MockERC20("MockERC20A", "MCKA");
4544
mockERC20B = new MockERC20("MockERC20B", "MCKB");
4645

packages/coins/test/ContentCoinRewards.t.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ contract ContentCoinRewardsTest is BaseTest {
2121
address internal tradeReferrer;
2222

2323
function setUp() public override {
24-
super.setUpWithBlockNumber(30267794);
25-
26-
deal(address(zoraToken), address(poolManager), 1_000_000_000e18);
24+
super.setUpNonForked();
2725

2826
backingCreatorCoin = CreatorCoin(_deployCreatorCoin());
2927

packages/coins/test/CreatorCoin.t.sol

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@ contract CreatorCoinTest is BaseTest {
1313
CreatorCoin internal creatorCoin;
1414

1515
function setUp() public override {
16-
super.setUpWithBlockNumber(30267794);
17-
18-
deal(address(zoraToken), address(poolManager), 1_000_000_000e18);
19-
16+
super.setUpNonForked();
2017
_deployCreatorCoin();
2118
}
2219

packages/coins/test/CreatorCoinRewards.t.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ contract CreatorCoinRewardsTest is BaseTest {
2222
address internal tradeReferrer;
2323

2424
function setUp() public override {
25-
super.setUpWithBlockNumber(30267794);
26-
27-
deal(address(zoraToken), address(poolManager), 1_000_000_000e18);
25+
super.setUpNonForked();
2826

2927
// Set up referrer addresses for all tests
3028
platformReferrer = makeAddr("platformReferrer");

packages/coins/test/Factory.t.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {IZoraFactory} from "../src/interfaces/IZoraFactory.sol";
88

99
contract FactoryTest is BaseTest {
1010
function setUp() public override {
11-
super.setUp();
11+
super.setUpNonForked();
1212
}
1313

1414
function test_factory_constructor_and_proxy_setup() public {
@@ -115,8 +115,8 @@ contract FactoryTest is BaseTest {
115115

116116
address platformReferrer = users.platformReferrer;
117117

118-
bytes memory poolConfig = CoinConfigurationVersions.defaultDopplerMultiCurveUniV4(address(weth));
119-
bytes memory poolConfigForGettingAddress = poolConfigChanged ? CoinConfigurationVersions.defaultDopplerMultiCurveUniV4(address(0)) : poolConfig;
118+
bytes memory poolConfig = CoinConfigurationVersions.defaultDopplerMultiCurveUniV4(address(0));
119+
bytes memory poolConfigForGettingAddress = poolConfigChanged ? CoinConfigurationVersions.defaultDopplerMultiCurveUniV4(ZORA_TOKEN_ADDRESS) : poolConfig;
120120

121121
address expectedCoinAddress = factory.coinAddress(msgSender, name, symbol, poolConfigForGettingAddress, platformReferrer, salt);
122122

packages/coins/test/MultiOwnable.t.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import "./utils/BaseTest.sol";
55

66
contract MultiOwnableTest is BaseTest {
77
function setUp() public override {
8-
super.setUp();
8+
super.setUpNonForked();
99

1010
_deployV4Coin();
1111
}
@@ -135,15 +135,15 @@ contract MultiOwnableTest is BaseTest {
135135

136136
function test_revert_init_with_zero_owners() public {
137137
address[] memory emptyOwners = new address[](0);
138-
bytes memory poolConfig_ = _generatePoolConfig(address(weth));
138+
bytes memory poolConfig_ = _generatePoolConfig(address(0));
139139
vm.expectRevert(MultiOwnable.OneOwnerRequired.selector);
140140
factory.deploy(users.creator, emptyOwners, "https://test.com", "Test Token", "TEST", poolConfig_, users.platformReferrer, 0);
141141
}
142142

143143
function test_revert_init_with_zero_address() public {
144144
address[] memory owners = new address[](1);
145145
owners[0] = address(0);
146-
bytes memory poolConfig_ = _generatePoolConfig(address(weth));
146+
bytes memory poolConfig_ = _generatePoolConfig(address(0));
147147
vm.expectRevert(MultiOwnable.OwnerCannotBeAddressZero.selector);
148148
factory.deploy(users.creator, owners, "https://test.com", "Test Token", "TEST", poolConfig_, users.platformReferrer, 0);
149149
}
@@ -152,7 +152,7 @@ contract MultiOwnableTest is BaseTest {
152152
address[] memory owners = new address[](2);
153153
owners[0] = users.creator;
154154
owners[1] = users.creator;
155-
bytes memory poolConfig_ = _generatePoolConfig(address(weth));
155+
bytes memory poolConfig_ = _generatePoolConfig(address(0));
156156
vm.expectRevert(MultiOwnable.AlreadyOwner.selector);
157157
factory.deploy(users.creator, owners, "https://test.com", "Test Token", "TEST", poolConfig_, users.platformReferrer, 0);
158158
}

packages/coins/test/ZoraHookRegistry.t.sol

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,28 @@ import {IZoraHookRegistry} from "../src/interfaces/IZoraHookRegistry.sol";
77
import {ZoraHookRegistry} from "../src/hook-registry/ZoraHookRegistry.sol";
88

99
contract MockHook {
10-
function contractVersion() public pure returns (string memory) {
11-
return "0.0.0";
10+
string private _version;
11+
12+
constructor(string memory version_) {
13+
_version = version_;
14+
}
15+
16+
function contractVersion() public view returns (string memory) {
17+
return _version;
1218
}
1319
}
1420

21+
contract MockHookNoVersion {
22+
// No contractVersion function
23+
}
24+
1525
contract ZoraHookRegistryTest is Test {
16-
uint256 internal forkId;
1726
address internal owner;
1827

1928
ZoraHookRegistry internal zoraHookRegistry;
2029
MockHook internal mockHook;
2130

2231
function setUp() public {
23-
forkId = vm.createSelectFork("base", 34509280);
2432
owner = makeAddr("owner");
2533

2634
address[] memory initialOwners = new address[](1);
@@ -29,7 +37,7 @@ contract ZoraHookRegistryTest is Test {
2937
zoraHookRegistry = new ZoraHookRegistry();
3038
zoraHookRegistry.initialize(initialOwners);
3139

32-
mockHook = new MockHook();
40+
mockHook = new MockHook("0.0.0");
3341
}
3442

3543
function test_register_hooks() public {
@@ -179,7 +187,8 @@ contract ZoraHookRegistryTest is Test {
179187
address[] memory hooks = new address[](1);
180188
string[] memory tags = new string[](1);
181189

182-
hooks[0] = 0x81542dC43Aff247eff4a0eceFC286A2973aE1040;
190+
MockHook hookWithVersion = new MockHook("1.1.1");
191+
hooks[0] = address(hookWithVersion);
183192
tags[0] = "CONTENT";
184193

185194
vm.prank(owner);
@@ -192,7 +201,8 @@ contract ZoraHookRegistryTest is Test {
192201
address[] memory hooks = new address[](1);
193202
string[] memory tags = new string[](1);
194203

195-
hooks[0] = 0xA1eBdD5cA6470Bbd67114331387f2dDa7bfad040;
204+
MockHookNoVersion hookNoVersion = new MockHookNoVersion();
205+
hooks[0] = address(hookNoVersion);
196206
tags[0] = "CONTENT";
197207

198208
vm.prank(owner);
@@ -207,8 +217,8 @@ contract ZoraHookRegistryTest is Test {
207217

208218
function test_get_hook_addresses_multiple_and_remove_middle() public {
209219
address a = address(mockHook);
210-
address b = address(new MockHook());
211-
address c = address(new MockHook());
220+
address b = address(new MockHook("0.0.0"));
221+
address c = address(new MockHook("0.0.0"));
212222

213223
address[] memory hooks = new address[](3);
214224
string[] memory tags = new string[](3);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.13;
3+
4+
import {IAirlock} from "../../src/interfaces/IAirlock.sol";
5+
6+
/// @title MockAirlock
7+
/// @notice Mock implementation of IAirlock for testing purposes
8+
contract MockAirlock is IAirlock {
9+
address private _owner;
10+
11+
constructor(address owner_) {
12+
_owner = owner_;
13+
}
14+
15+
function owner() external view override returns (address) {
16+
return _owner;
17+
}
18+
19+
function setOwner(address newOwner) external {
20+
_owner = newOwner;
21+
}
22+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.23;
3+
4+
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
5+
6+
contract SimpleERC20 is ERC20 {
7+
constructor(string memory name, string memory symbol) ERC20(name, symbol) {}
8+
}

0 commit comments

Comments
 (0)