如何使用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();
关键细节说明
- ABI编码:使用
Utils.encodeFunctionData方法对transfer方法进行编码,不需要完整的合约ABI,只需要该方法的签名和输入参数定义即可。 - 代币单位转换:所有ERC20代币的转账数量都需要转换为最小单位(wei级别),比如USDC的小数位数是6,所以1 USDC等于10^6个最小单位,用
Utils.parseUnits(AMOUNT_TO_SEND, TOKEN_DECIMALS)完成转换。 - Gas估算:调用
estimateGas方法可以根据当前链上情况动态计算所需的Gas Limit,避免手动设置不足导致交易失败。
内容的提问来源于stack exchange,提问作者Jake Mulhern
相关产品推荐
相关产品推荐

