Quickstart: React
@biconomy/use-aa • Docs
Biconomy has two main packages: @biconomy/useAA which is designed for React projects, and @biconomy/biconomy-client-sdk, which is our core SDK that can be used in any JavaScript environment.
If you are building a React project, we recommend starting with @biconomy/useAA (which is the focus of the following tutorial). You can always drop down to the underlying Core SDK if required.
1. Create a Next.js project
npx create-next-app@latest2. Install dependencies
 
npm install viem wagmi @tanstack/react-query @biconomy/account @biconomy/use-aa3. Add your Providers
Create your relevant providers for each of your dependencies. You will need to retrieve paymaster and bundler details from the biconomy dashboard.
"use client";
import { http } from "viem";
import { BiconomyProvider } from "@biconomy/use-aa";
import { polygonAmoy } from "viem/chains";
import { WagmiProvider, createConfig } from "wagmi";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
 
export default function Providers({ children }: { children: React.ReactNode }) {
  const biconomyPaymasterApiKey =
    process.env.NEXT_PUBLIC_PAYMASTER_API_KEY || "";
  const bundlerUrl = process.env.NEXT_PUBLIC_BUNDLER_URL || "";
 
  const config = createConfig({
    chains: [polygonAmoy],
    transports: {
      [polygonAmoy.id]: http(),
    },
  });
 
  const queryClient = new QueryClient();
 
  return (
    <WagmiProvider config={config}>
      <QueryClientProvider client={queryClient}>
        <BiconomyProvider
          config={{
            biconomyPaymasterApiKey,
            bundlerUrl,
            // Add your signer here if you don't want to use the metamask signer
          }}
          queryClient={queryClient}
        >
          {children}
        </BiconomyProvider>
      </QueryClientProvider>
    </WagmiProvider>
  );
}4. Send a Sponsored Transaction
4a. Get the smart account address for the connected user
const { smartAccountAddress } = useSmartAccount();4b. Build the mintTx
const mintNftTx = () =>
  mutate({
    transactions: {
      to: "0x1758f42Af7026fBbB559Dc60EcE0De3ef81f665e",
      data: encodeFunctionData({
        abi: parseAbi(["function safeMint(address _to)"]),
        functionName: "safeMint",
        args: [smartAccountAddress],
      }),
    },
  });4c. Send the sponsored transaction and wire the 'wait' hook
const {
  mutate,
  data: userOpResponse,
  error,
  isPending,
} = useSendSponsoredTransaction();
 
const {
  isLoading: waitIsLoading,
  isSuccess: waitIsSuccess,
  error: waitError,
  data: waitData,
} = useUserOpWait(userOpResponse);
 
return (
  <div>
    <button type="button" onClick={mintNftTx}>
      {waitIsLoading || isPending ? "Executing..." : "Mint an NFT"}
    </button>
    {(error || waitError) ?? ""}
  </div>
);4d. Handle the success state
useEffect(() => {
  if (waitData?.success === "true") {
    console.log(waitData?.receipt?.transactionHash);
  }
}, [waitData]);Next Steps
Congratulations! You have sent your first sponsored transaction with Biconomy. You can now explore specific methods here.