Appearance
Chains
Two questions get confused constantly: which chains does the SDK know about, and which chains can settle a swap. They have different answers.
| Question | Source of truth | Count |
|---|---|---|
Which chains does swap-sdk name? | ChainName / ChainId in swap-sdk/src/utils/constants.ts | 36 |
| Which chains can settle a swap? | RELAYER_DEPLOYED_CHAINS | 22 |
| Which chains have an SEO landing page? | CHAINS in defi-dex/src/data/chainSeo.mjs | 24 |
| Which chains does the app actually offer? | The Network collection, show: true | Runtime |
The defensible public claim is "30+ chains".
Full SDK chain table
yes in the Relayer column means a swap or bridge-out can settle there.
| Enum key | Slug | Chain ID | Relayer |
|---|---|---|---|
MAINNET | ethereum | 1 | — |
OPTIMISM | optimism | 10 | yes |
CRONOS | cronos | 25 | — |
BSC | bsc | 56 | yes |
GNOSIS | gnosis | 100 | — |
UNICHAIN | unichain | 130 | yes |
MATIC | polygon | 137 | yes |
SONIC | sonic | 146 | yes |
BTTC | bittorrent | 199 | — |
OPBNB | opbnb | 204 | yes |
FANTOM | fantom | 250 | — |
ZKSYNC | zksync | 324 | — |
WORLDCHAIN | worldchain | 480 | yes |
HYPEREVM | hyperevm | 999 | yes |
METIS | metis | 1088 | — |
POLYGONZKEVM / ZKEVM | polygon-zkevm | 1101 | — |
MOONBEAM | moonbeam | 1284 | — |
SEI | sei | 1329 | yes |
SONEIUM | soneium | 1868 | yes |
RONIN | ronin | 2020 | yes |
ABSTRACT | abstract | 2741 | yes |
ROBINHOOD | robinhood | 4663 | yes |
MANTLE | mantle | 5000 | — |
BASE | base | 8453 | yes |
MODE | mode | 34443 | — |
APECHAIN | apechain | 33139 | yes |
ARBITRUM | arbitrum | 42161 | yes |
CELO | celo | 42220 | yes |
ETHERLINK | etherlink | 42793 | — |
AVAX | avalanche | 43114 | yes |
LINEA | linea | 59144 | yes |
BLAST | blast | 81457 | — |
BERACHAIN | berachain | 80094 | yes |
TAIKO | taiko | 167000 | — |
SCROLL | scroll | 534352 | yes |
AURORA | aurora | 1313161554 | — |
Hemi (43111) has a relayer but is missing from the enums
It appears in RELAYER_ADDRESSES and RELAYER_DEPLOYED_CHAINS, and it has SEO landing pages — but there is no HEMI entry in ChainName or ChainId. So getChainNameById(43111) returns undefined. Anything relying on the slug lookup for Hemi will fail; anything relying on the relayer address works. Worth fixing.
Non-EVM chains
Not in the EVM enums; they use synthetic ids in the Network collection.
| Chain | Internal Network.id | Wallets | Relayer |
|---|---|---|---|
| Solana | 102 | Phantom | Not applicable |
| TRON | 728126428 | TronLink, WalletConnect | Not applicable |
Neither routes through BlazpayRelayer, so neither pays the 0.1% fee or gets its refund protections. See non-EVM paths.
Deliberate non-deployments
| Chain | ID | Reason |
|---|---|---|
| Ethereum mainnet | 1 | Gas cost makes small trades uneconomic; no funds bridged there |
| Etherlink | 42793 | Intentionally skipped |
Both are commented in RELAYER_ADDRESSES rather than omitted silently.
Configured but not deployed
Present in the enums with no relayer. These are seedable as bridge destinations — you can bridge into them — but cannot originate a swap or a bridge-out.
cronos · gnosis · bittorrent · fantom · zksync · metis · polygon-zkevm · moonbeam · mantle · mode · blast · taiko · aurora
Plus Qubetics (TICS), which has its own surface (qube.blazpay.com, qubeticsModel) rather than an entry here.
SEO landing-page coverage
24 chains have prerendered /swap/{slug} and /bridge/{slug} pages, from CHAINS in chainSeo.mjs:
Emerging (priority — lowest keyword competition):soneium · hemi · berachain · sei · sonic · unichain · apechain · abstract · worldchain · hyperevm · opbnb · ronin
Majors:ethereum · arbitrum · optimism · base · polygon · bnb · avalanche · linea · scroll · celo
Non-EVM:solana · tron
ethereum has a landing page but no relayer
Deliberate — the page ranks for Ethereum swap intent and routes users to a chain where the trade is economic. Do not "fix" the inconsistency by deleting the page.
Each chain record carries slug, chainId, native, category, since, explorer, popularTokens, a hand-written narrative, extraKeywords and extraFaqs.
Relayer address cohorts
Four distinct proxy addresses, for reasons worth understanding:
| Address | Chains | Why |
|---|---|---|
0x7d98E59FabFBaDD5eCB61CC2cf876AA97f505531 | 137, 146, 204, 480, 999, 1329, 1868, 2020, 33139, 42220, 43111, 80094 | The v2 cohort — deterministic CREATE from TX_SIGNER at the same nonce |
0x5c23c9a42626Ade38ae1c9a3407096d4381EE6E6 | 56, 42161, 59144, 534352 | Pre-existing, upgraded in place |
0xb8Bd470f3C2610F83025D049085A64f1C7b78F14 | 10, 8453, 43114, 2741, 4663 | Pre-existing, plus Abstract (zkSync-stack CREATE differs) and Robinhood |
0xA01da2d3AbEFFbaa347B08C76EEC47169DdE72e9 | 130 | Unichain — deployer nonce had drifted before deploy |
Full deployment record with implementations: contract addresses.
Automation chain support
Much narrower than trading:
| Product | Chains |
|---|---|
| CSIP / DCA | Arbitrum (42161) only |
| Autopilot | Arbitrum (42161), Robinhood (4663), Arbitrum Sepolia (421614). Base (8453) configured, not deployed |
| Perpetuals | Orderly's supported set |
Runtime resolution
The Network collection is what the app actually reads:
js
{
id: Number, // the canonical chain key
chainType: String, // 'evm' | 'solana' | 'tron'
name, key, coin, logoURI,
mainnet: Boolean,
metamask: Object, // { rpcUrls: [...], ... } ← the RPC everything uses
multicallAddress: String,
nativeToken: Object,
tokenlistUrl: String,
order: Number, // display order
aggregators: [String], // per-chain provider allow-list
show: Boolean, // default true
}metamask.rpcUrls[0] is a single point of failure per chain
The backend uses it for EIP-712 signing (signTx loads it per chainId), the fee summary and all vault interaction. A dead RPC in this record takes that chain down with no obvious error message.
Set show: false to hide a chain from the UI without deleting the record. That is the correct way to disable one.
Adding a chain
Checklist: add a chain. The short version:
| Goal | Work |
|---|---|
| Bridge into only | Seed Network + at least one Token (from LiFi data), bust the production cache |
| Full swap + bridge | Deploy BlazpayRelayer, add to RELAYER_ADDRESSES and RELAYER_DEPLOYED_CHAINS, release the SDK, bump both consumers' pins and lockfiles |
| SEO pages | Add a CHAINS entry in chainSeo.mjs and rebuild |
Adding to RELAYER_ADDRESSES without RELAYER_DEPLOYED_CHAINS is dangerous
assertRelayerDeployed reads the Set. Skipping it lets a swap attempt proceed on a chain that was never verified.