import {
type CustomPaymasterHandler,
validChains,
} from "@abstract-foundation/agw-client";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import React, { useMemo } from "react";
import { type Chain, http, type Transport } from "viem";
import { createConfig, WagmiProvider } from "wagmi";
import { abstractWalletConnector } from "./abstractWalletConnector.js";
interface AbstractWalletConfig {
/**
* Determines whether to use abstract testnet
* @type {boolean}
* @default false
*/
chain: Chain;
/**
* Optional transport for the client.
* @type {Transport}
* @default http()
*/
transport?: Transport;
/**
* Optional query client.
* @type {QueryClient}
* @default new QueryClient()
*/
queryClient?: QueryClient;
/**
* Optional custom paymaster handler.
* @type {CustomPaymasterHandler}
*/
customPaymasterHandler?: CustomPaymasterHandler;
}
/**
* AbstractWalletProvider is a React provider that wraps the WagmiProvider and QueryClientProvider.
* It provides the AbstractWalletContext to its children.
* @example
* ```tsx
* import { AbstractWalletProvider } from '@abstract-foundation/agw-react';
*
* const App = () => {
* // optional configuration overrides
* const transport = http("https://your.abstract.node.example.com/rpc")
* const queryClient = new QueryClient()
* return (
*
*
*
* );
* };
* ```
* @param {AbstractWalletConfig} config - The configuration for the AbstractWalletProvider.
*/
export const AbstractWalletProvider = ({
chain,
transport,
queryClient = new QueryClient(),
customPaymasterHandler,
children,
}: React.PropsWithChildren) => {
if (!validChains[chain.id]) {
throw new Error(`Chain ${chain.id} is not supported`);
}
const wagmiConfig = useMemo(() => {
return createConfig({
chains: [chain],
ssr: true,
connectors: [
abstractWalletConnector({
customPaymasterHandler,
}),
],
transports: {
[chain.id]:
transport ??
http(undefined, {
batch: true,
}),
},
multiInjectedProviderDiscovery: false,
});
}, [chain, transport, customPaymasterHandler]);
return (
{children}
);
};