├── public ├── error.html ├── robots.txt ├── favicon.ico ├── unknown-logo.png ├── multichain-logo.png ├── banners │ ├── large │ │ ├── brave.png │ │ ├── gmx.png │ │ └── llamanodes.png │ └── small │ │ ├── brave.png │ │ ├── gmx.png │ │ └── llamanodes.png ├── connectors │ ├── coinbaseWalletIcon.svg │ ├── icn-trust.svg │ ├── icn-imtoken.svg │ ├── icn-xdefi.svg │ ├── icn-metamask.svg │ ├── icn-taho.svg │ └── icn-bravewallet.svg ├── logo-stacked.svg └── logo.svg ├── .prettierignore ├── styles └── globals.css ├── .prettierrc ├── postcss.config.js ├── next.config.js ├── constants ├── hypelab.js ├── walletIcons.js ├── additionalChainRegistry │ ├── chainid-90025.js │ ├── chainid-10121.js │ ├── chainid-1440000.js │ ├── chainid-202506.js │ ├── chainid-1990.js │ ├── chainid-4048.js │ ├── chainid-9.js │ ├── chainid-10001.js │ ├── chainid-2105.js │ ├── chainid-9030.js │ ├── chainid-688688.js │ ├── chainid-210000.js │ ├── chainid-3109.js │ ├── chainid-13863860.js │ ├── chainid-586.js │ ├── chainid-657468.js │ ├── chainid-202599.js │ ├── chainid-612055.js │ ├── chainid-97741.js │ ├── chainid-2107.js │ ├── chainid-612044.js │ ├── chainid-5151706.js │ ├── chainid-15000.js │ ├── chainid-1380012617.js │ ├── chainid-4227.js │ ├── chainid-2020.js │ ├── chainid-88888.js │ ├── chainid-999.js │ ├── chainid-239.js │ ├── chainid-2030232745.js │ └── chainid-1439.js ├── llamaNodesRpcs.js └── chainIds.js ├── scripts ├── post-export.sh ├── build.sh └── build-msg.js ├── stores └── index.js ├── tailwind.config.js ├── pull_request_template.md ├── vercel.json ├── generate-json.js ├── .gitignore ├── serve.json ├── pages ├── _app.js ├── api │ └── chain │ │ └── [chain].js ├── _document.js ├── index.js ├── zh │ ├── index.js │ └── chain │ │ └── [chain].js ├── add-network │ └── [chain].js └── chain │ └── [chain].js ├── hooks ├── useLlamaNodesRpcData.js ├── useConnect.jsx ├── useAccount.jsx ├── useClipboard.js ├── useAnalytics.js ├── useFilteredChains.jsx ├── useAddToNetwork.jsx └── useRPCData.js ├── translations ├── zh.json ├── en.json ├── tr.json ├── id.json ├── hi.json └── fr.json ├── package.json ├── components ├── Tooltip │ └── index.js ├── chain │ └── index.js ├── header │ └── index.js ├── AdBanner │ └── index.js ├── Layout │ ├── index.js │ └── Logo.js └── RPCList │ └── index.js ├── README.md ├── purge-cache.js ├── generate-sitemap.js ├── .github ├── workflows │ └── validate-chain-files.yml └── scripts │ └── validate-chain-files.js └── utils ├── index.js └── fetch.js /public/error.html: -------------------------------------------------------------------------------- 1 | nope -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | sitemap.xml.js 2 | .next 3 | out 4 | public 5 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # Allow all crawlers 2 | User-agent: * 3 | Allow: / -------------------------------------------------------------------------------- /styles/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "all", 3 | "printWidth": 120, 4 | "tabWidth": 2 5 | } 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/favicon.ico -------------------------------------------------------------------------------- /public/unknown-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/unknown-logo.png -------------------------------------------------------------------------------- /public/multichain-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/multichain-logo.png -------------------------------------------------------------------------------- /public/banners/large/brave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/banners/large/brave.png -------------------------------------------------------------------------------- /public/banners/large/gmx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/banners/large/gmx.png -------------------------------------------------------------------------------- /public/banners/small/brave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/banners/small/brave.png -------------------------------------------------------------------------------- /public/banners/small/gmx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/banners/small/gmx.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /public/banners/large/llamanodes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/banners/large/llamanodes.png -------------------------------------------------------------------------------- /public/banners/small/llamanodes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shahradelahi/chainlist/main/public/banners/small/llamanodes.png -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | output: 'export', 3 | // i18n: { 4 | // locales: ["en", "zh"], 5 | // defaultLocale: "en", 6 | // }, 7 | reactStrictMode: true, 8 | }; 9 | -------------------------------------------------------------------------------- /constants/hypelab.js: -------------------------------------------------------------------------------- 1 | export const HYPELAB_PROPERTY_SLUG = "chainlist"; 2 | export const HYPELAB_API_URL = "https://api.hypelab.com"; 3 | export const HYPELAB_NATIVE_PLACEMENT_SLUG = "134be8540e"; 4 | -------------------------------------------------------------------------------- /scripts/post-export.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | sed -i '4 i "type": "module",' package.json 4 | node generate-sitemap.js 5 | node generate-json.js 6 | sed -i "4 d" package.json 7 | rm out/404.html 8 | mv out/error.html out/404.html 9 | cp serve.json out/serve.json 10 | -------------------------------------------------------------------------------- /stores/index.js: -------------------------------------------------------------------------------- 1 | import create from "zustand"; 2 | 3 | export const useChain = create((set) => ({ 4 | id: null, 5 | updateChain: (id) => set(() => ({ id })), 6 | })); 7 | 8 | export const useRpcStore = create((set) => ({ 9 | rpcs: [], 10 | addRpc: (value) => set((state) => ({ rpcs: [...state.rpcs, value] })), 11 | })); 12 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: 'class', 4 | content: ["./pages/**/*.{js,ts,jsx,tsx}", "./components/**/*.{js,ts,jsx,tsx}"], 5 | theme: { 6 | extend: { 7 | screens: { 8 | "3xl": "1680px", 9 | }, 10 | }, 11 | }, 12 | plugins: [], 13 | }; 14 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | If you are adding a new RPC, please answer the following questions. 2 | 3 | #### Link the service provider's website (the company/protocol/individual providing the RPC): 4 | 5 | 6 | #### Provide a link to your privacy policy: 7 | 8 | 9 | #### If the RPC has none of the above and you still think it should be added, please explain why: 10 | 11 | Your RPC should always be added at the end of the array. -------------------------------------------------------------------------------- /constants/walletIcons.js: -------------------------------------------------------------------------------- 1 | export const walletIcons = { 2 | "Coinbase Wallet": "/connectors/coinbaseWalletIcon.svg", 3 | XDEFI: "/connectors/icn-xdefi.svg", 4 | Taho: "/connectors/icn-taho.svg", 5 | "Brave Wallet": "/connectors/icn-bravewallet.svg", 6 | Metamask: "/connectors/icn-metamask.svg", 7 | imToken: "/connectors/icn-imtoken.svg", 8 | Wallet: "/connectors/icn-metamask.svg", 9 | "Trust Wallet": "/connectors/icon-trust.svg", 10 | }; 11 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "cleanUrls": true, 3 | "redirects": [ 4 | { 5 | "source": "/top-rpcs/:path*", 6 | "destination": "/chain/:path*", 7 | "permanent": true 8 | }, 9 | { 10 | "source": "/best-rpcs/:path*", 11 | "destination": "/chain/:path*", 12 | "permanent": true 13 | }, 14 | { 15 | "source": "/_next/image(/?):params*", 16 | "destination": "https://icons.llamao.fi/icons/misc/sus-chainlist" 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-90025.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "AIPaw Mainnet", 3 | "chain": "aipaw", 4 | "rpc": [ 5 | "https://rpc.aipaw.xyz", 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "Aipaw", 10 | "symbol": "AIPAW", 11 | "decimals": 18 12 | }, 13 | "features": [{ "name": "EIP155" }], 14 | "infoURL": "https://aipaw.top", 15 | "shortName": "apaw", 16 | "chainId": 90025, 17 | "networkId": 90025, 18 | "icon": "aipaw", 19 | "explorers": [] 20 | } -------------------------------------------------------------------------------- /public/connectors/coinbaseWalletIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /generate-json.js: -------------------------------------------------------------------------------- 1 | import {generateChainData} from "./utils/fetch.js" 2 | import {writeFileSync} from "fs" 3 | 4 | 5 | async function writeRpcsJson(){ 6 | const rpcs = await generateChainData() 7 | 8 | const cleanedRpcs = rpcs.map(chain => { 9 | if (chain.rpc) { 10 | chain.rpc = chain.rpc.map(rpcEntry => { 11 | const { trackingDetails, ...rest } = rpcEntry 12 | return rest 13 | }) 14 | } 15 | return chain 16 | }) 17 | 18 | writeFileSync("out/rpcs.json", JSON.stringify(cleanedRpcs, null, 2)) 19 | } 20 | writeRpcsJson(); -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-10121.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | name: "Ozone Mainnet", 3 | chain: "OZONE", 4 | icon: "ozone", 5 | rpc: ["https://chain.ozonescan.com"], 6 | features: [{ name: "EIP155" }, { name: "EIP1559" }], 7 | faucets: [], 8 | nativeCurrency: { 9 | name: "Ozone", 10 | symbol: "OZONE", 11 | decimals: 18, 12 | }, 13 | infoURL: "https://ozonechain.com", 14 | shortName: "ozone", 15 | chainId: 10121, 16 | networkId: 10121, 17 | explorers: [ 18 | { 19 | name: "Ozone Chain Explorer", 20 | url: "https://ozonescan.com", 21 | }, 22 | ], 23 | }; 24 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-1440000.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "XRPL EVM", 3 | "chain": "XRPL", 4 | "icon": "xrpl evm", 5 | "rpc": [ 6 | "https://rpc.xrplevm.org/", 7 | ], 8 | "faucets": [], 9 | "nativeCurrency": { 10 | "name": "XRP", 11 | "symbol": "XRP", 12 | "decimals": 18 13 | }, 14 | "infoURL": "https://www.xrplevm.org/", 15 | "shortName": "xrplevm", 16 | "chainId": 1440000, 17 | "networkId": 1440000, 18 | "slip44": 144, 19 | "explorers": [ 20 | { 21 | "name": "XRPL EVM Explorer", 22 | "url": "https://explorer.xrplevm.org", 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-202506.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Aurex Testnet", 3 | "chain": "AUREX", 4 | "rpc": [ 5 | "https://aurexgold.com:3000" 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "Aurex", 10 | "symbol": "AUREX", 11 | "decimals": 18 12 | }, 13 | "infoURL": "https://aurexgold.com", 14 | "shortName": "aurext", 15 | "chainId": 202506, 16 | "networkId": 202506, 17 | "slip44": 1, 18 | "explorers": [ 19 | { 20 | "name": "Aurex Testnet Explorer", 21 | "url": "https://aurexgold.com:4001", 22 | "standard": "EIP3091" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-1990.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "QIE Mainnet", 3 | "chain": "QIE", 4 | "rpc": [ 5 | "https://rpc1mainnet.qie.digital", 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "QIE", 10 | "symbol": "QIE", 11 | "decimals": 18 12 | }, 13 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 14 | "infoURL": "https://www.qie.digital/", 15 | "shortName": "QIE", 16 | "chainId": 1990, 17 | "networkId": 1990, 18 | "icon": "QIE", 19 | "explorers": [{ 20 | "name": "QIE mainnet explorer", 21 | "url": "https://mainnet.qie.digital/", 22 | }] 23 | }; 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # generated files 4 | constants/additionalChainRegistry/list.js 5 | 6 | # dependencies 7 | /node_modules 8 | /.pnp 9 | .pnp.js 10 | 11 | # testing 12 | /coverage 13 | 14 | # next.js 15 | /.next/ 16 | /out/ 17 | 18 | # production 19 | /build 20 | 21 | # misc 22 | .DS_Store 23 | *.pem 24 | 25 | # debug 26 | npm-debug.log* 27 | yarn-debug.log* 28 | yarn-error.log* 29 | 30 | # local env files 31 | .env.local 32 | .env.development.local 33 | .env.test.local 34 | .env.production.local 35 | .env 36 | 37 | # vercel 38 | .vercel 39 | 40 | # others 41 | build.log 42 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-4048.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "GANchain L1", 3 | "chain": "GAN", 4 | "rpc": [ 5 | "https://rpc.gpu.net", 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "GPUnet", 10 | "symbol": "GPU", 11 | "decimals": 18 12 | }, 13 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 14 | "infoURL": "https://gpu.net", 15 | "shortName": "gan", 16 | "chainId": 4048, 17 | "networkId": 4048, 18 | "icon": "gpu", 19 | "explorers": [{ 20 | "name": "ganscan", 21 | "url": "https://ganscan.gpu.net", 22 | "icon": "gpu", 23 | "standard": "EIP3091" 24 | }] 25 | } 26 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-9.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Quai Mainnet", 3 | "chain": "QUAI", 4 | "rpc": [ 5 | "https://rpc.quai.network/cyprus1", 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "Quai", 10 | "symbol": "QUAI", 11 | "decimals": 18 12 | }, 13 | "features": [{ "name": "EIP155" }], 14 | "infoURL": "https://qu.ai", 15 | "shortName": "quai", 16 | "chainId": 9, 17 | "networkId": 9, 18 | "icon": "quai", 19 | "explorers": [{ 20 | "name": "Quaiscan", 21 | "url": "https://quaiscan.io", 22 | "icon": "quaiscan", 23 | "standard": "EIP3091" 24 | }] 25 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-10001.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "ETHW-mainnet", 3 | "chain": "ETHW", 4 | "icon": "ethpow", 5 | "rpc": [ 6 | "https://mainnet.ethereumpow.org/" 7 | ], 8 | "features": [{ "name": "EIP155" }], 9 | "faucets": [], 10 | "nativeCurrency": { 11 | "name": "EthereumPoW", 12 | "symbol": "ETHW", 13 | "decimals": 18 14 | }, 15 | "infoURL": "https://ethereumpow.org/", 16 | "shortName": "ethw", 17 | "chainId": 10001, 18 | "networkId": 10001, 19 | "explorers": [ 20 | { 21 | "name": "Oklink", 22 | "url": "https://www.oklink.com/ethw/" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-2105.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "IBVM Mainnet", 3 | "chain": "IBVM Mainnet", 4 | "icon": "ibvm", 5 | "rpc": [ 6 | "https://rpc-mainnet.ibvm.io/" 7 | ], 8 | "nativeCurrency": { 9 | "name": "IBVM Bitcoin", 10 | "symbol": "BTC", 11 | "decimals": 18 12 | }, 13 | "infoURL": "https://ibvm.io/", 14 | "shortName": "IBVM", 15 | "chainId": 2105, 16 | "networkId": 2105, 17 | "explorers": [ 18 | { 19 | "name": "IBVM explorer", 20 | "url": "https://mainnet-explorer.ibvm.io", 21 | "standard": "EIP3091" 22 | } 23 | ], 24 | "status": "active" 25 | } 26 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-9030.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Qubetics Mainnet", 3 | "chain": "QUBETICS", 4 | "rpc": [ 5 | "https://rpc.qubetics.com", 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "TICS", 10 | "symbol": "TICS", 11 | "decimals": 18 12 | }, 13 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 14 | "infoURL": "https://www.qubetics.com", 15 | "shortName": "TICS", 16 | "chainId": 9030, 17 | "networkId": 9030, 18 | "icon": "TICS", 19 | "explorers": [{ 20 | "name": "QUBETICS mainnet explorer", 21 | "url": "https://ticsscan.com", 22 | }] 23 | }; 24 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-688688.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Pharos Testnet", 3 | "title": "Pharos Testnet", 4 | "chain": "Pharos", 5 | "icon": "pharostestnet", 6 | "rpc": ["https://testnet.dplabs-internal.com"], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "PHRS", 10 | "symbol": "PHRS", 11 | "decimals": 18 12 | }, 13 | "infoURL": "https://testnet.pharosnetwork.xyz/", 14 | "shortName": "pharos-testnet", 15 | "chainId": 688688, 16 | "networkId": 688688, 17 | "explorers": [ 18 | { 19 | "name": "Pharos Testnet Explorer", 20 | "url": "https://testnet.pharosscan.xyz", 21 | "standard": "EIP3091" 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-210000.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "JuChain Mainnet", 3 | "chain": "JU", 4 | "rpc": [ 5 | "https://rpc.juchain.org" 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "JUcoin", 10 | "symbol": "JU", 11 | "decimals": 18 12 | }, 13 | "features": [ 14 | { "name": "EIP155" }, 15 | { "name": "EIP1559" } 16 | ], 17 | "infoURL": "https://juchain.org", 18 | "shortName": "juchain", 19 | "chainId": 210000, 20 | "icon": "juchain", 21 | "explorers": [ 22 | { 23 | "name": "juscan", 24 | "url": "https://juscan.io", 25 | "icon": "juscan", 26 | "standard": "EIP3091" 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-3109.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "SatoshiVM", 3 | "chain": "BTC", 4 | "icon": "satoshivm", 5 | "rpc": [ 6 | "https://alpha-rpc-node-http.svmscan.io/" 7 | ], 8 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 9 | "faucets": [], 10 | "nativeCurrency": { 11 | "name": "SatoshiVM", 12 | "symbol": "BTC", 13 | "decimals": 18 14 | }, 15 | "infoURL": "https://www.satoshivm.io/", 16 | "shortName": "svm", 17 | "chainId": 3109, 18 | "networkId": 3109, 19 | "explorers": [ 20 | { 21 | "name": "Svmscan", 22 | "url": "https://svmscan.io/" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-13863860.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Symbiosis", 3 | "chain": "SIS", 4 | "icon": "symbiosis", 5 | "rpc": [ 6 | "https://symbiosis.calderachain.xyz/http", 7 | ], 8 | "faucets": [], 9 | "nativeCurrency": { 10 | "name": "Symbiosis", 11 | "symbol": "SIS", 12 | "decimals": 18 13 | }, 14 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 15 | "infoURL": "https://symbiosis.finance", 16 | "shortName": "sis", 17 | "chainId": 13863860, 18 | "networkId": 13863860, 19 | "explorers": [ 20 | { 21 | "name": "Symbiosis explorer", 22 | "url": "https://symbiosis.calderaexplorer.xyz" 23 | } 24 | ] 25 | } 26 | 27 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-586.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "MarketCapy TestNet 1", 3 | "chain": "CAPY", 4 | "rpc": [ 5 | "https://fraa-flashbox-4646-rpc.a.stagenet.tanssi.network" 6 | ], 7 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 8 | "faucets": [], 9 | "nativeCurrency": { 10 | "name": "CAPY", 11 | "symbol": "CAPY", 12 | "decimals": 18 13 | }, 14 | "infoURL": "https://marketcapy.xyz/", 15 | "shortName": "capy", 16 | "chainId": 586, 17 | "networkId": 586, 18 | "explorers": [ 19 | { 20 | "name": "Capy Explorer", 21 | "url": "https://explorer.marketcapy.xyz/" 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /serve.json: -------------------------------------------------------------------------------- 1 | { 2 | "cleanUrls": true, 3 | "redirects": [ 4 | { 5 | "source": "/top-rpcs/:path*", 6 | "destination": "/chain/:path*", 7 | "type": 308 8 | }, 9 | { 10 | "source": "/best-rpcs/:path*", 11 | "destination": "/chain/:path*", 12 | "type": 308 13 | }, 14 | { 15 | "source": "/_next/image**", 16 | "destination": "https://icons.llamao.fi/icons/misc/sus-chainlist", 17 | "type": 302 18 | } 19 | ], 20 | "headers": [ 21 | { 22 | "source" : "rpcs.json", 23 | "headers" : [{ 24 | "key" : "Access-Control-Allow-Origin", 25 | "value" : "*" 26 | }] 27 | } 28 | ], 29 | "directoryListing": false 30 | } 31 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-657468.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Ethereal Testnet", 3 | "title": "Ethereal Testnet", 4 | "chain": "Ethereal", 5 | "icon": "etherealtestnet", 6 | "rpc": ["https://rpc.etherealtest.net"], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "USDe", 10 | "symbol": "USDe", 11 | "decimals": 18 12 | }, 13 | "infoURL": "https://www.ethereal.trade/", 14 | "shortName": "ethereal-testnet", 15 | "chainId": 657468, 16 | "networkId": 657468, 17 | "explorers": [ 18 | { 19 | "name": "blockscout", 20 | "url": "https://explorer.etherealtest.net", 21 | "icon": "blockscout", 22 | "standard": "EIP3091" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-202599.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "JuChain Testnet", 3 | "chain": "JU", 4 | "rpc": [ 5 | "https://testnet-rpc.juchain.org" 6 | ], 7 | "faucets": [], 8 | "nativeCurrency": { 9 | "name": "JUcoin", 10 | "symbol": "JU", 11 | "decimals": 18 12 | }, 13 | "features": [ 14 | { "name": "EIP155" }, 15 | { "name": "EIP1559" } 16 | ], 17 | "infoURL": "https://juchain.org", 18 | "shortName": "ju", 19 | "chainId": 202599, 20 | "icon": "juchain", 21 | "explorers": [ 22 | { 23 | "name": "juscan-testnet", 24 | "url": "https://testnet.juscan.io", 25 | "icon": "juscan", 26 | "standard": "EIP3091" 27 | } 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-612055.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "CROSS Mainnet", 3 | "chain": "CROSS", 4 | "rpc": [ 5 | "https://mainnet.crosstoken.io:22001", 6 | "wss://mainnet.crosstoken.io:32001" 7 | ], 8 | "faucets": [], 9 | "nativeCurrency": { 10 | "name": "CROSS", 11 | "symbol": "CROSS", 12 | "decimals": 18 13 | }, 14 | "infoURL": "https://to.nexus", 15 | "shortName": "cross", 16 | "chainId": 612055, 17 | "networkId": 612055, 18 | "icon": "cross", 19 | "slip44": 1100, 20 | "explorers": [ 21 | { 22 | "name": "CROSS Explorer", 23 | "url": "https://www.crossscan.io", 24 | "icon": "cross", 25 | "standard": "EIP3091" 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-97741.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "PEPE Unchained", 3 | "chain": "PEPU", 4 | "icon": "pepu", 5 | "rpc": [ 6 | "https://rpc-pepu-v2-mainnet-0.t.conduit.xyz", 7 | ], 8 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 9 | "faucets": [], 10 | "nativeCurrency": { 11 | "name": "Pepe Unchained", 12 | "symbol": "PEPU", 13 | "decimals": 18 14 | }, 15 | "infoURL": "https://pepeunchained.com/", 16 | "shortName": "pepu", 17 | "chainId": 97741, 18 | "networkId": 97741, 19 | "explorers": [ 20 | { 21 | "name": "PEPUScan", 22 | "url": "https://pepuscan.com/" 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | import { QueryClientProvider, QueryClient } from "@tanstack/react-query"; 3 | // import { NextIntlProvider } from "next-intl"; 4 | import { useAnalytics } from "../hooks/useAnalytics"; 5 | import "../styles/globals.css"; 6 | 7 | function App({ Component, pageProps }) { 8 | useAnalytics(); 9 | 10 | const [queryClient] = React.useState(() => new QueryClient()); 11 | 12 | return ( 13 | 14 | {/* */} 15 | 16 | {/* */} 17 | {/* */} 18 | 19 | ); 20 | } 21 | 22 | export default App; 23 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-2107.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "IBVM Testnet", 3 | "chain": "IBVM Testnet", 4 | "icon": "ibvmtest", 5 | "rpc": [ 6 | "https://rpc-testnet.ibvm.io/" 7 | ], 8 | "faucets": ["https://faucet.ibvm.io"], 9 | "nativeCurrency": { 10 | "name": "IBVM Bitcoin", 11 | "symbol": "BTC", 12 | "decimals": 18 13 | }, 14 | "infoURL": "https://ibvm.io/", 15 | "shortName": "IBVMT", 16 | "chainId": 2107, 17 | "networkId": 2107, 18 | "explorers": [ 19 | { 20 | "name": "IBVM Testnet explorer", 21 | "url": "https://testnet-explorer.ibvm.io", 22 | "standard": "EIP3091" 23 | } 24 | ], 25 | "status": "active" 26 | } 27 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-612044.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "CROSS Testnet", 3 | "chain": "TCROSS", 4 | "rpc": [ 5 | "https://testnet.crosstoken.io:22001", 6 | "wss://testnet.crosstoken.io:32001" 7 | ], 8 | "faucets": [], 9 | "nativeCurrency": { 10 | "name": "TestnetCROSS", 11 | "symbol": "tCROSS", 12 | "decimals": 18 13 | }, 14 | "infoURL": "https://to.nexus", 15 | "shortName": "tcross", 16 | "chainId": 612044, 17 | "networkId": 612044, 18 | "icon": "cross", 19 | "slip44": 1, 20 | "explorers": [ 21 | { 22 | "name": "CROSS Testnet Explorer", 23 | "url": "https://testnet.crossscan.io", 24 | "icon": "cross", 25 | "standard": "EIP3091", 26 | } 27 | ] 28 | }; 29 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-5151706.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Loot Mainnet", 3 | "chain": "LOOT", 4 | "icon": "loot", 5 | "rpc": [ 6 | "https://rpc.lootchain.com/http/", 7 | "wss://rpc.lootchain.com/ws" 8 | ], 9 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 10 | "faucets": [], 11 | "nativeCurrency": { 12 | "name": "Adventure Gold", 13 | "symbol": "AGLD", 14 | "decimals": 18 15 | }, 16 | "infoURL": "https://adventuregold.org/", 17 | "shortName": "loot", 18 | "chainId": 5151706, 19 | "networkId": 5151706, 20 | "explorers": [ 21 | { 22 | "name": "Lootscan", 23 | "url": "https://explorer.lootchain.com/" 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-15000.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Quai Orchard Testnet", 3 | "chain": "QUAI", 4 | "rpc": [ 5 | "https://orchard.rpc.quai.network/cyprus1", 6 | ], 7 | "faucets": ["https://orchard.faucet.quai.network"], 8 | "nativeCurrency": { 9 | "name": "Quai", 10 | "symbol": "QUAI", 11 | "decimals": 18 12 | }, 13 | "features": [{ "name": "EIP155" }], 14 | "infoURL": "https://qu.ai", 15 | "shortName": "quait", 16 | "chainId": 15000, 17 | "networkId": 15000, 18 | "icon": "quai", 19 | "explorers": [{ 20 | "name": "Orchard Quaiscan", 21 | "url": "https://orchard.quaiscan.io", 22 | "icon": "quaiscan", 23 | "standard": "EIP3091" 24 | }] 25 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-1380012617.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "RARI Chain", 3 | "chain": "RARI", 4 | "icon": "rari", 5 | "rpc": [ 6 | "https://mainnet.rpc.rarichain.org/http/", 7 | "wss://mainnet.rpc.rarichain.org/ws" 8 | ], 9 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 10 | "faucets": [], 11 | "nativeCurrency": { 12 | "name": "Ethereum", 13 | "symbol": "ETH", 14 | "decimals": 18 15 | }, 16 | "infoURL": "https://rarichain.org/", 17 | "shortName": "rari", 18 | "chainId": 1380012617, 19 | "networkId": 1380012617, 20 | "explorers": [ 21 | { 22 | "name": "Blockscout", 23 | "url": "https://mainnet.explorer.rarichain.org/" 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-4227.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Hashfire Testnet", 3 | "chain": "Hashfire Testnet", 4 | "icon": "hashfire", 5 | "rpc": [ 6 | "https://subnets.avax.network/hashfire/testnet/rpc", 7 | ], 8 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 9 | "faucets": [], 10 | "nativeCurrency": { 11 | "name": "HASHD", 12 | "symbol": "HASHD", 13 | "decimals": 18 14 | }, 15 | "infoURL": "https://hashfire.xyz/", 16 | "shortName": "hashfire", 17 | "chainId": 4227, 18 | "networkId": 4227, 19 | "explorers": [ 20 | { 21 | "name": "Avalanche L1 Explorer", 22 | "url": "https://subnets-test.avax.network/hashfire/", 23 | "standard": "EIP3091" 24 | } 25 | ] 26 | } 27 | -------------------------------------------------------------------------------- /hooks/useLlamaNodesRpcData.js: -------------------------------------------------------------------------------- 1 | import { useMemo } from "react"; 2 | 3 | import { llamaNodesRpcs } from "../constants/llamaNodesRpcs"; 4 | import { arrayMove } from "../utils/fetch"; 5 | 6 | export const useLlamaNodesRpcData = (chainId, data) => { 7 | const [rpcData, hasLlamaNodesRpc] = useMemo(() => { 8 | const llamaNodesRpc = llamaNodesRpcs[chainId] ?? null; 9 | 10 | if (llamaNodesRpc) { 11 | const llamaNodesRpcIndex = data.findIndex(rpc => rpc?.data.url === llamaNodesRpc.rpcs[0].url); 12 | 13 | if (llamaNodesRpcIndex || llamaNodesRpcIndex === 0) { 14 | return [arrayMove(data, llamaNodesRpcIndex, 0), true]; 15 | } 16 | 17 | return [data, false]; 18 | } 19 | 20 | return [data, false]; 21 | }, [chainId, data]); 22 | 23 | return { rpcData, hasLlamaNodesRpc }; 24 | } 25 | -------------------------------------------------------------------------------- /public/connectors/icn-trust.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /hooks/useConnect.jsx: -------------------------------------------------------------------------------- 1 | import { useMutation, QueryClient } from "@tanstack/react-query"; 2 | 3 | export async function connectWallet() { 4 | try { 5 | if (window.ethereum) { 6 | const accounts = await window.ethereum.request({ 7 | method: "eth_requestAccounts", 8 | }); 9 | 10 | return { 11 | address: accounts && accounts.length > 0 ? (accounts[0]) : null, 12 | }; 13 | } else { 14 | throw new Error("No Ethereum Wallet"); 15 | } 16 | } catch (error) { 17 | console.log(error); 18 | return { address: null }; 19 | } 20 | } 21 | 22 | export default function useConnect() { 23 | const queryClient = new QueryClient(); 24 | 25 | return useMutation(() => connectWallet(), { 26 | onSettled: () => { 27 | queryClient.invalidateQueries(); 28 | }, 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /hooks/useAccount.jsx: -------------------------------------------------------------------------------- 1 | import { useQuery } from "@tanstack/react-query"; 2 | 3 | async function getAccount() { 4 | try { 5 | if (window.ethereum && window.ethereum.selectedAddress) { 6 | const chainId = await window.ethereum.request({ 7 | method: "net_version", 8 | }); 9 | 10 | return { 11 | chainId: Number(chainId), 12 | address: window.ethereum.selectedAddress, 13 | isConnected: window.ethereum.selectedAddress ? true : false, 14 | }; 15 | } else { 16 | throw new Error("No Ethereum Wallet"); 17 | } 18 | } catch (error) { 19 | console.log(error); 20 | return { chainId: null, address: null, isConnected: false }; 21 | } 22 | } 23 | 24 | export default function useAccount() { 25 | return useQuery(["accounts"], () => getAccount(), { retry: 0 }); 26 | } 27 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-2020.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Ronin", 3 | "chain": "RON", 4 | "icon": "ronin", 5 | "rpc": [ 6 | "https://api.roninchain.com/rpc", 7 | "https://api-gateway.skymavis.com/rpc?apikey=9aqYLBbxSC6LROynQJBvKkEIsioqwHmr", 8 | "https://ronin.lgns.net/rpc", 9 | "https://ronin.drpc.org" 10 | ], 11 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 12 | "faucets": ["https://faucet.roninchain.com"], 13 | "nativeCurrency": { 14 | "name": "Ronin", 15 | "symbol": "RON", 16 | "decimals": 18 17 | }, 18 | "infoURL": "https://roninchain.com/", 19 | "shortName": "ronin", 20 | "chainId": 2020, 21 | "networkId": 2020, 22 | "explorers": [ 23 | { 24 | "name": "Ronin Explorer", 25 | "url": "https://app.roninchain.com/" 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-88888.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Chiliz Chain", 3 | "chain": "CHZ", 4 | "icon": "chiliz", 5 | "rpc": [ 6 | "https://rpc.chiliz.com", 7 | "https://rpc.ankr.com/chiliz/", 8 | "https://chiliz.publicnode.com" 9 | ], 10 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 11 | "faucets": [], 12 | "nativeCurrency": { 13 | "name": "Chiliz", 14 | "symbol": "CHZ", 15 | "decimals": 18 16 | }, 17 | "infoURL": "https://www.chiliz.com/", 18 | "shortName": "chiliz", 19 | "chainId": 88888, 20 | "networkId": 88888, 21 | "explorers": [ 22 | { 23 | "name": "Chiliscan", 24 | "url": "https://chiliscan.com/", 25 | "standard": "EIP3091" 26 | }, 27 | { 28 | "name": "Scan Chiliz", 29 | "url": "https://scan.chiliz.com" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-999.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "HyperEVM", 3 | "chain": "HYPE", 4 | "icon": "hyperliquid", 5 | "rpc": [ 6 | "https://rpc.hyperliquid.xyz/evm", 7 | "https://rpc.hypurrscan.io", 8 | "https://hyperliquid-json-rpc.stakely.io", 9 | "https://hyperliquid.drpc.org", 10 | "wss://hyperliquid.drpc.org", 11 | "https://rpc.hyperlend.finance" 12 | ], 13 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 14 | "faucets": [], 15 | "nativeCurrency": { 16 | "name": "HYPE", 17 | "symbol": "HYPE", 18 | "decimals": 18 19 | }, 20 | "infoURL": "https://hyperfoundation.org/", 21 | "shortName": "hyper_evm", 22 | "chainId": 999, 23 | "networkId": 999, 24 | "explorers": [ 25 | { 26 | "name": "Purrsec", 27 | "url": "https://purrsec.com/" 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /translations/zh.json: -------------------------------------------------------------------------------- 1 | { 2 | "Common": { 3 | "connect-wallet": "连接钱包", 4 | "view-source-code": "查看源代码", 5 | "join-our-discord": "加入 社群", 6 | "currency": "代币", 7 | "search-networks": "查找网络", 8 | "description": "ChainList 是 EVM 网络的列表。 用户可以使用这些信息将他们的钱包和 Web3 中间件提供商连接到适当的Chain ID 和网络 ID,以连接到正确的链。", 9 | "help-info": "帮助用户连接到 EVM 驱动的网络", 10 | "add-your-network": "添加你的网络", 11 | "add-your-rpc": "添加你的RPC", 12 | "language": "English", 13 | "add-to-metamask": "添加到Metamask", 14 | "add-to-imToken": "添加到imToken", 15 | "add-to-wallet": "添加到Wallet", 16 | "add-to-xdefi": "添加到XDEFI", 17 | "toggle-theme": "切换主题", 18 | "add-to-brave": "添加到Brave", 19 | "add-to-coinbase": "添加到Coinbase Wallet", 20 | "add-to-taho": "添加到Taho", 21 | "add-to-trust": "添加到Trust Wallet", 22 | "contact-us": "联系我们", 23 | "no-privacy-info": "没有隐私信息", 24 | "your-ad-here": "您的广告在这里" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-239.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "TAC Mainnet", 3 | "title": "TAC Mainnet", 4 | "chain": "TAC", 5 | "icon": "tac", 6 | "rpc": [ 7 | "https://rpc.tac.build", 8 | "https://rpc.ankr.com/tac", 9 | "https://ws.rpc.tac.build" 10 | ], 11 | "faucets": [], 12 | "nativeCurrency": { 13 | "name": "TAC", 14 | "symbol": "TAC", 15 | "decimals": 18 16 | }, 17 | "infoURL": "https://tac.build/", 18 | "shortName": "tacchain", 19 | "slip44": 60, 20 | "chainId": 239, 21 | "networkId": 239, 22 | "explorers": [ 23 | { 24 | "name": "TAC Explorer", 25 | "url": "https://explorer.tac.build", 26 | "standard": "EIP3091" 27 | }, 28 | { 29 | "name": "Blockscout", 30 | "url": "https://tac.blockscout.com", 31 | "standard": "EIP3091" 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chainlist", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "./scripts/build.sh", 8 | "export": "echo deprecated", 9 | "build2": "./scripts/build.sh", 10 | "start": "next start", 11 | "serve": "serve out" 12 | }, 13 | "dependencies": { 14 | "@ariakit/react": "^0.2.12", 15 | "@hypelab/sdk-react": "^1.0.2", 16 | "@tanstack/react-query": "^4.19.1", 17 | "axios": "^1.2.1", 18 | "fathom-client": "^3.5.0", 19 | "next": "^14.0.0", 20 | "next-intl": "^2.10.2", 21 | "node-fetch": "^2.6.6", 22 | "react": "^18.2.0", 23 | "react-dom": "^18.2.0", 24 | "react-linkify": "^1.0.0-alpha", 25 | "serve": "^14.1.2", 26 | "zustand": "^4.1.5" 27 | }, 28 | "devDependencies": { 29 | "autoprefixer": "^10.4.13", 30 | "dotenv": "^16.0.3", 31 | "postcss": "^8.4.19", 32 | "tailwindcss": "^3.2.4" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-2030232745.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Lumia Beam Testnet", 3 | "shortName": "lumia-beam-testnet", 4 | "title": "Lumia Beam Testnet", 5 | "chain": "ETH", 6 | "icon": "lumia", 7 | "rpc": ["https://beam-rpc.lumia.org"], 8 | "faucets": ["https://beam-faucet.lumia.org/"], 9 | "nativeCurrency": { 10 | "name": "Lumia", 11 | "symbol": "LUMIA", 12 | "decimals": 18 13 | }, 14 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 15 | "infoURL": "https://lumia.org", 16 | "chainId": 2030232745, 17 | "networkId": 2030232745, 18 | "explorers": [ 19 | { 20 | "name": "Lumia Beam Testnet Explorer", 21 | "url": "https://beam-explorer.lumia.org", 22 | "icon": "lumia", 23 | "standard": "EIP3091" 24 | } 25 | ], 26 | "parent": { 27 | "type": "L2", 28 | "chain": "eip155-1", 29 | "bridges": [ 30 | { 31 | "url": "https://beam-bridge.lumia.org" 32 | } 33 | ] 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /constants/additionalChainRegistry/chainid-1439.js: -------------------------------------------------------------------------------- 1 | export const data = { 2 | "name": "Injective Testnet", 3 | "chain": "Injective", 4 | "icon": "injective", 5 | "rpc": [ 6 | "https://testnet.sentry.chain.json-rpc.injective.network", 7 | "wss://testnet.sentry.chain.json-rpc.injective.network", 8 | "https://injectiveevm-testnet-rpc.polkachu.com", 9 | "wss://injectiveevm-testnet-rpc.polkachu.com" 10 | ], 11 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 12 | "faucets": ["https://testnet.faucet.injective.network"], 13 | "nativeCurrency": { 14 | "name": "Injective", 15 | "symbol": "INJ", 16 | "decimals": 18 17 | }, 18 | "infoURL": "https://injective.com", 19 | "shortName": "injective-testnet", 20 | "chainId": 1439, 21 | "networkId": 1439, 22 | "explorers": [ 23 | { 24 | "name": "blockscout", 25 | "url": "https://testnet.blockscout.injective.network", 26 | "icon": "blockscout", 27 | "standard": "EIP3091" 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /hooks/useClipboard.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | export const useClipboard = (options) => { 4 | const [hasCopied, setHasCopied] = useState(false); 5 | 6 | const resetAfter = options && options.resetAfter || 1000; 7 | const onSuccess = options && options.onSuccess; 8 | const onError = options && options.onError; 9 | 10 | useEffect(() => { 11 | if (hasCopied && resetAfter) { 12 | const handler = setTimeout(() => { 13 | setHasCopied(false); 14 | }, resetAfter); 15 | 16 | return () => { 17 | clearTimeout(handler); 18 | }; 19 | } 20 | }, [hasCopied, resetAfter]); 21 | 22 | return { 23 | hasCopied, 24 | onCopy: async (data) => { 25 | try { 26 | if (typeof data !== "string") { 27 | data = JSON.stringify(data); 28 | } 29 | 30 | await navigator.clipboard.writeText(data); 31 | 32 | setHasCopied(true); 33 | 34 | if (onSuccess) { 35 | onSuccess(data); 36 | } 37 | } catch { 38 | if (onError) { 39 | onError(); 40 | } 41 | } 42 | }, 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /translations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "Common": { 3 | "connect-wallet": "Connect Wallet", 4 | "view-source-code": "View Code", 5 | "join-our-discord": "Join Discord", 6 | "currency": "Currency", 7 | "search-networks": "Search Networks", 8 | "description": "ChainList is a list of EVM networks. Users can use the information to connect their wallets and Web3 middleware providers to the appropriate Chain ID and Network ID to connect to the correct chain.", 9 | "help-info": "Helping users connect to EVM-powered networks", 10 | "add-your-network": "Add Your Network", 11 | "add-your-rpc": "Add Your RPC", 12 | "language": "中文", 13 | "add-to-metamask": "Add to Metamask", 14 | "add-to-imToken": "Add to imToken", 15 | "add-to-wallet": "Add to Wallet", 16 | "add-to-brave": "Add to Brave", 17 | "add-to-coinbase": "Add to Coinbase Wallet", 18 | "add-to-trust": "Add to Trust Wallet", 19 | "add-to-taho": "Add to Taho", 20 | "add-to-xdefi": "Add to XDEFI", 21 | "no-privacy-info": "No privacy info", 22 | "toggle-theme": "Toggle Theme", 23 | "your-ad-here": "Your ad here", 24 | "contact-us": "Contact us" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /components/Tooltip/index.js: -------------------------------------------------------------------------------- 1 | import Linkify from "react-linkify"; 2 | import { Tooltip as AriaTooltip, TooltipAnchor, useTooltipStore } from "@ariakit/react/tooltip"; 3 | 4 | export const Tooltip = ({ children, content, ...props }) => { 5 | const tooltip = useTooltipStore({ placement: "bottom", showTimeout: 100 }); 6 | 7 | if (!content) return {children}; 8 | 9 | return ( 10 | <> 11 | 17 | {children} 18 | 19 | 23 | ( 25 | 26 | {decoratedText} 27 | 28 | )} 29 | > 30 | {content} 31 | 32 | 33 | 34 | ); 35 | }; 36 | -------------------------------------------------------------------------------- /translations/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Common": { 3 | "connect-wallet": "Cüzdanı Bağla", 4 | "view-source-code": "Kodu Görüntüle", 5 | "join-our-discord": "Discord'a Katılın", 6 | "currency": "Para Birimi", 7 | "search-networks": "Ağları Ara", 8 | "description": "ChainList EVM ağlarının bir listesidir. Kullanıcılar, doğru zincire bağlanmak için cüzdanlarını ve Web3 ara katman yazılımı sağlayıcılarını uygun Chain ID ve Network ID'ye bağlamak için bu bilgileri kullanabilir.", 9 | "help-info": "Kullanıcıların EVM destekli ağlara bağlanmasına yardımcı olmak", 10 | "add-your-network": "Ağınızı Ekleyin", 11 | "add-your-rpc": "RPC'nizi Ekleyin", 12 | "language": "Türkçe", 13 | "add-to-metamask": "Metamask'a Ekle", 14 | "add-to-imToken": "imToken'a ekle", 15 | "add-to-wallet": "Cüzdana Ekle", 16 | "add-to-brave": "Brave'e ekle", 17 | "add-to-coinbase": "Coinbase Wallet'a Ekle", 18 | "add-to-trust": "Trust Wallet'a Ekle", 19 | "add-to-taho": "Taho'ya ekle", 20 | "add-to-xdefi": "XDEFI'ya ekle", 21 | "no-privacy-info": "Gizlilik bilgisi yok", 22 | "toggle-theme": "Temayı Değiştir", 23 | "your-ad-here": "Reklamınız burada görünür", 24 | "contact-us": "Bize ulaşın" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /hooks/useAnalytics.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useRouter } from 'next/router'; 3 | import * as Fathom from 'fathom-client'; 4 | 5 | export const FATHOM_EVENTS_ID = { 6 | 137: 'KZQZWMIP', 7 | }; 8 | 9 | export const FATHOM_DROPDOWN_EVENTS_ID = { 10 | 1: 'XIFGUQQY', 11 | 137: 'C6AYES3T', 12 | }; 13 | export const FATHOM_NO_EVENTS_ID = { 14 | 1: '7X05SCBE', 15 | 10: 'UJHQR5AT', 16 | 25: 'VEQDBWGQ', 17 | 56: 'NMO1JLYL', 18 | 137: 'BEKTDT7F', 19 | 250: 'KPCKMPYG', 20 | 8217: '9369UJ80', 21 | 42161: '9DNMZNFD', 22 | 43114: 'FRM17FBN', 23 | }; 24 | 25 | export const CHAINS_MONITOR = [1, 10, 25, 56, 137, 250, 8217, 42161, 43114]; 26 | 27 | export const useAnalytics = () => { 28 | const router = useRouter(); 29 | 30 | useEffect(() => { 31 | Fathom.load('TKCNGGEZ', { 32 | includedDomains: ['chainlist.defillama.com', 'chainlist.org'], 33 | url: 'https://surprising-powerful.llama.fi/script.js', 34 | }); 35 | 36 | const onRouteChangeComplete = () => { 37 | Fathom.trackPageview(); 38 | }; 39 | 40 | router.events.on('routeChangeComplete', onRouteChangeComplete); 41 | 42 | return () => { 43 | router.events.off('routeChangeComplete', onRouteChangeComplete); 44 | }; 45 | }, [router.events]); 46 | }; 47 | -------------------------------------------------------------------------------- /translations/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "Common": { 3 | "connect-wallet": "Sambungkan Dompet", 4 | "view-source-code": "Lihat Kode Sumber", 5 | "join-our-discord": "Gabung Discord", 6 | "currency": "Mata Uang", 7 | "search-networks": "Cari Jaringan", 8 | "description": "Chainlist adalah sebuah daftar jaringan EVM. Pengguna bisa menggunakan informasi untuk menghubungkan dompet mereka dan penyedia Web3 middleware ke Chain ID dan Network ID yang sesuai untuk terhubung ke jaringan yang benar.", 9 | "help-info": "Membantu pengguna terhubung ke jaringan yang didukung EVM", 10 | "add-your-network": "Tambahkan jaringan anda", 11 | "add-your-rpc": "Tambahkan RPC anda", 12 | "language": "English", 13 | "add-to-metamask": "Tambahkan ke Metamask", 14 | "add-to-imToken": "Tambahkan ke imToken", 15 | "add-to-wallet": "Tambahkan ke Dompet", 16 | "add-to-brave": "Tambahkan ke Brave", 17 | "add-to-coinbase": "Tambahkan ke Coinbase Wallet", 18 | "add-to-trust": "Tambahkan ke Trust Wallet", 19 | "add-to-taho": "Tambahkan ke Taho", 20 | "add-to-xdefi": "Tambahkan ke XDEFI", 21 | "no-privacy-info": "Tidak ada informasi privasi", 22 | "toggle-theme": "Beralih Tema", 23 | "your-ad-here": "Iklan anda disini", 24 | "contact-us": "Hubungi kami" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /translations/hi.json: -------------------------------------------------------------------------------- 1 | { 2 | "Common": { 3 | "connect-wallet": "वॉलेट कनेक्ट करें", 4 | "view-source-code": "स्रोत कोड देखें", 5 | "join-our-discord": "हमारे Discord समूह में शामिल हों", 6 | "currency": "मुद्रा", 7 | "search-networks": "नेटवर्क खोजें", 8 | "description": "चेनलिस्ट एक EVM नेटवर्कों की सूची है। उपयोगकर्ता इस जानकारी का उपयोग अपनी वॉलेट और वेब3 मिडलवेयर प्रदाताओं को विशेष चैन ID और नेटवर्क ID से जोड़ने के लिए कर सकते हैं ताकि सही चेन से कनेक्ट हो सकें।", 9 | "help-info": "उपयोगकर्ताओं को EVM पावर्ड नेटवर्कों से जोड़ने में मदद करना", 10 | "add-your-network": "अपना नेटवर्क जोड़ें", 11 | "add-your-rpc": "अपना RPC जोड़ें", 12 | "language": "हिन्दी", 13 | "add-to-metamask": "Metamask में जोड़ें", 14 | "add-to-imToken": "imToken में जोड़ें", 15 | "add-to-wallet": "वॉलेट में जोड़ें", 16 | "add-to-brave": "Brave में जोड़ें", 17 | "add-to-coinbase": "Coinbase वॉलेट में जोड़ें", 18 | "add-to-trust": "Trust वॉलेट में जोड़ें", 19 | "add-to-taho": "Taho में जोड़ें", 20 | "add-to-xdefi": "XDEFI में जोड़ें", 21 | "no-privacy-info": "कोई गोपनीयता जानकारी नहीं", 22 | "toggle-theme": "थीम टॉगल करें", 23 | "your-ad-here": "आपका विज्ञापन यहाँ", 24 | "contact-us": "हमसे संपर्क करें" 25 | } 26 | } -------------------------------------------------------------------------------- /translations/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "Common": { 3 | "connect-wallet": "Connecter le portefeuille", 4 | "view-source-code": "Consulter le code", 5 | "join-our-discord": "Rejoindre le Discord", 6 | "currency": "Monnaie", 7 | "search-networks": "Rechercher les réseaux", 8 | "description": "ChainList est une liste de réseaux EVM. Les utilisateurs peuvent utiliser les informations pour connecter leurs portefeuilles et leurs fournisseurs Web3 de middleware à l'ID de chaîne et l'ID de réseau appropriés pour se connecter à la bonne chaîne.", 9 | "help-info": "Aider les utilisateurs à se connecter aux réseaux alimentés par EVM", 10 | "add-your-network": "Ajouter votre réseau", 11 | "add-your-rpc": "Ajouter votre RPC", 12 | "language": "Français", 13 | "add-to-metamask": "Ajouter à Metamask", 14 | "add-to-imToken": "Ajouter à imToken", 15 | "add-to-wallet": "Ajouter au portefeuille", 16 | "add-to-brave": "Ajouter à Brave", 17 | "add-to-coinbase": "Ajouter à Coinbase Wallet", 18 | "add-to-trust": "Ajouter à Trust Wallet", 19 | "add-to-xdefi": "Ajouter à XDEFI", 20 | "no-privacy-info": "Aucune information de confidentialité", 21 | "add-to-taho": "Ajouter à Taho", 22 | "contact-us": "Contactez-nous", 23 | "toggle-theme": "Changer le thème", 24 | "your-ad-here": "Votre publicité ici" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chainlist 2 | 3 | ## Add a chain 4 | 5 | Submit a PR that adds a new file to the [constants/additionalChainRegistry folder](https://github.com/DefiLlama/chainlist/tree/main/constants/additionalChainRegistry). The new file should be named `chainid-{chainid_number}.js` and the contents should follow this structure: 6 | ``` 7 | { 8 | "name": "Ethereum Mainnet", 9 | "chain": "ETH", 10 | "rpc": [ 11 | "https://eth.llamarpc.com", 12 | ], 13 | "faucets": [], 14 | "nativeCurrency": { 15 | "name": "Ether", 16 | "symbol": "ETH", 17 | "decimals": 18 18 | }, 19 | "features": [{ "name": "EIP155" }, { "name": "EIP1559" }], 20 | "infoURL": "https://ethereum.org", 21 | "shortName": "eth", 22 | "chainId": 1, 23 | "networkId": 1, 24 | "icon": "ethereum", 25 | "explorers": [{ 26 | "name": "etherscan", 27 | "url": "https://etherscan.io", 28 | "icon": "etherscan", 29 | "standard": "EIP3091" 30 | }] 31 | } 32 | ``` 33 | 34 | ## Add an RPC to a chain that is already listed 35 | 36 | If you wish to add your RPC, please submit a PR modifying [constants/extraRpcs.js](https://github.com/DefiLlama/chainlist/blob/main/constants/extraRpcs.js) to add your RPC to the given chains. 37 | 38 | ## API 39 | The following API returns all the data in our website, including chain data along with all of their RPCs: 40 | 41 | https://chainlist.org/rpcs.json 42 | -------------------------------------------------------------------------------- /constants/llamaNodesRpcs.js: -------------------------------------------------------------------------------- 1 | const privacyStatement = 'LlamaNodes is open-source and does not track or store user information that transits through our RPCs (location, IP, wallet, etc). To learn more, have a look at the public Privacy Policy in our docs: https://llamanodes.notion.site/Privacy-Practices-f20fd8fdd02a469d9d4f42a5989bb936' 2 | 3 | export const llamaNodesRpcs = { 4 | 1: { 5 | name: 'Ethereum LlamaNodes', 6 | rpcs: [ 7 | { 8 | url: 'https://eth.llamarpc.com', 9 | tracking: 'none', 10 | trackingDetails: privacyStatement, 11 | isOpenSource: true, 12 | }, 13 | ] 14 | }, 15 | 8453: { 16 | name: 'Base LlamaNodes', 17 | rpcs: [ 18 | { 19 | url: 'https://base.llamarpc.com', 20 | tracking: 'none', 21 | trackingDetails: privacyStatement, 22 | isOpenSource: true, 23 | }, 24 | ] 25 | }, 26 | 56: { 27 | name: 'BNB Chain LlamaNodes', 28 | rpcs: [ 29 | { 30 | url: 'https://binance.llamarpc.com', 31 | tracking: 'none', 32 | trackingDetails: privacyStatement, 33 | isOpenSource: true, 34 | }, 35 | ] 36 | }, 37 | } 38 | 39 | export const llamaNodesRpcByUrl = {}; 40 | 41 | for (const chainId in llamaNodesRpcs) { 42 | const rpcs = llamaNodesRpcs[chainId].rpcs; 43 | llamaNodesRpcByUrl[rpcs[0].url] = llamaNodesRpcs[chainId]; 44 | } 45 | -------------------------------------------------------------------------------- /pages/api/chain/[chain].js: -------------------------------------------------------------------------------- 1 | import { fetcher, populateChain, arrayMove } from "../../../utils/fetch"; 2 | import { llamaNodesRpcs } from "../../../constants/llamaNodesRpcs"; 3 | import { overwrittenChains } from "../../../constants/additionalChainRegistry/list"; 4 | 5 | export default async function handler(req, res) { 6 | res.setHeader("Cache-Control", "s-maxage=3600, stale-while-revalidate"); 7 | 8 | const { chain: chainIdOrName } = req.query; 9 | 10 | if (req.method === "GET") { 11 | const [chains, chainTvls] = await Promise.all([ 12 | fetcher("https://chainid.network/chains.json"), 13 | fetcher("https://api.llama.fi/chains") 14 | ]); 15 | 16 | let chain = 17 | overwrittenChains.find( 18 | (chain) => chain.chainId.toString() === chainIdOrName || chain.shortName === chainIdOrName, 19 | ) ?? chains.find((chain) => chain.chainId.toString() === chainIdOrName || chain.shortName === chainIdOrName); 20 | 21 | if (!chain) { 22 | return res.status(404).json({ message: "chain not found" }); 23 | } 24 | 25 | chain = populateChain(chain, chainTvls); 26 | 27 | const llamaNodesRpc = llamaNodesRpcs[chain.chainId] ?? null; 28 | 29 | if (llamaNodesRpc) { 30 | const llamaNodesRpcIndex = chain.rpc.findIndex((rpc) => rpc.url === llamaNodesRpc.rpcs[0].url); 31 | 32 | if (llamaNodesRpcIndex || llamaNodesRpcIndex === 0) { 33 | chain.rpc = arrayMove(chain.rpc, llamaNodesRpcIndex, 0); 34 | } 35 | } 36 | 37 | return res.status(200).json(chain); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /public/connectors/icn-imtoken.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /pages/_document.js: -------------------------------------------------------------------------------- 1 | import Document, { Head, Main, NextScript, Html } from "next/document"; 2 | import Script from "next/script"; 3 | import React from "react"; 4 | import { HYPELAB_API_URL, HYPELAB_PROPERTY_SLUG } from "../constants/hypelab"; 5 | 6 | const LANGUAGES = ["en", "zh"]; 7 | 8 | function presetTheme() { 9 | const dark = localStorage.getItem("theme") === "dark"; 10 | 11 | if (dark) { 12 | document.body.classList.add("dark"); 13 | } 14 | } 15 | 16 | const themeScript = `(() => { ${presetTheme.toString()}; presetTheme() })()`; 17 | 18 | class MyDocument extends Document { 19 | render() { 20 | const pathPrefix = this.props.__NEXT_DATA__.page.split("/")[1]; 21 | const lang = LANGUAGES.indexOf(pathPrefix) !== -1 ? pathPrefix : LANGUAGES[0]; 22 | 23 | return ( 24 | 25 | 26 | 27 |