arnaucube
arnaucube/poseidon-solidity-examplePublic Self-hosted repository
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}