import { isAddress } from 'viem'; import { avalancheFuji, arbitrum, avalanche, base, blast, blastSepolia, bsc, kaia, mainnet, optimism, polygon, sepolia, baseSepolia, cyber, ham, cyberTestnet, degen, shibarium, shibariumTestnet, unichain, zora, apeChain, hashkey, } from 'viem/chains'; import { ChainNotSupportedError } from '../errors/sdk.errors'; import { getMintClubContractAddress, over, robinhood, SdkSupportedChainIds } from './contracts'; import * as chains from 'viem/chains'; export type ChainType = { readonly id: SdkSupportedChainIds; readonly name: | 'Ethereum' | 'Base' | 'Blast' | 'Cyber' | 'Degen' | 'Optimism' | 'Arbitrum' | 'Avalanche' | 'Polygon' | 'BNBChain' | 'Sepolia' | 'Kaia' | 'Ham' | 'Shibarium' | 'Puppynet' | 'BaseSepolia' | 'AvalancheFuji' | 'BlastSepolia' | 'CyberTestnet' | 'Unichain' | 'Zora' | 'Apechain' | 'Hashkey' | 'Robinhood' | 'Over'; readonly icon: string; readonly color: string; readonly openseaSlug?: string; readonly isTestnet?: boolean; readonly enabled?: boolean; readonly chain: chains.Chain; }; export const CHAINS: Array = [ { id: mainnet.id, name: 'Ethereum', icon: 'https://mint.club/assets/networks/ethereum@2x.png', color: '#627EEA', openseaSlug: 'ethereum', enabled: isAddress(getMintClubContractAddress('BOND', mainnet.id)), chain: mainnet, }, { id: base.id, name: 'Base', icon: 'https://mint.club/assets/networks/base@2x.png', color: '#0052FF', openseaSlug: 'base', enabled: isAddress(getMintClubContractAddress('BOND', base.id)), chain: base, }, { id: blast.id, name: 'Blast', icon: 'https://mint.club/assets/networks/blast@2x.png', color: '#FCFC03', openseaSlug: 'blast', enabled: isAddress(getMintClubContractAddress('BOND', blast.id)), chain: blast, }, { id: optimism.id, name: 'Optimism', icon: 'https://mint.club/assets/networks/optimism@2x.png', color: '#FF0420', openseaSlug: 'optimism', enabled: isAddress(getMintClubContractAddress('BOND', optimism.id)), chain: optimism, }, { id: degen.id, name: 'Degen', icon: 'https://mint.club/assets/networks/degen@2x.png', color: '#A36EFD', openseaSlug: 'degen', enabled: isAddress(getMintClubContractAddress('BOND', degen.id)), chain: degen, }, { id: arbitrum.id, name: 'Arbitrum', icon: 'https://mint.club/assets/networks/arbitrum@2x.png', color: '#12AAFF', openseaSlug: 'arbitrum', enabled: isAddress(getMintClubContractAddress('BOND', arbitrum.id)), chain: arbitrum, }, { id: avalanche.id, name: 'Avalanche', icon: 'https://mint.club/assets/networks/avalanche@2x.png', color: '#E94143', openseaSlug: 'avalanche', enabled: isAddress(getMintClubContractAddress('BOND', avalanche.id)), chain: avalanche, }, { id: polygon.id, name: 'Polygon', icon: 'https://mint.club/assets/networks/polygon@2x.png', color: '#8247E5', openseaSlug: 'matic', enabled: isAddress(getMintClubContractAddress('BOND', polygon.id)), chain: polygon, }, { id: bsc.id, name: 'BNBChain', icon: 'https://mint.club/assets/networks/bnb@2x.png', color: '#F0B90B', openseaSlug: 'bsc', enabled: isAddress(getMintClubContractAddress('BOND', bsc.id)), chain: bsc, }, { id: sepolia.id, name: 'Sepolia', icon: 'https://mint.club/assets/networks/ethereum@2x.png', color: '#627EEA', openseaSlug: 'sepolia', enabled: isAddress(getMintClubContractAddress('BOND', sepolia.id)), isTestnet: true, chain: sepolia, }, { id: baseSepolia.id, name: 'BaseSepolia', icon: 'https://mint.club/assets/networks/base@2x.png', color: '#0052FF', openseaSlug: 'base-sepolia', enabled: isAddress(getMintClubContractAddress('BOND', baseSepolia.id)), isTestnet: true, chain: sepolia, }, { id: blastSepolia.id, name: 'BlastSepolia', icon: 'https://mint.club/assets/networks/blast@2x.png', color: '#FCFC03', openseaSlug: 'blast-sepolia', enabled: isAddress(getMintClubContractAddress('BOND', blastSepolia.id)), isTestnet: true, chain: blastSepolia, }, { id: shibarium.id, name: 'Shibarium', icon: 'https://mint.club/assets/networks/shibarium@2x.png', color: '#F0B90B', openseaSlug: 'shibarium', enabled: isAddress(getMintClubContractAddress('BOND', shibarium.id)), chain: shibarium, }, { id: shibariumTestnet.id, name: 'Puppynet', icon: 'https://mint.club/assets/networks/shibarium@2x.png', color: '#F0B90B', openseaSlug: 'puppynet', enabled: isAddress(getMintClubContractAddress('BOND', shibariumTestnet.id)), chain: shibariumTestnet, }, { id: cyber.id, name: 'Cyber', icon: 'https://mint.club/assets/networks/cyber@2x.png', color: '#32A0CD', openseaSlug: 'cyber', enabled: isAddress(getMintClubContractAddress('BOND', cyber.id)), chain: cyber, }, { id: ham.id, name: 'Ham', icon: 'https://mint.club/assets/networks/ham@2x.png', color: '#EB4747', openseaSlug: 'ham', enabled: isAddress(getMintClubContractAddress('BOND', ham.id)), chain: ham, }, { id: avalancheFuji.id, name: 'AvalancheFuji', icon: 'https://mint.club/assets/networks/avalanche@2x.png', color: '#E94143', openseaSlug: 'avalanche-fuji', enabled: isAddress(getMintClubContractAddress('BOND', avalancheFuji.id)), isTestnet: true, chain: avalancheFuji, }, { id: cyberTestnet.id, name: 'CyberTestnet', icon: 'https://mint.club/assets/networks/cyber@2x.png', color: '#32A0CD', openseaSlug: 'cyber-testnet', enabled: isAddress(getMintClubContractAddress('BOND', cyberTestnet.id)), isTestnet: true, chain: cyberTestnet, }, { id: kaia.id, name: 'Kaia', icon: 'https://mint.club/assets/networks/kaia@2x.png', color: '#BFF009', openseaSlug: 'klaytn', enabled: isAddress(getMintClubContractAddress('BOND', kaia.id)), chain: kaia, }, { id: unichain.id, name: 'Unichain', icon: 'https://mint.club/assets/networks/unichain@2x.png', color: '#F50DB4', enabled: isAddress(getMintClubContractAddress('BOND', unichain.id)), chain: unichain, }, { id: zora.id, name: 'Zora', icon: 'https://mint.club/assets/networks/zora@2x.png', color: '#000000', enabled: isAddress(getMintClubContractAddress('BOND', zora.id)), chain: zora, }, { id: apeChain.id, name: 'Apechain', icon: 'https://mint.club/assets/networks/apechain@2x.png', color: '#FFB300', enabled: isAddress(getMintClubContractAddress('BOND', apeChain.id)), chain: apeChain, }, { id: hashkey.id, name: 'Hashkey', icon: 'https://mint.club/assets/networks/hashkey@2x.png', color: '#000000', enabled: isAddress(getMintClubContractAddress('BOND', hashkey.id)), chain: hashkey, }, { id: robinhood.id, name: 'Robinhood', icon: 'https://mint.club/assets/networks/robinhood@2x.png', color: '#CCFF00', openseaSlug: 'robinhood', enabled: isAddress(getMintClubContractAddress('BOND', robinhood.id)), chain: robinhood, }, { id: over.id, name: 'Over', icon: 'https://mint.club/assets/networks/over@2x.png', color: '#000000', enabled: isAddress(getMintClubContractAddress('BOND', over.id)), chain: over, }, ]; export function chainIdToViemChain(chainId: SdkSupportedChainIds) { return CHAINS.find((chain) => chain.id === chainId)?.chain; } export type LowerCaseChainNames = (typeof CHAINS)[number]['name'] extends infer X ? X extends string ? Lowercase : never : never; export function chainIdToString(chainId: number) { const found = CHAINS.find((chain) => chain.id === chainId); if (!found) throw new ChainNotSupportedError(chainId); return found?.name?.toLowerCase() as LowerCaseChainNames; } export function chainStringToId(name: LowerCaseChainNames) { const found = CHAINS.find((chain) => chain?.name?.toLowerCase?.() === name?.toLowerCase?.()); if (!found) throw new ChainNotSupportedError(name); return found.id; } export function getChain(chainId: SdkSupportedChainIds): chains.Chain { let chain = Object.values(chains).find((c) => c.id === chainId) ?? CHAINS.find((c) => c.id === chainId)?.chain; if (!chain) { throw new ChainNotSupportedError(chainId); } return chain; } type ChainMapType = Record; export const CHAIN_MAP = CHAINS.reduce((prev, curr) => { prev[curr.id] = curr; return prev; }, {} as ChainMapType); export const CHAIN_NAME_ID_MAP: Record = { sepolia: sepolia.id, } as const;