Skip to content

Commit fa6e659

Browse files
authored
chore: add base chain tests
1 parent 108e423 commit fa6e659

13 files changed

+500
-11
lines changed

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
ETHEREUM_NODE_MAINNET=
22
ETHEREUM_NODE_POLYGON=
33
ETHEREUM_NODE_ARBITRUM=
4+
ETHEREUM_NODE_BASE=
45

56
ETHERSCAN_API_KEY_MAINNET=
67
ETHERSCAN_API_KEY_POLYGON=

foundry.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ optimizer=false
2727
mainnet = "${ETHEREUM_NODE_MAINNET}"
2828
polygon = "${ETHEREUM_NODE_POLYGON}"
2929
arbitrum = "${ETHEREUM_NODE_ARBITRUM}"
30+
base = "${ETHEREUM_NODE_BASE}"
3031

3132
[etherscan]
3233
mainnet = { key = "${ETHERSCAN_API_KEY_MAINNET}", chain = "mainnet" }

tests/bases/IntegrationTest.sol

Lines changed: 100 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,23 @@ import {
1111
Contracts as PersistentContracts,
1212
getMainnetDeployment as getMainnetPersistentContracts,
1313
getPolygonDeployment as getPolygonPersistentContracts,
14-
getArbitrumDeployment as getArbitrumPersistentContracts
14+
getArbitrumDeployment as getArbitrumPersistentContracts,
15+
getBaseChainDeployment as getBaseChainPersistentContracts
1516
} from "tests/utils/core/deployment/PersistentContracts.sol";
1617
import {ReleaseConfig} from "tests/utils/core/deployment/DeploymentUtils.sol";
1718
import {
1819
Contracts as V4ReleaseContracts,
1920
getMainnetDeployment as getV4MainnetReleaseContracts,
2021
getPolygonDeployment as getV4PolygonReleaseContracts,
21-
getArbitrumDeployment as getV4ArbitrumReleaseContracts
22+
getArbitrumDeployment as getV4ArbitrumReleaseContracts,
23+
getBaseChainDeployment as getV4BaseChainReleaseContracts
2224
} from "tests/utils/core/deployment/V4ReleaseContracts.sol";
2325
import {
2426
Contracts as ReleaseContracts,
2527
getMainnetDeployment as getMainnetReleaseContracts,
2628
getPolygonDeployment as getPolygonReleaseContracts,
27-
getArbitrumDeployment as getArbitrumReleaseContracts
29+
getArbitrumDeployment as getArbitrumReleaseContracts,
30+
getBaseChainDeployment as getBaseReleaseContracts
2831
} from "tests/utils/core/deployment/V5ReleaseContracts.sol";
2932

3033
import {IERC20} from "tests/interfaces/external/IERC20.sol";
@@ -96,7 +99,7 @@ abstract contract IntegrationTest is CoreUtils {
9699
}
97100

98101
function setUpLiveArbitrumEnvironment(uint256 _forkBlock) internal {
99-
vm.createSelectFork("polygon", _forkBlock);
102+
vm.createSelectFork("arbitrum", _forkBlock);
100103

101104
core.persistent = getArbitrumPersistentContracts();
102105
v4ReleaseContracts = getV4ArbitrumReleaseContracts();
@@ -105,6 +108,16 @@ abstract contract IntegrationTest is CoreUtils {
105108
// core.release = getArbitrumReleaseContracts();
106109
}
107110

111+
function setUpLiveBaseChainEnvironment(uint256 _forkBlock) internal {
112+
vm.createSelectFork("base", _forkBlock);
113+
114+
core.persistent = getBaseChainPersistentContracts();
115+
v4ReleaseContracts = getV4BaseChainReleaseContracts();
116+
117+
// No v5 release live
118+
// core.release = getBaseReleaseContracts();
119+
}
120+
108121
// Partially-live deployments (persistent layer only)
109122

110123
function setUpLiveMainnetEnvironmentWithNewRelease(uint256 _forkBlock) internal {
@@ -131,6 +144,14 @@ abstract contract IntegrationTest is CoreUtils {
131144
__setUpEnvironment({_config: getDefaultArbitrumConfig(), _persistentContractsAlreadySet: true});
132145
}
133146

147+
function setUpLiveBaseChainEnvironmentWithNewRelease(uint256 _forkBlock) internal {
148+
vm.createSelectFork("base", _forkBlock);
149+
150+
core.persistent = getBaseChainPersistentContracts();
151+
152+
__setUpEnvironment({_config: getDefaultBaseChainConfig(), _persistentContractsAlreadySet: true});
153+
}
154+
134155
// New deployments
135156
function setUpNetworkEnvironment(uint256 _chainId) internal {
136157
if (_chainId == ETHEREUM_CHAIN_ID) {
@@ -139,6 +160,8 @@ abstract contract IntegrationTest is CoreUtils {
139160
setUpPolygonEnvironment();
140161
} else if (_chainId == ARBITRUM_CHAIN_ID) {
141162
setUpArbitrumEnvironment();
163+
} else if (_chainId == BASE_CHAIN_ID) {
164+
setUpBaseChainEnvironment();
142165
} else {
143166
revert("setUpNetworkEnvironment: Unsupported network");
144167
}
@@ -151,6 +174,8 @@ abstract contract IntegrationTest is CoreUtils {
151174
setUpPolygonEnvironment(_forkBlock);
152175
} else if (_chainId == ARBITRUM_CHAIN_ID) {
153176
setUpArbitrumEnvironment(_forkBlock);
177+
} else if (_chainId == BASE_CHAIN_ID) {
178+
setUpBaseChainEnvironment(_forkBlock);
154179
} else {
155180
revert("setUpNetworkEnvironment: Unsupported network");
156181
}
@@ -168,6 +193,10 @@ abstract contract IntegrationTest is CoreUtils {
168193
setUpArbitrumEnvironment(ARBITRUM_BLOCK_LATEST);
169194
}
170195

196+
function setUpBaseChainEnvironment() internal {
197+
setUpBaseChainEnvironment(BASE_BLOCK_LATEST);
198+
}
199+
171200
function setUpMainnetEnvironment(uint256 _forkBlock) internal {
172201
vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: _forkBlock});
173202

@@ -361,6 +390,49 @@ abstract contract IntegrationTest is CoreUtils {
361390
__addCorePrimitives(corePrimitives);
362391
}
363392

393+
function setUpBaseChainEnvironment(uint256 _forkBlock) internal {
394+
vm.createSelectFork("base", _forkBlock);
395+
396+
v4ReleaseContracts = getV4BaseChainReleaseContracts();
397+
398+
ReleaseConfig memory config = getDefaultBaseChainConfig();
399+
400+
__setUpEnvironment({_config: config, _persistentContractsAlreadySet: false});
401+
402+
// Deploy minimal asset universe
403+
404+
// Treat WETH specially and directly add to coreTokens storage (does not require an aggregator)
405+
symbolToCoreToken["WETH"] = IERC20(wethToken);
406+
tokenToIsCore[IERC20(wethToken)] = true;
407+
408+
address simulatedUsdAddress = address(deployUsdEthSimulatedAggregator(config.chainlinkEthUsdAggregatorAddress));
409+
410+
CorePrimitiveInput[] memory corePrimitives = new CorePrimitiveInput[](2);
411+
// TODO: ucomment this when the real MLN aggregator address is available
412+
// System primitives
413+
// corePrimitives[0] = CorePrimitiveInput({
414+
// symbol: "MLN",
415+
// assetAddress: BASE_MLN,
416+
// aggregatorAddress: BASE_MLN_ETH_AGGREGATOR,
417+
// rateAsset: IChainlinkPriceFeedMixinProd.RateAsset.ETH
418+
// });
419+
// Extra primitives
420+
corePrimitives[0] = CorePrimitiveInput({
421+
symbol: "USD",
422+
assetAddress: simulatedUsdAddress,
423+
aggregatorAddress: simulatedUsdAddress,
424+
rateAsset: IChainlinkPriceFeedMixinProd.RateAsset.ETH
425+
});
426+
corePrimitives[1] = CorePrimitiveInput({
427+
symbol: "USDC",
428+
assetAddress: BASE_USDC,
429+
aggregatorAddress: BASE_USDC_USD_AGGREGATOR,
430+
rateAsset: IChainlinkPriceFeedMixinProd.RateAsset.USD
431+
});
432+
433+
__addCorePrimitives(corePrimitives);
434+
}
435+
364436
function setUpStandaloneEnvironment() internal {
365437
// Warp beyond Chainlink aggregator staleness threshold
366438
uint256 chainlinkStaleRateThreshold = 3650 days;
@@ -546,6 +618,30 @@ abstract contract IntegrationTest is CoreUtils {
546618
});
547619
}
548620

621+
function getDefaultBaseChainConfig() internal returns (ReleaseConfig memory) {
622+
address mlnBurner = makeAddr("MlnBurner");
623+
624+
return ReleaseConfig({
625+
// Chainlink
626+
chainlinkEthUsdAggregatorAddress: BASE_ETH_USD_AGGREGATOR,
627+
chainlinkStaleRateThreshold: 3650 days,
628+
// Tokens
629+
mlnTokenAddress: BASE_MLN,
630+
wethTokenAddress: BASE_WETH,
631+
wrappedNativeTokenAddress: BASE_WETH,
632+
// Gas relayer
633+
gasRelayDepositCooldown: 1 days,
634+
gasRelayDepositMaxTotal: 1 ether,
635+
gasRelayFeeMaxPercent: 10,
636+
gasRelayHubAddress: address(0), // TODO: lookup real value
637+
gasRelayRelayFeeMaxBase: 0,
638+
gasRelayTrustedForwarderAddress: address(0), // TODO: lookup real value
639+
// Vault settings
640+
vaultMlnBurner: mlnBurner,
641+
vaultPositionsLimit: 20
642+
});
643+
}
644+
549645
// ASSET UNIVERSE
550646

551647
/// @dev Keep private to avoid accidental use

tests/tests/protocols/aave/AaveV3Adapter.t.sol

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import {
1616
POLYGON_POOL_ADDRESS,
1717
POLYGON_POOL_ADDRESS_PROVIDER,
1818
ARBITRUM_POOL_ADDRESS,
19-
ARBITRUM_POOL_ADDRESS_PROVIDER
19+
ARBITRUM_POOL_ADDRESS_PROVIDER,
20+
BASE_POOL_ADDRESS,
21+
BASE_POOL_ADDRESS_PROVIDER
2022
} from "./AaveV3Constants.sol";
2123

2224
abstract contract AaveV3AdapterTest is AaveAdapterTest, AaveV3Utils {
@@ -132,3 +134,19 @@ contract AaveV3AdapterTestArbitrum is AaveV3AdapterTest {
132134
super.setUp();
133135
}
134136
}
137+
138+
contract AaveV3AdapterTestBaseChain is AaveV3AdapterTest {
139+
function setUp() public override {
140+
lendingPool = BASE_POOL_ADDRESS;
141+
lendingPoolAddressProvider = BASE_POOL_ADDRESS_PROVIDER;
142+
143+
setUpBaseChainEnvironment();
144+
145+
regular18DecimalUnderlying = IERC20(BASE_WETH);
146+
non18DecimalUnderlying = IERC20(BASE_USDC);
147+
148+
__registerTokensAndATokensForThem(toArray(address(regular18DecimalUnderlying), address(non18DecimalUnderlying)));
149+
150+
super.setUp();
151+
}
152+
}

tests/tests/protocols/aave/AaveV3Constants.sol

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,9 @@ address constant ARBITRUM_POOL_ADDRESS = 0x794a61358D6845594F94dc1DB02A252b5b481
1818
address constant ARBITRUM_POOL_ADDRESS_PROVIDER = 0xa97684ead0e402dC232d5A977953DF7ECBaB3CDb;
1919
address constant ARBITRUM_PROTOCOL_DATA_PROVIDER = 0x69FA688f1Dc47d4B5d8029D5a35FB7a548310654;
2020
address constant ARBITRUM_REWARDS_CONTROLLER = 0x0C501fB73808e1BD73cBDdd0c99237bbc481Bb58;
21+
22+
// Base
23+
address constant BASE_POOL_ADDRESS = 0xA238Dd80C259a72e81d7e4664a9801593F98d1c5;
24+
address constant BASE_POOL_ADDRESS_PROVIDER = 0xe20fCBdBfFC4Dd138cE8b2E6FBb6CB49777ad64D;
25+
address constant BASE_PROTOCOL_DATA_PROVIDER = 0xd82a47fdebB5bf5329b09441C3DaB4b5df2153Ad;
26+
address constant BASE_REWARDS_CONTROLLER = 0xf9cc4F0D883F1a1eb2c253bdb46c254Ca51E1F44;

0 commit comments

Comments
 (0)