poseidon-solidity-example/lib/forge-std/test/StdChains.t.sol
lib/forge-std/test/StdChains.t.solRaw
1// SPDX-License-Identifier: MIT
2pragma solidity >=0.7.0 <0.9.0;
3
4import "../src/Test.sol";
5
6contract StdChainsTest is Test {
7 function testChainRpcInitialization() public {
8 // RPCs specified in `foundry.toml` should be updated.
9 assertEq(getChain(1).rpcUrl, "https://mainnet.infura.io/v3/7a8769b798b642f6933f2ed52042bd70");
10 assertEq(getChain("optimism_goerli").rpcUrl, "https://goerli.optimism.io/");
11 assertEq(getChain("arbitrum_one_goerli").rpcUrl, "https://goerli-rollup.arbitrum.io/rpc/");
12
13 // Environment variables should be the next fallback
14 assertEq(getChain("arbitrum_nova").rpcUrl, "https://nova.arbitrum.io/rpc");
15 vm.setEnv("ARBITRUM_NOVA_RPC_URL", "myoverride");
16 assertEq(getChain("arbitrum_nova").rpcUrl, "myoverride");
17 vm.setEnv("ARBITRUM_NOVA_RPC_URL", "https://nova.arbitrum.io/rpc");
18
19 // Cannot override RPCs defined in `foundry.toml`
20 vm.setEnv("MAINNET_RPC_URL", "myoverride2");
21 assertEq(getChain("mainnet").rpcUrl, "https://mainnet.infura.io/v3/7a8769b798b642f6933f2ed52042bd70");
22
23 // Other RPCs should remain unchanged.
24 assertEq(getChain(31337).rpcUrl, "http://127.0.0.1:8545");
25 assertEq(getChain("sepolia").rpcUrl, "https://sepolia.infura.io/v3/6770454bc6ea42c58aac12978531b93f");
26 }
27
28 function testRpc(string memory rpcAlias) internal {
29 string memory rpcUrl = getChain(rpcAlias).rpcUrl;
30 vm.createSelectFork(rpcUrl);
31 }
32
33 // Ensure we can connect to the default RPC URL for each chain.
34 function testRpcs() public {
35 testRpc("mainnet");
36 testRpc("goerli");
37 testRpc("sepolia");
38 testRpc("optimism");
39 testRpc("optimism_goerli");
40 testRpc("arbitrum_one");
41 testRpc("arbitrum_one_goerli");
42 testRpc("arbitrum_nova");
43 testRpc("polygon");
44 testRpc("polygon_mumbai");
45 testRpc("avalanche");
46 testRpc("avalanche_fuji");
47 testRpc("bnb_smart_chain");
48 testRpc("bnb_smart_chain_testnet");
49 testRpc("gnosis_chain");
50 }
51
52 function testChainNoDefault() public {
53 vm.expectRevert("StdChains getChain(string): Chain with alias \"does_not_exist\" not found.");
54 getChain("does_not_exist");
55 }
56
57 function testSetChainFirstFails() public {
58 vm.expectRevert("StdChains setChain(string,ChainData): Chain ID 31337 already used by \"anvil\".");
59 setChain("anvil2", ChainData("Anvil", 31337, "URL"));
60 }
61
62 function testChainBubbleUp() public {
63 setChain("needs_undefined_env_var", ChainData("", 123456789, ""));
64 vm.expectRevert(
65 "Failed to resolve env var `UNDEFINED_RPC_URL_PLACEHOLDER` in `${UNDEFINED_RPC_URL_PLACEHOLDER}`: environment variable not found"
66 );
67 getChain("needs_undefined_env_var");
68 }
69
70 function testCannotSetChain_ChainIdExists() public {
71 setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
72
73 vm.expectRevert('StdChains setChain(string,ChainData): Chain ID 123456789 already used by "custom_chain".');
74
75 setChain("another_custom_chain", ChainData("", 123456789, ""));
76 }
77
78 function testSetChain() public {
79 setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
80 Chain memory customChain = getChain("custom_chain");
81 assertEq(customChain.name, "Custom Chain");
82 assertEq(customChain.chainId, 123456789);
83 assertEq(customChain.chainAlias, "custom_chain");
84 assertEq(customChain.rpcUrl, "https://custom.chain/");
85 Chain memory chainById = getChain(123456789);
86 assertEq(chainById.name, customChain.name);
87 assertEq(chainById.chainId, customChain.chainId);
88 assertEq(chainById.chainAlias, customChain.chainAlias);
89 assertEq(chainById.rpcUrl, customChain.rpcUrl);
90 customChain.name = "Another Custom Chain";
91 customChain.chainId = 987654321;
92 setChain("another_custom_chain", customChain);
93 Chain memory anotherCustomChain = getChain("another_custom_chain");
94 assertEq(anotherCustomChain.name, "Another Custom Chain");
95 assertEq(anotherCustomChain.chainId, 987654321);
96 assertEq(anotherCustomChain.chainAlias, "another_custom_chain");
97 assertEq(anotherCustomChain.rpcUrl, "https://custom.chain/");
98 // Verify the first chain data was not overwritten
99 chainById = getChain(123456789);
100 assertEq(chainById.name, "Custom Chain");
101 assertEq(chainById.chainId, 123456789);
102 }
103
104 function testSetNoEmptyAlias() public {
105 vm.expectRevert("StdChains setChain(string,ChainData): Chain alias cannot be the empty string.");
106 setChain("", ChainData("", 123456789, ""));
107 }
108
109 function testSetNoChainId0() public {
110 vm.expectRevert("StdChains setChain(string,ChainData): Chain ID cannot be 0.");
111 setChain("alias", ChainData("", 0, ""));
112 }
113
114 function testGetNoChainId0() public {
115 vm.expectRevert("StdChains getChain(uint256): Chain ID cannot be 0.");
116 getChain(0);
117 }
118
119 function testGetNoEmptyAlias() public {
120 vm.expectRevert("StdChains getChain(string): Chain alias cannot be the empty string.");
121 getChain("");
122 }
123
124 function testChainIdNotFound() public {
125 vm.expectRevert("StdChains getChain(string): Chain with alias \"no_such_alias\" not found.");
126 getChain("no_such_alias");
127 }
128
129 function testChainAliasNotFound() public {
130 vm.expectRevert("StdChains getChain(uint256): Chain with ID 321 not found.");
131 getChain(321);
132 }
133
134 function testSetChain_ExistingOne() public {
135 setChain("custom_chain", ChainData("Custom Chain", 123456789, "https://custom.chain/"));
136 assertEq(getChain(123456789).chainId, 123456789);
137
138 setChain("custom_chain", ChainData("Modified Chain", 999999999, "https://modified.chain/"));
139 vm.expectRevert("StdChains getChain(uint256): Chain with ID 123456789 not found.");
140 getChain(123456789);
141
142 Chain memory modifiedChain = getChain(999999999);
143 assertEq(modifiedChain.name, "Modified Chain");
144 assertEq(modifiedChain.chainId, 999999999);
145 assertEq(modifiedChain.rpcUrl, "https://modified.chain/");
146 }
147}