UNPKG

@smartinvoicexyz/utils

Version:

Unified source for utility functions used across the Smart Invoice protocol.

171 lines (170 loc) 5.55 kB
import { getDefaultConfig } from '@rainbow-me/rainbowkit'; import { coinbaseWallet, injectedWallet, ledgerWallet, metaMaskWallet, rainbowWallet, safeWallet, walletConnectWallet, } from '@rainbow-me/rainbowkit/wallets'; import { isSupportedChainId, SUPPORTED_CHAINS, } from '@smartinvoicexyz/constants'; import { createPublicClient, http } from 'viem'; import { fallback } from 'wagmi'; import { arbitrum, base, gnosis, holesky, mainnet, optimism, polygon, sepolia, } from 'wagmi/chains'; const APP_NAME = 'Smart Invoice'; const PROJECT_ID = process.env.NEXT_PUBLIC_WALLETCONNECT_ID || ''; const INFURA_ID = process.env.NEXT_PUBLIC_INFURA_ID || ''; const ALCHEMY_ID = process.env.NEXT_PUBLIC_ALCHEMY_ID || ''; const PORTERS_ID = process.env.NEXT_PUBLIC_PORTERS_ID || ''; const infuraNetworkName = { [mainnet.id]: 'mainnet', [polygon.id]: 'polygon-mainnet', [arbitrum.id]: 'arbitrum-mainnet', [optimism.id]: 'optimism-mainnet', [sepolia.id]: 'sepolia', [base.id]: 'base-mainnet', [holesky.id]: 'holesky', // gnosis is not supported by infura }; const alchemyNetworkName = { [mainnet.id]: 'eth-mainnet', [polygon.id]: 'polygon-mainnet', [arbitrum.id]: 'arb-mainnet', [optimism.id]: 'opt-mainnet', [sepolia.id]: 'eth-sepolia', [base.id]: 'base-mainnet', [holesky.id]: 'eth-holesky', // gnosis is not supported by alchemy }; const portersNetworkName = { [mainnet.id]: 'eth-mainnet', [polygon.id]: 'poly-mainnet', [arbitrum.id]: 'arbitrum-one', [optimism.id]: 'optimism-mainnet', [sepolia.id]: 'sepolia-testnet', [base.id]: 'base-fullnode-mainnet', [holesky.id]: 'holesky-fullnode-testnet', [gnosis.id]: 'gnosischain-mainnet', }; const chainLabelToId = { mainnet: mainnet.id, holesky: holesky.id, sepolia: sepolia.id, polygon: polygon.id, base: base.id, arbitrum: arbitrum.id, optimism: optimism.id, gnosis: gnosis.id, }; const chainIdToLabel = { [mainnet.id]: 'mainnet', [polygon.id]: 'polygon', [arbitrum.id]: 'arbitrum', [optimism.id]: 'optimism', [sepolia.id]: 'sepolia', [base.id]: 'base', [holesky.id]: 'holesky', [gnosis.id]: 'gnosis', }; const subgraphNameToChain = { mainnet, matic: polygon, 'arbitrum-one': arbitrum, optimism, sepolia, base, holesky, gnosis, }; const chainsMap = SUPPORTED_CHAINS.reduce((acc, chain) => ({ ...acc, [chain.id]: chain, }), {}); export const chainById = (chainId) => { const chain = chainsMap[chainId]; return chain; }; export const chainIdFromLabel = (label) => { const chainId = chainLabelToId[label.toLowerCase()]; return chainId; }; export const chainLabelFromId = (chainId) => { const label = chainIdToLabel[chainId]; return label; }; export const getChainName = (chainId) => { if (!isSupportedChainId(chainId)) return 'Unknown'; return chainById(chainId).name; }; export const chainByName = (name) => { if (!name) return undefined; const subgraphChain = subgraphNameToChain[name.toLowerCase()]; if (subgraphChain) return subgraphChain; return SUPPORTED_CHAINS.find(chain => chain.name.toLowerCase().includes(name.toLowerCase())); }; const transports = SUPPORTED_CHAINS.reduce((acc, chain) => { const list = [http()]; const infuraNetwork = infuraNetworkName[chain.id]; const infuraUrl = infuraNetwork && INFURA_ID ? `https://${infuraNetwork}.infura.io/v3/${INFURA_ID}` : undefined; if (infuraUrl) list.push(http(infuraUrl)); const alchemyNetwork = alchemyNetworkName[chain.id]; const alchemyUrl = alchemyNetwork && ALCHEMY_ID ? `https://${alchemyNetwork}.g.alchemy.com/v2/${ALCHEMY_ID}` : undefined; if (alchemyUrl) list.push(http(alchemyUrl)); const portersNetwork = portersNetworkName[chain.id]; const portersUrl = portersNetwork && PORTERS_ID ? `https://${portersNetwork}.rpc.porters.xyz/${PORTERS_ID}` : undefined; if (portersUrl) list.push(http(portersUrl)); return { ...acc, [chain.id]: fallback(list.reverse()), }; }, {}); export const publicClients = SUPPORTED_CHAINS.reduce((acc, chain) => { const transport = transports[chain.id]; const client = createPublicClient({ chain, transport }); return { ...acc, [chain.id]: client, }; }, {}); export const wagmiConfig = getDefaultConfig({ ssr: true, appName: APP_NAME, projectId: PROJECT_ID, chains: SUPPORTED_CHAINS, transports, wallets: [ { groupName: 'Recommended', wallets: [ injectedWallet, rainbowWallet, ledgerWallet, safeWallet, metaMaskWallet, coinbaseWallet, walletConnectWallet, ], }, ], }); export const parseChainId = (chainIdOrLabel) => { if (!chainIdOrLabel) return undefined; // eslint-disable-next-line no-param-reassign chainIdOrLabel = chainIdOrLabel.toString(); if (chainIdOrLabel.startsWith('0x')) return parseInt(chainIdOrLabel, 16); if (Number.isInteger(Number(chainIdOrLabel))) return Number(chainIdOrLabel); const chainId = chainIdFromLabel(chainIdOrLabel.toLowerCase()); if (chainId) return chainId; // eslint-disable-next-line no-param-reassign chainIdOrLabel = `0x${chainIdOrLabel}`; return parseInt(chainIdOrLabel, 16); };