Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: avoid using Alchemy API keys in tests due to limits #662

Merged
merged 1 commit into from
Feb 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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_runs = 200

[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 `test_Rpcs` in `StdChains.t.sol`
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 @@ -459,15 +459,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_RevertIf_CannotAssumeNoBlacklisted_EOA() external {
Expand All @@ -479,41 +482,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_RevertIf_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_RevertIf_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 @@ -587,14 +616,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
Loading