使用ERC20代币支付Gas费用

zerodev 发布于 2026-07-25 阅读 16

本文介绍了如何使用ERC20代币(如USDC)支付智能账户的Gas费用,用户无需持有原生代币(如ETH)。内容包括设置Kernel客户端使用ERC20 Paymaster、批准ERC20代币给Paymaster、批量处理批准与交易、估算ERC20 Gas费用以及支持的网络(Ethereum、Polygon、Base等),并提供了自定义Paymaster的部署方法。

简介

等不及了?直接查看完整示例

重要提示: ZeroDev 默认支持使用 USDC 支付 Gas 费用。如果你想使用其他代币,可以按照下面的说明设置自定义的 paymaster。

智能账户可以使用 ERC20 代币支付 Gas 费用。因此,你的用户无需拥有任何原生 Gas 代币(例如 ETH)即可使用 Web3。他们可以直接使用稳定币甚至项目自己的代币。当用户使用 ERC20 代币支付 Gas 时,我们会在汇率上增加 5% 的溢价,以降低价格波动风险。企业客户可以协商该溢价。

概括来说,要让智能账户支持用特定 ERC20 代币支付 Gas,你需要做两件事:

  • 使用 ERC20 paymaster 设置 Kernel 客户端。
  • 确保 ERC20 paymaster 已获得足够的 ERC20 代币授权。(这一步是必要的,因为 ERC20 paymaster 需要从智能账户中提取 ERC20 代币。)

接下来我们逐步介绍这两个步骤。

设置 Kernel 客户端

当你设置账户时,请执行以下操作:

import {
  createZeroDevPaymasterClient,
  createKernelAccountClient,
  gasTokenAddresses,
} from "@zerodev/sdk"
import {
  getEntryPoint
} from "@zerodev/sdk/constants"
 
import { mainnet } from "viem/chains"
 
// 使用你想要的任何链
const chain = mainnet.id
const entryPoint = getEntryPoint("0.7")
 
const paymasterClient = createZeroDevPaymasterClient({
  chain,
  transport: http('ZERODEV_PAYMASTER_RPC'), // 从 ZeroDev 仪表盘获取 RPC
})
 
const kernelClient = createKernelAccountClient({
  // 其他选项...
 
  paymaster: paymasterClient,
  paymasterContext: { token: gasTokenAddresses[chain.id]['USDC'] }
})

为 paymaster 授权 ERC20 代币

使用 getERC20PaymasterApproveCall 函数构建一个调用,以授权 paymaster 使用 ERC20 代币:

import { getERC20PaymasterApproveCall } from "@zerodev/sdk"
 
const userOpHash = await kernelClient.sendUserOperation({
    callData: await kernelClient.account.encodeCalls([
      await getERC20PaymasterApproveCall(paymasterClient, {
        gasToken: gasTokenAddresses[chain.id]['USDC'],
        approveAmount: parseEther('0.1'),
        entryPoint,
      }),
    ]),
})

借助批量处理,你可以将授权与你想要发送的 UserOp 合并在一起:

const userOpHash = await kernelClient.sendUserOperation({
    callData: await account.encodeCalls([
      // 授权
      await getERC20PaymasterApproveCall(paymasterClient, {
        gasToken: gasTokenAddresses[chain.id]['USDC'],
        approveAmount: parseEther('0.1'),
        entryPoint,
      }),
      // 实际调用
      {
        to: '0x...'
        data: "0x...",
        value: BigInt(0),
      },
    ]),
})

请注意,你只需授权一次,只要授权金额足够支付多个 UserOp 即可。Pimlico 的 paymaster 合约已经过审计,被广泛使用,通常被认为是安全的。

估算 ERC20 代币的 Gas 费用

如果你需要以 ERC20 代币为单位估算 Gas,请执行以下操作:

const userOperation = await kernelClient.prepareUserOperation({
        // 将此替换为你的实际 calldata
        callData: await account.encodeCalls([{
            to: zeroAddress,
            value: BigInt(0),
            data: "0x"
        }])
})
 
const erc20Amount = await paymasterClient.estimateGasInERC20({
    userOperation,
 
    // 将此替换为你想要的代币
    gasTokenAddress: gasTokenAddresses[chain.id]["USDC"]
})

你还可以查看估算 Gas 的代码示例

支持的代币

目前,我们的 ERC20 Paymaster 在以下网络上支持 USDC:

  • 以太坊主网
  • Polygon
  • Base
  • Optimism
  • Arbitrum

如果你想使用其他代币或支持新网络,可以按照下面的说明部署自己的自费 ERC20 Paymaster。

部署你自己的 ERC20 Paymaster

如果你希望支持自定义的 ERC20 代币,你可以部署和管理自己的 ERC20 paymaster 合约。具体步骤如下:

  1. 访问 ZeroDev 仪表盘,部署一个自费的 ERC20 paymaster 合约。
  2. 使用原生货币(例如 ETH)为合约充值。
  3. 在仪表盘上输入代币合约地址,添加一个受支持的 ERC20 代币。该地址必须是所选链上有效的 ERC20 代币合约——仪表盘会在链上验证合约(读取 namesymboldecimals),如果该地址未找到 ERC20 合约,则会拒绝输入并报错。
  4. 选择代币相对于原生 Gas 代币的汇率来源。有三种价格来源可选:
    • CoinGecko — Paymaster 在每次提交 UserOp 时从 CoinGecko 获取实时价格。当代币在所选链上得到 CoinGecko 支持时,会自动选择此选项。测试网上不可用,因为 CoinGecko 价格反映的是真实市场流动性,而测试网没有——在测试网上开发时,请使用自定义价格源或静态汇率。
    • 自定义价格源 — 提供一个公开的 HTTPS 端点,返回格式为 { "rate": <number> } 的 JSON,其中 rate 是 1 个原生代币等于多少 ERC20 代币。Paymaster 在计算代币形式的 Gas 时调用此端点。适用于不在 CoinGecko 上的代币,或当你希望使用自己的定价来源时。
    • 静态汇率 — 手动设置固定的兑换率。这是最简单的选项,但你需要随着代币价格变动而更新它。

部署完成后,你可以从仪表盘复制 paymaster URL,并在创建 paymaster 客户端时将其用作 transport 参数:

const paymasterClient = createZeroDevPaymasterClient({
  chain,
  transport: http('YOUR_CUSTOM_PAYMASTER_URL'), // 来自仪表盘上自费 paymaster 页面
})

其余集成步骤与上述相同。

  • 原文链接: docs.zerodev.app/smart-a...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论