@lifi/sdk
Version:
LI.FI Any-to-Any Cross-Chain-Swap SDK
75 lines (67 loc) • 2.07 kB
text/typescript
import { ChainId, ChainType } from '@lifi/types'
import type { Client } from 'viem'
import { type Address, createClient, fallback, http, webSocket } from 'viem'
import { type Chain, mainnet } from 'viem/chains'
import { config } from '../../config.js'
import { getRpcUrls } from '../rpc.js'
import type { EVMProvider } from './types.js'
import { UNS_PROXY_READER_ADDRESSES } from './uns/constants.js'
// cached providers
const publicClients: Record<number, Client> = {}
/**
* 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 getPublicClient = async (chainId: number): Promise<Client> => {
if (publicClients[chainId]) {
return publicClients[chainId]
}
const urls = await getRpcUrls(chainId)
const fallbackTransports = urls.map((url) =>
url.startsWith('wss')
? webSocket(url)
: http(url, {
batch: {
batchSize: 64,
},
})
)
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 },
},
}
// Add ENS contracts
if (chain.id === ChainId.ETH) {
chain.contracts = {
...mainnet.contracts,
...chain.contracts,
}
}
// Add UNS contracts for supported chains
if (chain.id === ChainId.ETH || chain.id === ChainId.POL) {
const unsProxyAddress = UNS_PROXY_READER_ADDRESSES[chain.id]
chain.contracts = {
...chain.contracts,
unsProxyReader: { address: unsProxyAddress as Address },
}
}
const provider = config.getProvider(ChainType.EVM) as EVMProvider | undefined
publicClients[chainId] = createClient({
chain: chain,
transport: fallback(
fallbackTransports,
provider?.options?.fallbackTransportConfig
),
batch: {
multicall: true,
},
})
return publicClients[chainId]
}