UNPKG

unich-web3-sdk

Version:

Web3 SDK for DEX applications with multi-chain support

1 lines 17.3 kB
{"version":3,"sources":["../../src/chains/evm/index.ts","../../src/chains/svm/index.ts","../../src/chains/evm/popular.ts","../../src/chains/svm/popular.ts","../../src/chains/index.ts"],"names":["getViemChainById","chainId","mainnet","goerli","sepolia","polygon","polygonMumbai","optimism","optimismGoerli","arbitrum","arbitrumGoerli","base","baseGoerli","chain","EVMChainAdapter","viemChain","client","createPublicClient","http","customViemChain","defineChain","address","createWalletClient","custom","SVMChainAdapter","Connection","connection","publicKey","PublicKey","balance","blockHeight","ethereumMainnet","polygonMainnet","arbitrumMainnet","optimismMainnet","bscMainnet","popularEVMChains","solanaMainnet","solanaDevnet","solanaTestnet","popularSVMChains","chainAdapters","getChainAdapter","chainType","adapter","getChainAdapterForChain","chainConfig","getAllChains","getChainById"],"mappings":"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","file":"index.mjs","sourcesContent":["import { ChainAdapter, ChainConfig } from \"../../types/chain\";\nimport {\n createPublicClient,\n http,\n PublicClient,\n defineChain,\n createWalletClient,\n custom,\n Chain as ViemChain,\n} from \"viem\";\nimport {\n mainnet,\n goerli,\n sepolia,\n polygon,\n polygonMumbai,\n optimism,\n optimismGoerli,\n arbitrum,\n arbitrumGoerli,\n base,\n baseGoerli,\n} from \"viem/chains\";\n\n/**\n * Get a Viem chain by ID\n * @param chainId Chain ID\n * @returns Viem chain object or undefined if not found\n */\nfunction getViemChainById(chainId: number): ViemChain | undefined {\n const allChains = [\n mainnet,\n goerli,\n sepolia,\n polygon,\n polygonMumbai,\n optimism,\n optimismGoerli,\n arbitrum,\n arbitrumGoerli,\n base,\n baseGoerli,\n ];\n\n return allChains.find((chain) => chain.id === chainId);\n}\n\n/**\n * Implementation of chain-specific functionality for EVM-compatible chains\n */\nexport class EVMChainAdapter implements ChainAdapter {\n private clientCache = new Map<number | string, PublicClient>();\n\n /**\n * Get a provider for the specified chain\n * @param chain Chain configuration\n * @returns Provider instance\n */\n getProvider(chain: ChainConfig): PublicClient {\n const chainId = chain.id;\n\n // Check if we have a cached client\n if (this.clientCache.has(chainId)) {\n return this.clientCache.get(chainId)!;\n }\n\n // Try to get a predefined Viem chain\n const viemChain = getViemChainById(chainId as number);\n\n let client: PublicClient;\n\n if (viemChain) {\n // Use the predefined Viem chain\n client = createPublicClient({\n chain: viemChain,\n transport: http(),\n });\n } else {\n // Create a custom chain definition\n const customViemChain = defineChain({\n id: Number(chainId),\n name: chain.name,\n nativeCurrency: {\n name: chain.nativeCurrency.name,\n symbol: chain.nativeCurrency.symbol,\n decimals: chain.nativeCurrency.decimals,\n },\n rpcUrls: {\n default: {\n http: chain.rpcUrls,\n },\n },\n blockExplorers: chain.blockExplorerUrls\n ? {\n default: {\n name: chain.name,\n url: chain.blockExplorerUrls[0],\n },\n }\n : undefined,\n });\n\n client = createPublicClient({\n chain: customViemChain,\n transport: http(),\n });\n }\n\n // Cache the client\n this.clientCache.set(chainId, client);\n return client;\n }\n\n /**\n * Get the balance of an address on the specified chain\n * @param chain Chain configuration\n * @param address Address to check\n * @returns Balance in wei\n */\n async getBalance(chain: ChainConfig, address: string): Promise<bigint> {\n const client = this.getProvider(chain);\n return await client.getBalance({ address: address as `0x${string}` });\n }\n\n /**\n * Get the current block number on the specified chain\n * @param chain Chain configuration\n * @returns Current block number\n */\n async getBlockNumber(chain: ChainConfig): Promise<bigint> {\n const client = this.getProvider(chain);\n return await client.getBlockNumber();\n }\n\n /**\n * Get a wallet client for signing transactions\n * @param chain Chain configuration\n * @returns Wallet client or null if not connected\n */\n getWalletClient(chain: ChainConfig) {\n if (typeof window !== \"undefined\" && window.ethereum) {\n // Create a Viem wallet client using the MetaMask provider\n const viemChain = getViemChainById(chain.id as number);\n\n if (viemChain) {\n return createWalletClient({\n chain: viemChain,\n transport: custom(window.ethereum),\n });\n }\n }\n\n return null;\n }\n}\n","import { ChainAdapter, ChainConfig } from \"../../types/chain\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\n\n/**\n * Solana Virtual Machine Chain Adapter\n * Implements chain-specific functionality for Solana\n */\nexport class SVMChainAdapter implements ChainAdapter {\n private connection: Connection | null = null;\n\n /**\n * Get a provider for the specified chain\n * @param chain Chain configuration\n * @returns Connection instance\n */\n async getProvider(chain: ChainConfig): Promise<Connection> {\n if (!this.connection) {\n this.connection = new Connection(chain.rpcUrls[0]);\n }\n return this.connection;\n }\n\n /**\n * Get the balance of an address on the specified chain\n * @param chain Chain configuration\n * @param address Wallet address\n * @returns Balance as a bigint\n */\n async getBalance(chain: ChainConfig, address: string): Promise<bigint> {\n const connection = await this.getProvider(chain);\n const publicKey = new PublicKey(address);\n const balance = await connection.getBalance(publicKey);\n return BigInt(balance);\n }\n\n /**\n * Get the current block number (slot) on the specified chain\n * @param chain Chain configuration\n * @returns Current slot number as a bigint\n */\n async getBlockNumber(chain: ChainConfig): Promise<bigint> {\n const connection = await this.getProvider(chain);\n const blockHeight = await connection.getBlockHeight();\n return BigInt(blockHeight);\n }\n}\n","import { ChainConfig, NetworkType, ChainType } from \"../../types/chain\";\n\nexport const ethereumMainnet: ChainConfig = {\n id: 1,\n name: \"Ethereum\",\n type: ChainType.EVM,\n networkType: NetworkType.MAINNET,\n rpcUrls: [\n \"https://eth-mainnet.g.alchemy.com/v2/your-api-key\",\n \"https://mainnet.infura.io/v3/your-api-key\",\n ],\n nativeCurrency: {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n },\n blockExplorerUrls: [\"https://etherscan.io\"],\n iconUrl: \"https://cryptologos.cc/logos/ethereum-eth-logo.png\",\n};\n\nexport const polygonMainnet: ChainConfig = {\n id: 137,\n name: \"Polygon\",\n type: ChainType.EVM,\n networkType: NetworkType.MAINNET,\n rpcUrls: [\n \"https://polygon-rpc.com\",\n \"https://polygon-mainnet.g.alchemy.com/v2/your-api-key\",\n ],\n nativeCurrency: {\n name: \"MATIC\",\n symbol: \"MATIC\",\n decimals: 18,\n },\n blockExplorerUrls: [\"https://polygonscan.com\"],\n iconUrl: \"https://cryptologos.cc/logos/polygon-matic-logo.png\",\n};\n\nexport const arbitrumMainnet: ChainConfig = {\n id: 42161,\n name: \"Arbitrum\",\n type: ChainType.EVM,\n networkType: NetworkType.MAINNET,\n rpcUrls: [\n \"https://arb1.arbitrum.io/rpc\",\n \"https://arb-mainnet.g.alchemy.com/v2/your-api-key\",\n ],\n nativeCurrency: {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n },\n blockExplorerUrls: [\"https://arbiscan.io\"],\n iconUrl: \"https://cryptologos.cc/logos/arbitrum-arb-logo.png\",\n};\n\nexport const optimismMainnet: ChainConfig = {\n id: 10,\n name: \"Optimism\",\n type: ChainType.EVM,\n networkType: NetworkType.MAINNET,\n rpcUrls: [\n \"https://mainnet.optimism.io\",\n \"https://opt-mainnet.g.alchemy.com/v2/your-api-key\",\n ],\n nativeCurrency: {\n name: \"Ether\",\n symbol: \"ETH\",\n decimals: 18,\n },\n blockExplorerUrls: [\"https://optimistic.etherscan.io\"],\n iconUrl: \"https://cryptologos.cc/logos/optimism-op-logo.png\",\n};\n\nexport const bscMainnet: ChainConfig = {\n id: 56,\n name: \"BNB Smart Chain\",\n type: ChainType.EVM,\n networkType: NetworkType.MAINNET,\n rpcUrls: [\n \"https://bsc-dataseed.binance.org\",\n \"https://bsc-dataseed1.defibit.io\",\n ],\n nativeCurrency: {\n name: \"BNB\",\n symbol: \"BNB\",\n decimals: 18,\n },\n blockExplorerUrls: [\"https://bscscan.com\"],\n iconUrl: \"https://cryptologos.cc/logos/bnb-bnb-logo.png\",\n};\n\nexport const popularEVMChains = [\n ethereumMainnet,\n polygonMainnet,\n arbitrumMainnet,\n optimismMainnet,\n bscMainnet,\n];\n","import { ChainConfig, NetworkType, ChainType } from \"../../types/chain\";\n\nexport const solanaMainnet: ChainConfig = {\n id: \"mainnet-beta\",\n name: \"Solana\",\n type: ChainType.SVM,\n networkType: NetworkType.MAINNET,\n rpcUrls: [\n \"https://api.mainnet-beta.solana.com\",\n \"https://solana-api.projectserum.com\",\n ],\n nativeCurrency: {\n name: \"Solana\",\n symbol: \"SOL\",\n decimals: 9,\n },\n blockExplorerUrls: [\"https://explorer.solana.com\"],\n iconUrl: \"https://cryptologos.cc/logos/solana-sol-logo.png\",\n};\n\nexport const solanaDevnet: ChainConfig = {\n id: \"devnet\",\n name: \"Solana Devnet\",\n type: ChainType.SVM,\n networkType: NetworkType.DEVNET,\n rpcUrls: [\"https://api.devnet.solana.com\"],\n nativeCurrency: {\n name: \"Solana\",\n symbol: \"SOL\",\n decimals: 9,\n },\n blockExplorerUrls: [\"https://explorer.solana.com/?cluster=devnet\"],\n iconUrl: \"https://cryptologos.cc/logos/solana-sol-logo.png\",\n};\n\nexport const solanaTestnet: ChainConfig = {\n id: \"testnet\",\n name: \"Solana Testnet\",\n type: ChainType.SVM,\n networkType: NetworkType.TESTNET,\n rpcUrls: [\"https://api.testnet.solana.com\"],\n nativeCurrency: {\n name: \"Solana\",\n symbol: \"SOL\",\n decimals: 9,\n },\n blockExplorerUrls: [\"https://explorer.solana.com/?cluster=testnet\"],\n iconUrl: \"https://cryptologos.cc/logos/solana-sol-logo.png\",\n};\n\nexport const popularSVMChains = [solanaMainnet, solanaDevnet, solanaTestnet];\n","import { ChainAdapter, ChainConfig, ChainType } from \"../types/chain\";\nimport { EVMChainAdapter } from \"./evm\";\nimport { SVMChainAdapter } from \"./svm\";\n\n// Import popular chains\nimport { popularEVMChains } from \"./evm/popular\";\nimport { popularSVMChains } from \"./svm/popular\";\n\n// Export chain adapters\nexport { EVMChainAdapter, SVMChainAdapter };\n\n// Export popular chains\nexport { popularEVMChains, popularSVMChains };\n\n// Chain adapter registry\nconst chainAdapters: Record<ChainType, ChainAdapter> = {\n [ChainType.EVM]: new EVMChainAdapter(),\n [ChainType.SVM]: new SVMChainAdapter(),\n};\n\n/**\n * Get a chain adapter for the specified chain type\n * @param chainType Chain type\n * @returns Chain adapter\n */\nexport function getChainAdapter(chainType: ChainType): ChainAdapter {\n const adapter = chainAdapters[chainType];\n if (!adapter) {\n throw new Error(`Chain adapter not found for chain type: ${chainType}`);\n }\n return adapter;\n}\n\n/**\n * Get a chain adapter for the specified chain configuration\n * @param chainConfig Chain configuration\n * @returns Chain adapter\n */\nexport function getChainAdapterForChain(\n chainConfig: ChainConfig\n): ChainAdapter {\n return getChainAdapter(chainConfig.type);\n}\n\n/**\n * Get all supported chains\n * @returns Array of chain configurations\n */\nexport function getAllChains(): ChainConfig[] {\n return [...popularEVMChains, ...popularSVMChains];\n}\n\n/**\n * Get a chain configuration by ID\n * @param chainId Chain ID\n * @returns Chain configuration or null if not found\n */\nexport function getChainById(chainId: string | number): ChainConfig | null {\n return getAllChains().find((chain) => chain.id === chainId) || null;\n}\n"]}