Skip to main content
Embedded wallets enable users to interact with your dApp using familiar login methods like email, phone, or social accounts. Gelato Gasless SDK integrates seamlessly with popular embedded wallet providers.

Quick Start

Installation

npm install @gelatocloud/gasless @dynamic-labs/sdk-react-core @dynamic-labs/ethereum @dynamic-labs/wagmi-connector @tanstack/react-query wagmi viem

Setup

  1. Create an app at Dynamic Dashboard and enable Embedded Wallets
  2. Get your Gelato API Key from Gelato App
NEXT_PUBLIC_DYNAMIC_APP_ID=your_dynamic_environment_id
NEXT_PUBLIC_GELATO_API_KEY=your_gelato_api_key

Configure Providers

import { DynamicContextProvider, useDynamicContext } from "@dynamic-labs/sdk-react-core";
import { EthereumWalletConnectors } from "@dynamic-labs/ethereum";
import { DynamicWagmiConnector } from "@dynamic-labs/wagmi-connector";
import { WagmiProvider, createConfig, http } from "wagmi";
import { QueryClientProvider, QueryClient } from "@tanstack/react-query";
import { baseSepolia } from "viem/chains";

const queryClient = new QueryClient();

export default function Providers({ children }: { children: React.ReactNode }) {
  return (
    <DynamicContextProvider
      settings={{
        environmentId: process.env.NEXT_PUBLIC_DYNAMIC_APP_ID!,
        walletConnectors: [EthereumWalletConnectors],
      }}
    >
      <WagmiProvider config={createConfig({
        chains: [baseSepolia],
        transports: { [baseSepolia.id]: http() },
      })}>
        <QueryClientProvider client={queryClient}>
          <DynamicWagmiConnector>{children}</DynamicWagmiConnector>
        </QueryClientProvider>
      </WagmiProvider>
    </DynamicContextProvider>
  );
}

Create Gelato Bundler Client

import { createGelatoBundlerClient, toGelatoSmartAccount, sponsored } from "@gelatocloud/gasless";
import { isEthereumWallet } from "@dynamic-labs/ethereum";
import { isDynamicWaasConnector } from "@dynamic-labs/wallet-connector-core";
import { prepareAuthorization, SignAuthorizationReturnType } from "viem/actions";

const { primaryWallet } = useDynamicContext();

if (!primaryWallet || !isEthereumWallet(primaryWallet)) return;

const connector = primaryWallet.connector;
if (!connector || !isDynamicWaasConnector(connector)) return;

const client = await primaryWallet.getWalletClient();

client.account.signAuthorization = async (parameters) => {
  const preparedAuthorization = await prepareAuthorization(client, parameters);
  const signedAuthorization = await connector.signAuthorization(preparedAuthorization);

  return {
    address: preparedAuthorization.address,
    chainId: preparedAuthorization.chainId,
    nonce: preparedAuthorization.nonce,
    r: signedAuthorization.r,
    s: signedAuthorization.s,
    v: signedAuthorization.v,
    yParity: signedAuthorization.yParity,
  } as SignAuthorizationReturnType;
};

const account = toGelatoSmartAccount({
  client: client,
  owner: client.account,
});

const bundler = await createGelatoBundlerClient({
  account,
  apiKey: process.env.NEXT_PUBLIC_GELATO_API_KEY as string,
  client,
  payment: sponsored(),
  pollingInterval: 100,
});
Dynamic Docs

Execute Transactions

All providers support the same payment methods:

Smart Account Types

All providers support multiple smart account types:
TypeDescription
gelatoGelato Smart Account (EIP-7702 optimized), Also supports ERC-4337
kernelKernel Account (ERC-4337 + optional EIP-7702)
safeSafe Account (ERC-4337)
const account = toGelatoSmartAccount({
  client: client,
  owner: client.account,
});

const bundler = await createGelatoBundlerClient({
  account,
  apiKey: process.env.NEXT_PUBLIC_GELATO_API_KEY as string,
  client,
  payment: sponsored(),
  pollingInterval: 100,
});

Additional Resources