Skip to content

Commit 02537e1

Browse files
authored
chore: avoid using Alchemy API keys in tests due to limits (#662)
We are running into Alchemy API limits (https://github.com/foundry-rs/forge-std/actions/runs/13545994206/job/37926743447?pr=654) that is causing the CI to block, small refactor to avoid using hardcoded API keys.
1 parent bf909b2 commit 02537e1

File tree

4 files changed

+49
-30
lines changed

4 files changed

+49
-30
lines changed

foundry.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ optimizer_runs = 200
55

66
[rpc_endpoints]
77
# The RPC URLs are modified versions of the default for testing initialization.
8-
mainnet = "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX" # Different API key.
8+
mainnet = "https://eth.merkle.io" # Different API key.
99
optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash.
1010
arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash.
1111
needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}"

src/StdChains.sol

+1-3
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,7 @@ abstract contract StdChains {
196196

197197
// If adding an RPC here, make sure to test the default RPC URL in `test_Rpcs` in `StdChains.t.sol`
198198
setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545"));
199-
setChainWithDefaultRpcUrl(
200-
"mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP")
201-
);
199+
setChainWithDefaultRpcUrl("mainnet", ChainData("Mainnet", 1, "https://eth.llamarpc.com"));
202200
setChainWithDefaultRpcUrl(
203201
"sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
204202
);

test/StdChains.t.sol

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ contract StdChainsMock is Test {
2424
contract StdChainsTest is Test {
2525
function test_ChainRpcInitialization() public {
2626
// RPCs specified in `foundry.toml` should be updated.
27-
assertEq(getChain(1).rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX");
27+
assertEq(getChain(1).rpcUrl, "https://eth.merkle.io");
2828
assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/");
2929
assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/");
3030

@@ -36,7 +36,7 @@ contract StdChainsTest is Test {
3636

3737
// Cannot override RPCs defined in `foundry.toml`
3838
vm.setEnv("MAINNET_RPC_URL", "myoverride2");
39-
assertEq(getChain("mainnet").rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX");
39+
assertEq(getChain("mainnet").rpcUrl, "https://eth.merkle.io");
4040

4141
// Other RPCs should remain unchanged.
4242
assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");

test/StdCheats.t.sol

+45-24
Original file line numberDiff line numberDiff line change
@@ -459,15 +459,18 @@ contract StdCheatsMock is StdCheats {
459459
}
460460

461461
contract StdCheatsForkTest is Test {
462-
address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
463-
address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
464462
address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD;
465-
address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
466463
address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A;
467464

465+
MockUSDT public USDT;
466+
MockUSDC public USDC;
467+
468468
function setUp() public {
469-
// All tests of the `assumeNotBlacklisted` method are fork tests using live contracts.
470-
vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
469+
USDT = new MockUSDT();
470+
USDC = new MockUSDC();
471+
472+
USDC.setBlacklisted(USDC_BLACKLISTED_USER, true);
473+
USDT.setBlacklisted(USDT_BLACKLISTED_USER, true);
471474
}
472475

473476
function test_RevertIf_CannotAssumeNoBlacklisted_EOA() external {
@@ -479,41 +482,67 @@ contract StdCheatsForkTest is Test {
479482
}
480483

481484
function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view {
482-
assumeNotBlacklisted(SHIB, addr);
485+
assumeNotBlacklisted(address(USDC), addr);
486+
assumeNotBlacklisted(address(USDT), addr);
483487
assertTrue(true);
484488
}
485489

486490
function test_RevertIf_AssumeNoBlacklisted_USDC() external {
487491
// We deploy a mock version so we can properly test the revert.
488492
StdCheatsMock stdCheatsMock = new StdCheatsMock();
489493
vm.expectRevert();
490-
stdCheatsMock.exposed_assumeNotBlacklisted(USDC, USDC_BLACKLISTED_USER);
494+
stdCheatsMock.exposed_assumeNotBlacklisted(address(USDC), USDC_BLACKLISTED_USER);
491495
}
492496

493497
function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view {
494-
assumeNotBlacklisted(USDC, addr);
498+
assumeNotBlacklisted(address(USDC), addr);
495499
assertFalse(USDCLike(USDC).isBlacklisted(addr));
496500
}
497501

498502
function test_RevertIf_AssumeNoBlacklisted_USDT() external {
499503
// We deploy a mock version so we can properly test the revert.
500504
StdCheatsMock stdCheatsMock = new StdCheatsMock();
501505
vm.expectRevert();
502-
stdCheatsMock.exposed_assumeNotBlacklisted(USDT, USDT_BLACKLISTED_USER);
506+
stdCheatsMock.exposed_assumeNotBlacklisted(address(USDT), USDT_BLACKLISTED_USER);
503507
}
504508

505509
function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view {
506-
assumeNotBlacklisted(USDT, addr);
510+
assumeNotBlacklisted(address(USDT), addr);
507511
assertFalse(USDTLike(USDT).isBlackListed(addr));
508512
}
513+
}
514+
515+
/// @dev https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#readProxyContract
516+
interface USDCLike {
517+
function isBlacklisted(address) external view returns (bool);
518+
}
509519

510-
function test_dealUSDC() external {
511-
// roll fork to the point when USDC contract updated to store balance in packed slots
512-
vm.rollFork(19279215);
520+
/// @dev https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract
521+
interface USDTLike {
522+
function isBlackListed(address) external view returns (bool);
523+
}
524+
525+
contract MockUSDT is USDTLike {
526+
mapping(address => bool) private blacklist;
513527

514-
uint256 balance = 100e6;
515-
deal(USDC, address(this), balance);
516-
assertEq(IERC20(USDC).balanceOf(address(this)), balance);
528+
function isBlackListed(address addr) external view returns (bool) {
529+
return blacklist[addr];
530+
}
531+
532+
function setBlacklisted(address addr, bool value) external {
533+
blacklist[addr] = value;
534+
}
535+
}
536+
537+
contract MockUSDC is USDCLike {
538+
mapping(address => bool) private blacklist;
539+
540+
function isBlacklisted(address addr) external view returns (bool) {
541+
return blacklist[addr];
542+
}
543+
544+
function setBlacklisted(address addr, bool value) external {
545+
blacklist[addr] = value;
517546
}
518547
}
519548

@@ -587,14 +616,6 @@ contract BarERC721 {
587616
mapping(address => uint256) private _balances;
588617
}
589618

590-
interface USDCLike {
591-
function isBlacklisted(address) external view returns (bool);
592-
}
593-
594-
interface USDTLike {
595-
function isBlackListed(address) external view returns (bool);
596-
}
597-
598619
contract RevertingContract {
599620
constructor() {
600621
revert();

0 commit comments

Comments
 (0)