如何使用wagmi.sh的useSendTransaction钩子发送ERC20代币?
用wagmi的useSendTransaction发送ERC20代币的正确方式
要发送ERC20代币,你之前的思路有误——不能把合约地址放在data字段里,正确的逻辑是:
to字段填ERC20代币的合约地址(交易要发给合约,触发它的transfer方法完成代币转账)value字段设为0(转ERC20不需要附带原生代币)data字段填编码后的transfer方法调用数据(包含接收地址和转账数量这两个核心参数)
完整示例代码
import { useSendTransaction, usePrepareSendTransaction, encodeFunctionData } from 'wagmi' import { parseUnits } from 'viem' // 处理代币小数位,也可用ethers的工具函数替代 // ERC20合约核心ABI片段,仅需transfer方法的定义 const erc20Abi = [ { inputs: [ { internalType: 'address', name: 'to', type: 'address' }, { internalType: 'uint256', name: 'value', type: 'uint256' }, ], name: 'transfer', outputs: [{ internalType: 'bool', name: '', type: 'bool' }], stateMutability: 'nonpayable', type: 'function', }, ] as const function App() { // 替换成你实际的参数 const tokenContractAddress = '0x...' // ERC20代币合约地址 const recipientAddress = 'moxey.eth' // 代币接收地址 const amount = '10' // 要转账的代币数量(比如10个USDT) const decimals = 6 // 代币小数位,USDT为6,多数ETH系代币为18 const { config } = usePrepareSendTransaction({ request: { to: tokenContractAddress, // 交易目标是ERC20合约 value: 0n, // 原生代币转账金额设为0 // 编码transfer方法的调用数据 data: encodeFunctionData({ abi: erc20Abi, functionName: 'transfer', args: [ recipientAddress, parseUnits(amount, decimals), // 把人类可读数量转成合约要求的uint256格式 ], }), }, }) const { data, isLoading, isSuccess, sendTransaction } = useSendTransaction(config) return ( <div> <button disabled={!sendTransaction} onClick={() => sendTransaction?.()}> 发送ERC20代币 </button> {isLoading && <div>请在钱包中确认交易</div>} {isSuccess && <div>交易成功:{JSON.stringify(data)}</div>} </div> ) }
关键细节说明
- ABI的作用:
erc20Abi是ERC20合约transfer方法的接口定义,用来让wagmi正确编码交易调用数据。 - 数量转换:
parseUnits会把带小数的人类可读数量(比如"10")转换成合约能识别的整数格式(比如10个USDT会转成10000000)。 - 交易目标逻辑:必须把
to设为ERC20合约地址,因为只有合约能处理代币的转账逻辑,直接给用户地址发交易只会失败。
内容的提问来源于stack exchange,提问作者AMHF
相关产品推荐
相关产品推荐

