Paying gas fees with native tokens like ETH remains the standard approach across most blockchains. It’s deeply integrated into the protocol and offers the most direct and compatible method for covering transaction costs.

Getting Started

1

Importing Dependencies

import { createGelatoSmartWalletClient, native } from "@gelatonetwork/smartwallet";
import { gelato, kernel, safe } from "@gelatonetwork/smartwallet/accounts";
import { createWalletClient, createPublicClient, http, type Hex } from "viem";
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
2

Setup Smart Account

You can set up a Smart Account as per your needs. In the case of Gelato, the Gelato Smart Account address will be the same as your EOA, enabling EIP-7702 features.

When using a Kernel Account, you have the option to use EIP-7702 and ERC-4337 together. Setting eip7702 parameter to true will make your EOA the sender address. However, if you want to utilize existing Kernel accounts only with ERC-4337 features, set it to false.

For a Safe Account, it defaults to the ERC-4337 standard. You can either use an already deployed Safe Account or create a new one, while enhancing the experience with Gelato’s best-in-class infrastructure.

const privateKey = (process.env.PRIVATE_KEY ?? generatePrivateKey()) as Hex;
const owner = privateKeyToAccount(privateKey);

const publicClient = createPublicClient({
  chain: baseSepolia,
  transport: http(),
});

const account = await gelato({
  owner,
  client: publicClient,
});
3

Setup Wallet Client

Quickly get started by creating a wallet client using createWalletClient from viem with local account for your specified network. Checkout supported networks here.

const client = createWalletClient({
  account,
  chain: baseSepolia,
  transport: http()
});
4

Creating a Smart Wallet Client

To initialize a Smart Wallet Client, you can use the createGelatoSmartWalletClient method.

const smartWalletClient = createGelatoSmartWalletClient(client);
5

Sending Transactions

To send transactions with native gas payments, select native as the payment method. The native token will be used to pay for gas fees.

const results = await smartWalletClient.execute({
  payment: native(),
  calls: [
    {
      to: "0xa8851f5f279eD47a292f09CA2b6D40736a51788E",
      data: "0xd09de08a",
      value: 0n
    }
  ]
});

console.log("userOp hash:", results?.id);
const txHash = await results?.wait();
console.log("transaction hash", txHash);
6

Batch Multiple Transactions

You can batch multiple transactions to be sent on-chain at once by adding them to the calls array:

const results = await smartWalletClient.execute({
  payment: native(),
  calls: [
    {
      to: "0xa8851f5f279eD47a292f09CA2b6D40736a51788E",
      data: "0xd09de08a",
      value: 0n
    },
    {
      to: "0xa8851f5f279eD47a292f09CA2b6D40736a51788E",
      data: "0xd09de08a",
      value: 0n
    },
    {
      to: "0xa8851f5f279eD47a292f09CA2b6D40736a51788E",
      data: "0xd09de08a",
      value: 0n
    }
  ]
});

Native Gas Payment Playground

Additional Resources

  • Check out the full implementation of native gas payments using Gelato Wallets.