feat: add 26 chains to registry (10 -> 36 total)

L1: Gnosis, Celo, Fantom, Cronos, Moonbeam, Moonriver, Harmony,
    Rootstock, Fuse, Metis
L2: zkSync Era, Scroll, Linea, Polygon zkEVM, Blast, Mantle, Mode,
    Zora, World Chain, Abstract, Starknet
EVM: Canto, Kaia, Aurora, Boba, Astar

Each chain includes mainnet + testnet networks with chain_id,
explorer_url, native_currency, and public RPC defaults in .env.example.
Adds STARKNET variant to ChainType enum for non-EVM support.
This commit is contained in:
2026-02-26 15:15:42 -08:00
parent ef6ea57c6e
commit 3da4e9740d
3 changed files with 753 additions and 0 deletions
+58
View File
@@ -26,6 +26,7 @@ RATE_LIMIT_REQUESTS=1000
RATE_LIMIT_COMPUTE_UNITS=10000
# Free Public RPC URLs for Development
# -- Original chains --
ETH_MAINNET_RPC=https://eth.llamarpc.com
ETH_SEPOLIA_RPC=https://sepolia.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161
POLYGON_MAINNET_RPC=https://polygon.llamarpc.com
@@ -43,6 +44,63 @@ BSC_TESTNET_RPC=https://data-seed-prebsc-1-s1.binance.org:8545
SOLANA_MAINNET_RPC=https://api.mainnet-beta.solana.com
SOLANA_DEVNET_RPC=https://api.devnet.solana.com
# -- L1 Chains --
GNOSIS_MAINNET_RPC=https://rpc.gnosischain.com
GNOSIS_CHIADO_RPC=https://rpc.chiadochain.net
CELO_MAINNET_RPC=https://forno.celo.org
CELO_ALFAJORES_RPC=https://alfajores-forno.celo-testnet.org
FANTOM_MAINNET_RPC=https://rpc.ftm.tools
FANTOM_TESTNET_RPC=https://rpc.testnet.fantom.network
CRONOS_MAINNET_RPC=https://evm.cronos.org
CRONOS_TESTNET_RPC=https://evm-t3.cronos.org
MOONBEAM_MAINNET_RPC=https://rpc.api.moonbeam.network
MOONBEAM_MOONBASE_RPC=https://rpc.api.moonbase.moonbeam.network
MOONRIVER_MAINNET_RPC=https://rpc.api.moonriver.moonbeam.network
HARMONY_MAINNET_RPC=https://api.harmony.one
HARMONY_TESTNET_RPC=https://api.s0.b.hmny.io
ROOTSTOCK_MAINNET_RPC=https://public-node.rsk.co
ROOTSTOCK_TESTNET_RPC=https://public-node.testnet.rsk.co
FUSE_MAINNET_RPC=https://rpc.fuse.io
FUSE_SPARK_RPC=https://rpc.fusespark.io
METIS_MAINNET_RPC=https://andromeda.metis.io/?owner=1088
METIS_SEPOLIA_RPC=https://sepolia.metisdevops.link
# -- L2 / Rollups --
ZKSYNC_MAINNET_RPC=https://mainnet.era.zksync.io
ZKSYNC_SEPOLIA_RPC=https://sepolia.era.zksync.dev
SCROLL_MAINNET_RPC=https://rpc.scroll.io
SCROLL_SEPOLIA_RPC=https://sepolia-rpc.scroll.io
LINEA_MAINNET_RPC=https://rpc.linea.build
LINEA_SEPOLIA_RPC=https://rpc.sepolia.linea.build
POLYGON_ZKEVM_MAINNET_RPC=https://zkevm-rpc.com
POLYGON_ZKEVM_TESTNET_RPC=https://rpc.cardona.zkevm-rpc.com
BLAST_MAINNET_RPC=https://rpc.blast.io
BLAST_SEPOLIA_RPC=https://sepolia.blast.io
MANTLE_MAINNET_RPC=https://rpc.mantle.xyz
MANTLE_SEPOLIA_RPC=https://rpc.sepolia.mantle.xyz
MODE_MAINNET_RPC=https://mainnet.mode.network
MODE_SEPOLIA_RPC=https://sepolia.mode.network
ZORA_MAINNET_RPC=https://rpc.zora.energy
ZORA_SEPOLIA_RPC=https://sepolia.rpc.zora.energy
WORLDCHAIN_MAINNET_RPC=https://worldchain-mainnet.g.alchemy.com/public
WORLDCHAIN_SEPOLIA_RPC=https://worldchain-sepolia.g.alchemy.com/public
ABSTRACT_MAINNET_RPC=https://api.mainnet.abs.xyz
ABSTRACT_TESTNET_RPC=https://api.testnet.abs.xyz
STARKNET_MAINNET_RPC=https://starknet-mainnet.public.blastapi.io
STARKNET_SEPOLIA_RPC=https://starknet-sepolia.public.blastapi.io
# -- Other EVM --
CANTO_MAINNET_RPC=https://canto.slingshot.finance
CANTO_TESTNET_RPC=https://canto-testnet.plexnode.wtf
KAIA_MAINNET_RPC=https://public-en.node.kaia.io
KAIA_KAIROS_RPC=https://public-en-kairos.node.kaia.io
AURORA_MAINNET_RPC=https://mainnet.aurora.dev
AURORA_TESTNET_RPC=https://testnet.aurora.dev
BOBA_MAINNET_RPC=https://mainnet.boba.network
BOBA_SEPOLIA_RPC=https://sepolia.boba.network
ASTAR_MAINNET_RPC=https://evm.astar.network
ASTAR_SHIBUYA_RPC=https://evm.shibuya.astar.network
# External Services
IPFS_GATEWAY=https://ipfs.io/ipfs/
+58
View File
@@ -52,6 +52,7 @@ class Settings(BaseSettings):
rate_limit_compute_units: int = 1000 # per minute
# Chain RPCs (upstream nodes)
# -- Original 10 chains --
eth_mainnet_rpc: str = ""
eth_sepolia_rpc: str = ""
eth_holesky_rpc: str = ""
@@ -76,6 +77,63 @@ class Settings(BaseSettings):
btc_rpc_user: str = "bootnode"
btc_rpc_password: str = ""
# -- L1 Chains --
gnosis_mainnet_rpc: str = ""
gnosis_chiado_rpc: str = ""
celo_mainnet_rpc: str = ""
celo_alfajores_rpc: str = ""
fantom_mainnet_rpc: str = ""
fantom_testnet_rpc: str = ""
cronos_mainnet_rpc: str = ""
cronos_testnet_rpc: str = ""
moonbeam_mainnet_rpc: str = ""
moonbeam_moonbase_rpc: str = ""
moonriver_mainnet_rpc: str = ""
harmony_mainnet_rpc: str = ""
harmony_testnet_rpc: str = ""
rootstock_mainnet_rpc: str = ""
rootstock_testnet_rpc: str = ""
fuse_mainnet_rpc: str = ""
fuse_spark_rpc: str = ""
metis_mainnet_rpc: str = ""
metis_sepolia_rpc: str = ""
# -- L2 / Rollups --
zksync_mainnet_rpc: str = ""
zksync_sepolia_rpc: str = ""
scroll_mainnet_rpc: str = ""
scroll_sepolia_rpc: str = ""
linea_mainnet_rpc: str = ""
linea_sepolia_rpc: str = ""
polygon_zkevm_mainnet_rpc: str = ""
polygon_zkevm_testnet_rpc: str = ""
blast_mainnet_rpc: str = ""
blast_sepolia_rpc: str = ""
mantle_mainnet_rpc: str = ""
mantle_sepolia_rpc: str = ""
mode_mainnet_rpc: str = ""
mode_sepolia_rpc: str = ""
zora_mainnet_rpc: str = ""
zora_sepolia_rpc: str = ""
worldchain_mainnet_rpc: str = ""
worldchain_sepolia_rpc: str = ""
abstract_mainnet_rpc: str = ""
abstract_testnet_rpc: str = ""
starknet_mainnet_rpc: str = ""
starknet_sepolia_rpc: str = ""
# -- Other EVM --
canto_mainnet_rpc: str = ""
canto_testnet_rpc: str = ""
kaia_mainnet_rpc: str = ""
kaia_kairos_rpc: str = ""
aurora_mainnet_rpc: str = ""
aurora_testnet_rpc: str = ""
boba_mainnet_rpc: str = ""
boba_sepolia_rpc: str = ""
astar_mainnet_rpc: str = ""
astar_shibuya_rpc: str = ""
# DataStore (ClickHouse)
datastore_url: str = "clickhouse://bootnode:bootnode@localhost:8123/bootnode"
datastore_pool_size: int = 10
+637
View File
@@ -13,6 +13,7 @@ class ChainType(str, Enum):
EVM = "evm"
SOLANA = "solana"
BITCOIN = "bitcoin"
STARKNET = "starknet"
@dataclass
@@ -312,6 +313,642 @@ class ChainRegistry:
},
)
# -----------------------------------------------------------
# L1 Chains
# -----------------------------------------------------------
# Gnosis (formerly xDai)
cls._chains["gnosis"] = Chain(
name="Gnosis",
slug="gnosis",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=100,
is_testnet=False,
rpc_env_var="gnosis_mainnet_rpc",
explorer_url="https://gnosisscan.io",
native_currency="xDAI",
),
"chiado": Network(
name="Chiado",
chain_id=10200,
is_testnet=True,
rpc_env_var="gnosis_chiado_rpc",
explorer_url="https://gnosis-chiado.blockscout.com",
native_currency="xDAI",
),
},
)
# Celo
cls._chains["celo"] = Chain(
name="Celo",
slug="celo",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=42220,
is_testnet=False,
rpc_env_var="celo_mainnet_rpc",
explorer_url="https://celoscan.io",
native_currency="CELO",
),
"alfajores": Network(
name="Alfajores",
chain_id=44787,
is_testnet=True,
rpc_env_var="celo_alfajores_rpc",
explorer_url="https://alfajores.celoscan.io",
native_currency="CELO",
),
},
)
# Fantom
cls._chains["fantom"] = Chain(
name="Fantom",
slug="fantom",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Opera",
chain_id=250,
is_testnet=False,
rpc_env_var="fantom_mainnet_rpc",
explorer_url="https://ftmscan.com",
native_currency="FTM",
),
"testnet": Network(
name="Testnet",
chain_id=4002,
is_testnet=True,
rpc_env_var="fantom_testnet_rpc",
explorer_url="https://testnet.ftmscan.com",
native_currency="FTM",
),
},
)
# Cronos
cls._chains["cronos"] = Chain(
name="Cronos",
slug="cronos",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=25,
is_testnet=False,
rpc_env_var="cronos_mainnet_rpc",
explorer_url="https://cronoscan.com",
native_currency="CRO",
),
"testnet": Network(
name="Testnet",
chain_id=338,
is_testnet=True,
rpc_env_var="cronos_testnet_rpc",
explorer_url="https://testnet.cronoscan.com",
native_currency="CRO",
),
},
)
# Moonbeam
cls._chains["moonbeam"] = Chain(
name="Moonbeam",
slug="moonbeam",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=1284,
is_testnet=False,
rpc_env_var="moonbeam_mainnet_rpc",
explorer_url="https://moonscan.io",
native_currency="GLMR",
),
"moonbase": Network(
name="Moonbase Alpha",
chain_id=1287,
is_testnet=True,
rpc_env_var="moonbeam_moonbase_rpc",
explorer_url="https://moonbase.moonscan.io",
native_currency="DEV",
),
},
)
# Moonriver
cls._chains["moonriver"] = Chain(
name="Moonriver",
slug="moonriver",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=1285,
is_testnet=False,
rpc_env_var="moonriver_mainnet_rpc",
explorer_url="https://moonriver.moonscan.io",
native_currency="MOVR",
),
},
)
# Harmony
cls._chains["harmony"] = Chain(
name="Harmony",
slug="harmony",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet Shard 0",
chain_id=1666600000,
is_testnet=False,
rpc_env_var="harmony_mainnet_rpc",
explorer_url="https://explorer.harmony.one",
native_currency="ONE",
),
"testnet": Network(
name="Testnet Shard 0",
chain_id=1666700000,
is_testnet=True,
rpc_env_var="harmony_testnet_rpc",
explorer_url="https://explorer.testnet.harmony.one",
native_currency="ONE",
),
},
)
# Rootstock (RSK)
cls._chains["rootstock"] = Chain(
name="Rootstock",
slug="rootstock",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=30,
is_testnet=False,
rpc_env_var="rootstock_mainnet_rpc",
explorer_url="https://explorer.rsk.co",
native_currency="RBTC",
),
"testnet": Network(
name="Testnet",
chain_id=31,
is_testnet=True,
rpc_env_var="rootstock_testnet_rpc",
explorer_url="https://explorer.testnet.rsk.co",
native_currency="tRBTC",
),
},
)
# Fuse
cls._chains["fuse"] = Chain(
name="Fuse",
slug="fuse",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=122,
is_testnet=False,
rpc_env_var="fuse_mainnet_rpc",
explorer_url="https://explorer.fuse.io",
native_currency="FUSE",
),
"spark": Network(
name="Spark",
chain_id=123,
is_testnet=True,
rpc_env_var="fuse_spark_rpc",
explorer_url="https://explorer.fusespark.io",
native_currency="FUSE",
),
},
)
# Metis
cls._chains["metis"] = Chain(
name="Metis",
slug="metis",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Andromeda",
chain_id=1088,
is_testnet=False,
rpc_env_var="metis_mainnet_rpc",
explorer_url="https://andromeda-explorer.metis.io",
native_currency="METIS",
),
"sepolia": Network(
name="Sepolia",
chain_id=59902,
is_testnet=True,
rpc_env_var="metis_sepolia_rpc",
explorer_url="https://sepolia-explorer.metisdevops.link",
native_currency="tMETIS",
),
},
)
# -----------------------------------------------------------
# L2 / Rollups
# -----------------------------------------------------------
# zkSync Era
cls._chains["zksync"] = Chain(
name="zkSync Era",
slug="zksync",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=324,
is_testnet=False,
rpc_env_var="zksync_mainnet_rpc",
explorer_url="https://explorer.zksync.io",
),
"sepolia": Network(
name="Sepolia",
chain_id=300,
is_testnet=True,
rpc_env_var="zksync_sepolia_rpc",
explorer_url="https://sepolia.explorer.zksync.io",
),
},
)
# Scroll
cls._chains["scroll"] = Chain(
name="Scroll",
slug="scroll",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=534352,
is_testnet=False,
rpc_env_var="scroll_mainnet_rpc",
explorer_url="https://scrollscan.com",
),
"sepolia": Network(
name="Sepolia",
chain_id=534351,
is_testnet=True,
rpc_env_var="scroll_sepolia_rpc",
explorer_url="https://sepolia.scrollscan.com",
),
},
)
# Linea
cls._chains["linea"] = Chain(
name="Linea",
slug="linea",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=59144,
is_testnet=False,
rpc_env_var="linea_mainnet_rpc",
explorer_url="https://lineascan.build",
),
"sepolia": Network(
name="Sepolia",
chain_id=59141,
is_testnet=True,
rpc_env_var="linea_sepolia_rpc",
explorer_url="https://sepolia.lineascan.build",
),
},
)
# Polygon zkEVM
cls._chains["polygon-zkevm"] = Chain(
name="Polygon zkEVM",
slug="polygon-zkevm",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=1101,
is_testnet=False,
rpc_env_var="polygon_zkevm_mainnet_rpc",
explorer_url="https://zkevm.polygonscan.com",
native_currency="ETH",
),
"testnet": Network(
name="Cardona",
chain_id=2442,
is_testnet=True,
rpc_env_var="polygon_zkevm_testnet_rpc",
explorer_url="https://cardona-zkevm.polygonscan.com",
native_currency="ETH",
),
},
)
# Blast
cls._chains["blast"] = Chain(
name="Blast",
slug="blast",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=81457,
is_testnet=False,
rpc_env_var="blast_mainnet_rpc",
explorer_url="https://blastscan.io",
),
"sepolia": Network(
name="Sepolia",
chain_id=168587773,
is_testnet=True,
rpc_env_var="blast_sepolia_rpc",
explorer_url="https://sepolia.blastscan.io",
),
},
)
# Mantle
cls._chains["mantle"] = Chain(
name="Mantle",
slug="mantle",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=5000,
is_testnet=False,
rpc_env_var="mantle_mainnet_rpc",
explorer_url="https://mantlescan.xyz",
native_currency="MNT",
),
"sepolia": Network(
name="Sepolia",
chain_id=5003,
is_testnet=True,
rpc_env_var="mantle_sepolia_rpc",
explorer_url="https://sepolia.mantlescan.xyz",
native_currency="MNT",
),
},
)
# Mode
cls._chains["mode"] = Chain(
name="Mode",
slug="mode",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=34443,
is_testnet=False,
rpc_env_var="mode_mainnet_rpc",
explorer_url="https://explorer.mode.network",
),
"sepolia": Network(
name="Sepolia",
chain_id=919,
is_testnet=True,
rpc_env_var="mode_sepolia_rpc",
explorer_url="https://sepolia.explorer.mode.network",
),
},
)
# Zora
cls._chains["zora"] = Chain(
name="Zora",
slug="zora",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=7777777,
is_testnet=False,
rpc_env_var="zora_mainnet_rpc",
explorer_url="https://explorer.zora.energy",
),
"sepolia": Network(
name="Sepolia",
chain_id=999999999,
is_testnet=True,
rpc_env_var="zora_sepolia_rpc",
explorer_url="https://sepolia.explorer.zora.energy",
),
},
)
# World Chain
cls._chains["worldchain"] = Chain(
name="World Chain",
slug="worldchain",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=480,
is_testnet=False,
rpc_env_var="worldchain_mainnet_rpc",
explorer_url="https://worldscan.org",
native_currency="ETH",
),
"sepolia": Network(
name="Sepolia",
chain_id=4801,
is_testnet=True,
rpc_env_var="worldchain_sepolia_rpc",
explorer_url="https://sepolia.worldscan.org",
native_currency="ETH",
),
},
)
# Abstract
cls._chains["abstract"] = Chain(
name="Abstract",
slug="abstract",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=2741,
is_testnet=False,
rpc_env_var="abstract_mainnet_rpc",
explorer_url="https://abscan.org",
),
"testnet": Network(
name="Testnet",
chain_id=11124,
is_testnet=True,
rpc_env_var="abstract_testnet_rpc",
explorer_url="https://testnet.abscan.org",
),
},
)
# Starknet (non-EVM)
cls._chains["starknet"] = Chain(
name="Starknet",
slug="starknet",
chain_type=ChainType.STARKNET,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=None,
is_testnet=False,
rpc_env_var="starknet_mainnet_rpc",
explorer_url="https://starkscan.co",
native_currency="ETH",
),
"sepolia": Network(
name="Sepolia",
chain_id=None,
is_testnet=True,
rpc_env_var="starknet_sepolia_rpc",
explorer_url="https://sepolia.starkscan.co",
native_currency="ETH",
),
},
)
# -----------------------------------------------------------
# Other EVM Chains
# -----------------------------------------------------------
# Canto
cls._chains["canto"] = Chain(
name="Canto",
slug="canto",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=7700,
is_testnet=False,
rpc_env_var="canto_mainnet_rpc",
explorer_url="https://cantoscan.com",
native_currency="CANTO",
),
"testnet": Network(
name="Testnet",
chain_id=7701,
is_testnet=True,
rpc_env_var="canto_testnet_rpc",
explorer_url="https://testnet.cantoscan.com",
native_currency="CANTO",
),
},
)
# Klaytn / Kaia
cls._chains["kaia"] = Chain(
name="Kaia",
slug="kaia",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=8217,
is_testnet=False,
rpc_env_var="kaia_mainnet_rpc",
explorer_url="https://kaiascan.io",
native_currency="KAIA",
),
"kairos": Network(
name="Kairos",
chain_id=1001,
is_testnet=True,
rpc_env_var="kaia_kairos_rpc",
explorer_url="https://kairos.kaiascan.io",
native_currency="KAIA",
),
},
)
# Aurora (NEAR EVM)
cls._chains["aurora"] = Chain(
name="Aurora",
slug="aurora",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=1313161554,
is_testnet=False,
rpc_env_var="aurora_mainnet_rpc",
explorer_url="https://explorer.aurora.dev",
),
"testnet": Network(
name="Testnet",
chain_id=1313161555,
is_testnet=True,
rpc_env_var="aurora_testnet_rpc",
explorer_url="https://testnet.explorer.aurora.dev",
),
},
)
# Boba
cls._chains["boba"] = Chain(
name="Boba",
slug="boba",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=288,
is_testnet=False,
rpc_env_var="boba_mainnet_rpc",
explorer_url="https://bobascan.com",
),
"sepolia": Network(
name="Sepolia",
chain_id=28882,
is_testnet=True,
rpc_env_var="boba_sepolia_rpc",
explorer_url="https://sepolia.bobascan.com",
),
},
)
# Astar
cls._chains["astar"] = Chain(
name="Astar",
slug="astar",
chain_type=ChainType.EVM,
networks={
"mainnet": Network(
name="Mainnet",
chain_id=592,
is_testnet=False,
rpc_env_var="astar_mainnet_rpc",
explorer_url="https://astar.blockscout.com",
native_currency="ASTR",
),
"shibuya": Network(
name="Shibuya",
chain_id=81,
is_testnet=True,
rpc_env_var="astar_shibuya_rpc",
explorer_url="https://shibuya.blockscout.com",
native_currency="SBY",
),
},
)
cls._initialized = True
@classmethod