You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Alchemy SDK发送ERC20代币?

如何用Alchemy SDK发送ERC20代币

发送ERC20代币和原生ETH转账的核心差异在于,你需要调用目标代币合约的transfer方法,而非直接向接收地址转ETH。以下是具体的交易对象配置方法和完整代码示例:

核心配置要点

  • to字段:填写目标ERC20代币的合约地址,而非接收人的钱包地址
  • value字段:设置为0(因为本次交易不涉及原生ETH转账)
  • data字段:对ERC20标准的transfer(address recipient, uint256 amount)方法进行ABI编码,传入接收地址和代币数量(注意要转换为代币的最小单位,即乘以代币的小数位数)
  • gasLimit:ERC20转账的Gas消耗高于原生ETH的21000,建议通过estimateGas方法动态估算

完整代码示例

const { Alchemy, Network, Wallet, Utils } = require("alchemy-sdk");
const dotenv = require("dotenv");

dotenv.config();
const { API_KEY, PRIVATE_KEY } = process.env;

const settings = {
  apiKey: API_KEY,
  network: Network.ETH_GOERLI,
};
const alchemy = new Alchemy(settings);
const wallet = new Wallet(PRIVATE_KEY);

// 配置ERC20代币参数
const TOKEN_CONTRACT_ADDRESS = "0x07865c6E87B9F70255377e024ace6630C1Eaa37F"; // Goerli测试网USDC合约地址
const RECIPIENT_ADDRESS = "0xa238b6008Bc2FBd9E386A5d4784511980cE504Cd";
const TOKEN_DECIMALS = 6; // USDC的小数位数是6
const AMOUNT_TO_SEND = "1"; // 要发送的代币数量(1 USDC)

async function main() {
  const nonce = await alchemy.core.getTransactionCount(
    wallet.address,
    "latest"
  );

  // 编码ERC20 transfer方法的调用数据
  const transferCalldata = Utils.encodeFunctionData(
    {
      name: "transfer",
      type: "function",
      inputs: [
        { type: "address", name: "recipient" },
        { type: "uint256", name: "amount" },
      ],
    },
    [
      RECIPIENT_ADDRESS,
      Utils.parseUnits(AMOUNT_TO_SEND, TOKEN_DECIMALS).toString(),
    ]
  );

  // 估算Gas Limit
  const gasLimit = await alchemy.core.estimateGas({
    to: TOKEN_CONTRACT_ADDRESS,
    data: transferCalldata,
    from: wallet.address,
  });

  const transaction = {
    to: TOKEN_CONTRACT_ADDRESS, // 代币合约地址
    value: "0", // 不转原生ETH
    gasLimit: gasLimit.toString(),
    maxPriorityFeePerGas: Utils.parseUnits("5", "gwei"),
    maxFeePerGas: Utils.parseUnits("20", "gwei"),
    nonce: nonce,
    type: 2,
    chainId: 5, // Goerli链ID
    data: transferCalldata, // 编码后的transfer调用数据
  };

  const rawTransaction = await wallet.signTransaction(transaction);
  const tx = await alchemy.core.sendTransaction(rawTransaction);
  console.log("Sent ERC20 transaction", tx);
}

main();

关键细节说明

  1. ABI编码:使用Utils.encodeFunctionData方法对transfer方法进行编码,不需要完整的合约ABI,只需要该方法的签名和输入参数定义即可。
  2. 代币单位转换:所有ERC20代币的转账数量都需要转换为最小单位(wei级别),比如USDC的小数位数是6,所以1 USDC等于10^6个最小单位,用Utils.parseUnits(AMOUNT_TO_SEND, TOKEN_DECIMALS)完成转换。
  3. Gas估算:调用estimateGas方法可以根据当前链上情况动态计算所需的Gas Limit,避免手动设置不足导致交易失败。

内容的提问来源于stack exchange,提问作者Jake Mulhern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 21:20:16