mirror of
https://github.com/luxfhe/example-dapps.git
synced 2026-10-30 18:13:32 +00:00
71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
"use client";
|
|
|
|
import { useEffect, useMemo, useRef } from "react";
|
|
import { ethers } from "ethers";
|
|
import { useAccount, useWalletClient } from "wagmi";
|
|
|
|
export const useWagmiEthers = (initialMockChains?: Readonly<Record<number, string>>) => {
|
|
const { address, isConnected, chain } = useAccount();
|
|
const { data: walletClient } = useWalletClient();
|
|
|
|
const chainId = chain?.id ?? walletClient?.chain?.id;
|
|
const accounts = address ? [address] : undefined;
|
|
|
|
const ethersProvider = useMemo(() => {
|
|
if (!walletClient) return undefined;
|
|
|
|
const eip1193Provider = {
|
|
request: async (args: any) => {
|
|
return await walletClient.request(args);
|
|
},
|
|
on: () => {
|
|
console.log("Provider events not fully implemented for wagmi");
|
|
},
|
|
removeListener: () => {
|
|
console.log("Provider removeListener not fully implemented for wagmi");
|
|
},
|
|
} as ethers.Eip1193Provider;
|
|
|
|
return new ethers.BrowserProvider(eip1193Provider);
|
|
}, [walletClient]);
|
|
|
|
const ethersReadonlyProvider = useMemo(() => {
|
|
if (!ethersProvider) return undefined;
|
|
|
|
const rpcUrl = initialMockChains?.[chainId || 0];
|
|
if (rpcUrl) {
|
|
return new ethers.JsonRpcProvider(rpcUrl);
|
|
}
|
|
|
|
return ethersProvider;
|
|
}, [ethersProvider, initialMockChains, chainId]);
|
|
|
|
const ethersSigner = useMemo(() => {
|
|
if (!ethersProvider || !address) return undefined;
|
|
return new ethers.JsonRpcSigner(ethersProvider, address);
|
|
}, [ethersProvider, address]);
|
|
|
|
// Stable refs consumers can reuse
|
|
const ropRef = useRef<typeof ethersReadonlyProvider>(ethersReadonlyProvider);
|
|
const chainIdRef = useRef<number | undefined>(chainId);
|
|
|
|
useEffect(() => {
|
|
ropRef.current = ethersReadonlyProvider;
|
|
}, [ethersReadonlyProvider]);
|
|
|
|
useEffect(() => {
|
|
chainIdRef.current = chainId;
|
|
}, [chainId]);
|
|
|
|
return {
|
|
chainId,
|
|
accounts,
|
|
isConnected,
|
|
ethersProvider,
|
|
ethersReadonlyProvider,
|
|
ethersSigner,
|
|
ropRef,
|
|
chainIdRef,
|
|
} as const;
|
|
};
|