import * as React from "react"; import { createAppKit } from "@reown/appkit/react"; import { mainnet, celo, fuse, AppKitNetwork } from "@reown/appkit/networks"; import { WagmiAdapter } from "@reown/appkit-adapter-wagmi"; import { useWalletClient, WagmiProvider } from "wagmi"; export { useAppKit as useWeb3Modal, useDisconnect } from "@reown/appkit/react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { providers } from "ethers"; import { Web3Provider, Props } from "../Web3Context"; import { WalletClient } from "viem"; const queryClient = new QueryClient(); const walletClientToWeb3Provider = (walletClient: WalletClient) => { const { chain, transport } = walletClient; if (!chain) return; const network = { chainId: chain.id, name: chain.name, ensAddress: chain.contracts?.ensRegistry?.address }; const provider = new providers.Web3Provider(transport, network); return provider; }; /** Hook to convert a viem Wallet Client to an ethers.js Signer. */ export const useEthersProvider = ({ chainId }: { chainId?: number } = {}) => { const { data: walletClient } = useWalletClient({ chainId }); return React.useMemo(() => (walletClient ? walletClientToWeb3Provider(walletClient) : undefined), [walletClient]); }; const Web3ProviderWrapper = ({ children, config, env = "production" }: Props) => { const provider = useEthersProvider(); return ( {children} ); }; export const Web3ModalProvider = ({ projectId, reownMetadata, appkitChains, children, config, env = "production" }: Props & { appkitChains?: [AppKitNetwork, ...AppKitNetwork[]]; projectId?: string; reownMetadata?: any }) => { const chains: [AppKitNetwork, ...AppKitNetwork[]] = appkitChains || [mainnet, celo, fuse]; projectId = projectId || process.env.REACT_APP_WC_PROJECTID || "62745569abcb6c8962cadf4d8568aad9"; const wagmiAdapter = new WagmiAdapter({ networks: chains, projectId }); createAppKit({ adapters: [wagmiAdapter], networks: chains, metadata: reownMetadata, projectId, features: { analytics: true } }); return ( <> {children} ); };