UNPKG

@openocean.finance/widget-sdk

Version:

OpenOcean Any-to-Any Cross-Chain-Swap SDK

79 lines (74 loc) 2.1 kB
import { UTXOAPIActions, UTXOActions, utxo } from '@bigmi/core' import type { UTXOAPISchema, UTXOSchema } from '@bigmi/core' import { http, type Chain, type Client, type FallbackTransport, type HttpTransport, createClient, fallback, rpcSchema, } from 'viem' import { config } from '../../config.js' import { getRpcUrls } from '../rpc.js' // cached providers const publicClients: Record< number, Client< FallbackTransport<readonly HttpTransport[]>, Chain, undefined, UTXOSchema & UTXOAPISchema, UTXOActions & UTXOAPIActions > > = {} /** * Get an instance of a provider for a specific chain * @param chainId - Id of the chain the provider is for * @returns The public client for the given chain */ export const getUTXOPublicClient = async (chainId: number) => { if (!publicClients[chainId]) { const urls = await getRpcUrls(chainId) const fallbackTransports = urls.map((url) => http(url)) const _chain = await config.getChainById(chainId) const chain: Chain = { ..._chain, ..._chain.metamask, name: _chain.metamask.chainName, rpcUrls: { default: { http: _chain.metamask.rpcUrls }, public: { http: _chain.metamask.rpcUrls }, }, } const client = createClient({ chain, rpcSchema: rpcSchema<UTXOSchema & UTXOAPISchema>(), transport: fallback([ utxo('https://api.blockchair.com', { key: 'blockchair', includeChainToURL: true, }), utxo('https://api.blockcypher.com/v1/btc/main', { key: 'blockcypher', }), utxo('https://mempool.space/api', { key: 'mempool', }), utxo('https://rpc.ankr.com/http/btc_blockbook/api/v2', { key: 'ankr', }), ...fallbackTransports, ]), pollingInterval: 10_000, }) .extend(UTXOActions) .extend(UTXOAPIActions) publicClients[chainId] = client } if (!publicClients[chainId]) { throw new Error(`Unable to configure provider for chain ${chainId}`) } return publicClients[chainId] }