Skip to content

Commit

Permalink
chore: avoid using Alchemy API keys in tests due to limits (foundry-r…
Browse files Browse the repository at this point in the history
…s#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.
  • Loading branch information
zerosnacks authored and agostbiro committed Feb 28, 2025
1 parent 19500a0 commit a48ae39
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 30 deletions.
2 changes: 1 addition & 1 deletion foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ optimizer = false

[rpc_endpoints]
# The RPC URLs are modified versions of the default for testing initialization.
mainnet = "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX" # Different API key.
mainnet = "https://eth.merkle.io" # Different API key.
optimism_sepolia = "https://sepolia.optimism.io/" # Adds a trailing slash.
arbitrum_one_sepolia = "https://sepolia-rollup.arbitrum.io/rpc/" # Adds a trailing slash.
needs_undefined_env_var = "${UNDEFINED_RPC_URL_PLACEHOLDER}"
Expand Down
4 changes: 1 addition & 3 deletions src/StdChains.sol
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,7 @@ abstract contract StdChains {

// If adding an RPC here, make sure to test the default RPC URL in `testRpcs`
setChainWithDefaultRpcUrl("anvil", ChainData("Anvil", 31337, "http://127.0.0.1:8545"));
setChainWithDefaultRpcUrl(
"mainnet", ChainData("Mainnet", 1, "https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP")
);
setChainWithDefaultRpcUrl("mainnet", ChainData("Mainnet", 1, "https://eth.llamarpc.com"));
setChainWithDefaultRpcUrl(
"sepolia", ChainData("Sepolia", 11155111, "https://sepolia.infura.io/v3/b9794ad1ddf84dfb8c34d6bb5dca2001")
);
Expand Down
4 changes: 2 additions & 2 deletions test/StdChains.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ contract StdChainsMock is Test {
contract StdChainsTest is Test {
function test_ChainRpcInitialization() public {
// RPCs specified in `foundry.toml` should be updated.
assertEq(getChain(1).rpcUrl, "https://eth-mainnet.alchemyapi.io/v2/WV407BEiBmjNJfKo9Uo_55u0z0ITyCOX");
assertEq(getChain(1).rpcUrl, "https://eth.merkle.io");
assertEq(getChain("optimism_sepolia").rpcUrl, "https://sepolia.optimism.io/");
assertEq(getChain("arbitrum_one_sepolia").rpcUrl, "https://sepolia-rollup.arbitrum.io/rpc/");

Expand All @@ -36,7 +36,7 @@ contract StdChainsTest is Test {

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

// Other RPCs should remain unchanged.
assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");
Expand Down
69 changes: 45 additions & 24 deletions test/StdCheats.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -460,15 +460,18 @@ contract StdCheatsMock is StdCheats {
}

contract StdCheatsForkTest is Test {
address internal constant SHIB = 0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE;
address internal constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
address internal constant USDC_BLACKLISTED_USER = 0x1E34A77868E19A6647b1f2F47B51ed72dEDE95DD;
address internal constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
address internal constant USDT_BLACKLISTED_USER = 0x8f8a8F4B54a2aAC7799d7bc81368aC27b852822A;

MockUSDT public USDT;
MockUSDC public USDC;

function setUp() public {
// All tests of the `assumeNotBlacklisted` method are fork tests using live contracts.
vm.createSelectFork({urlOrAlias: "mainnet", blockNumber: 16_428_900});
USDT = new MockUSDT();
USDC = new MockUSDC();

USDC.setBlacklisted(USDC_BLACKLISTED_USER, true);
USDT.setBlacklisted(USDT_BLACKLISTED_USER, true);
}

function test_CannotAssumeNoBlacklisted_EOA() external {
Expand All @@ -480,41 +483,67 @@ contract StdCheatsForkTest is Test {
}

function testFuzz_AssumeNotBlacklisted_TokenWithoutBlacklist(address addr) external view {
assumeNotBlacklisted(SHIB, addr);
assumeNotBlacklisted(address(USDC), addr);
assumeNotBlacklisted(address(USDT), addr);
assertTrue(true);
}

function test_AssumeNoBlacklisted_USDC() external {
// We deploy a mock version so we can properly test the revert.
StdCheatsMock stdCheatsMock = new StdCheatsMock();
vm.expectRevert();
stdCheatsMock.exposed_assumeNotBlacklisted(USDC, USDC_BLACKLISTED_USER);
stdCheatsMock.exposed_assumeNotBlacklisted(address(USDC), USDC_BLACKLISTED_USER);
}

function testFuzz_AssumeNotBlacklisted_USDC(address addr) external view {
assumeNotBlacklisted(USDC, addr);
assumeNotBlacklisted(address(USDC), addr);
assertFalse(USDCLike(USDC).isBlacklisted(addr));
}

function test_AssumeNoBlacklisted_USDT() external {
// We deploy a mock version so we can properly test the revert.
StdCheatsMock stdCheatsMock = new StdCheatsMock();
vm.expectRevert();
stdCheatsMock.exposed_assumeNotBlacklisted(USDT, USDT_BLACKLISTED_USER);
stdCheatsMock.exposed_assumeNotBlacklisted(address(USDT), USDT_BLACKLISTED_USER);
}

function testFuzz_AssumeNotBlacklisted_USDT(address addr) external view {
assumeNotBlacklisted(USDT, addr);
assumeNotBlacklisted(address(USDT), addr);
assertFalse(USDTLike(USDT).isBlackListed(addr));
}
}

/// @dev https://etherscan.io/token/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48#readProxyContract
interface USDCLike {
function isBlacklisted(address) external view returns (bool);
}

function test_dealUSDC() external {
// roll fork to the point when USDC contract updated to store balance in packed slots
vm.rollFork(19279215);
/// @dev https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7#readContract
interface USDTLike {
function isBlackListed(address) external view returns (bool);
}

contract MockUSDT is USDTLike {
mapping(address => bool) private blacklist;

uint256 balance = 100e6;
deal(USDC, address(this), balance);
assertEq(IERC20(USDC).balanceOf(address(this)), balance);
function isBlackListed(address addr) external view returns (bool) {
return blacklist[addr];
}

function setBlacklisted(address addr, bool value) external {
blacklist[addr] = value;
}
}

contract MockUSDC is USDCLike {
mapping(address => bool) private blacklist;

function isBlacklisted(address addr) external view returns (bool) {
return blacklist[addr];
}

function setBlacklisted(address addr, bool value) external {
blacklist[addr] = value;
}
}

Expand Down Expand Up @@ -588,14 +617,6 @@ contract BarERC721 {
mapping(address => uint256) private _balances;
}

interface USDCLike {
function isBlacklisted(address) external view returns (bool);
}

interface USDTLike {
function isBlackListed(address) external view returns (bool);
}

contract RevertingContract {
constructor() {
revert();
Expand Down

0 comments on commit a48ae39

Please sign in to comment.