Install any skill in seconds. Free to start, no credit card required.
Get Started Free →lifinance/add-network
Add a new network to the codebase (networks.json, foundry.toml, permit2Proxy.json, gaszip.json, bridge configs; do not mutate global.json for per-network Permit2/GasZip; target state via scriptMaster)
Passed 13 of 18 test cases with the skill, and 3 of 18 without it.
and 14 more in the full report
14 fixed2 passed either way4 still failing2 broke
Tokens, turns and time describe resource use, not a dollar price.
One of 14 test cases the skill fixed. Same model, same prompt, with and without the skill.
On dev.gas.zip inbound documentation page, there are two tables: 'Inbound: Contract Forwarder' and 'Inbound: Direct Forwarder'. Which address should be extracted for `config/gaszip.json`?
| Checked | Without skill | With skill |
|---|---|---|
| Specifies using the address from the Inbound: Contract Forwarder table only | Missed | Passed |
The instructions your model reads when the skill loads.
Usage: /add-network or /add-network <networkKey>
Collect required inputs (manually or from a CSV of chain team form responses), validate them and contract addresses with cast code, then update config files. For any contract address (multicall, Permit2, Gas.zip router, bridge contracts), run cast code <address> --rpc-url <rpcUrl>; if result is 0x or empty, warn and do not add or ask for the correct address.
Order: (1) Validate all inputs and addresses; (2) Update configs. Validation can run in parallel (RPC, cast code, Etherscan V2 chainlist, Gas.zip inbound page, deployer/pauser balances). Config updates can run in parallel across files.
Sources: (A) CSV path from user (one row per network; if multiple rows, ask which) or (B) manual entry. CSV as base; manual overrides. Normalize: trim whitespace; chainId integer; addresses 0x + 40 hex; empty/placeholder (TBD, N/A, "not deployed") = missing.
Required: networkKey, chainId, nativeAddress, wrappedNativeAddress, nativeCurrency, rpcUrl, verificationType, explorerUrl, explorerApiUrl.
Optional (defaults): status "active", type "mainnet", multicallAddress 0xcA11bde05977b3631167028862bE2a173976CA11 (must have code), safeAddress "", create3Factory "" (omit key entirely when isZkEVM is true), isZkEVM false, targetEvmVersion ("london" or "cancun" for non-zkEVM networks, matching the EVM version the network supports — solc is derived from this, not configured separately; set "n/a" when isZkEVM is true), permit2Address 0x000000000022D473030F116dDEE9F6B43aC78BA3, gasZipChainId / gasZipRouterAddress (Step 6).
CSV column mapping (LI.FI form): chainId ← Chain ID; networkKey ← Chain Name (lowercase, no spaces); rpcUrl ← Public RPC URL; explorerUrl ← Recommended block explorer URL:; verificationType ← What is the type of your recommended block explorer? (etherscan|blockscout|Routescan|Custom / Hemera's Social Scan / etc. → custom); nativeCurrency ← Symbol of native token; nativeAddress ← Address / Representation of native token (L1 → 0x0...0 if NA); wrappedNativeAddress ← Address of wrapped native token; multicallAddress ← Address of the Multicall3 contract (if deployed); permit2Address ← Address of the Permit2 contract (if deployed); gasZipRouterAddress ← Address of Gas.Zip Deposit V1 (if deployed); isZkEVM ← Is your chain a zkEVM chain type? (Yes→true). explorerApiUrl: not in form — use Etherscan V2 URL if chainId in chainlist, else from explorer type/docs. Bridges: column 40 (free text), 41–63 (checkboxes), 65 (addresses).
Validation: Warn on missing required, bad format, unknown verificationType. Check Etherscan V2 chainlist; RPC chainId match; Gas.zip inbound for chainId; cast code for multicall, Permit2, Gas.zip router; always cast balance deployerWallet and pauserWallet from config/global.json and warn if zero/low. Summarize values and warnings; ask user to confirm before Step 2.
verificationType (foundry.toml): etherscan | blockscout | zksync | oklink | sourcify | routescan | custom.
config/networks.jsonInsert new network alphabetically (mainnet first, then A–Z). Fields: name, chainId, nativeAddress, nativeCurrency, wrappedNativeAddress, status "active", type "mainnet", rpcUrl, verificationType, explorerUrl, explorerApiUrl, multicallAddress (only if has code), safeAddress "", gasZipChainId (Step 6), isZkEVM, targetEvmVersion (for non-zkEVM use "london" or "cancun" — solc is derived from this: london → 0.8.17, cancun → 0.8.29; for isZkEVM: true use "n/a", where zksolc via [profile.zksync] applies, so there is no separate solc field to set); for non-zkEVM networks only include create3Factory (use "" until deployed, or the factory address). Omit the create3Factory key entirely for zkEVM entries (do not set it to ""). Confirm multicall has code; if not, abort or ask for correct address.
foundry.toml[rpc_endpoints] add {networkKey} = "${ETH_NODE_URI_{NETWORK_KEY}}" (alphabetical).ethereum, bsc); (3) construct the URL prefix https://<slug>.drpc.org/; (4) ask the user to attach their API key (to form the complete URL); (5) print the command for them using the all-lowercase networkKey (e.g. optimismsepolia, not optimismSepolia — matching the convention in config/networks.json): bun add-network-rpc --network <networkKey> --rpc-url <complete URL>; (6) after storing in MongoDB, run fetch-rpcs to populate .env. Do not manually edit .env — it is populated from MongoDB via fetch-rpcs.{networkKey} = { key = "${MAINNET_ETHERSCAN_API_KEY}", url = "https://api.etherscan.io/v2/api?chainid={chainId}", chain = "{chainId}" }. Else use explorerApiUrl + verificationType; for blockscout/zksync/oklink/sourcify/custom add verifier = "<type>" and appropriate key. Insert alphabetically.test cases passed, vs 3 / 18 without
More skills from the same source and nearby in the registry, with their headline benchmark lift.