关于sendTransaction与writeContract(transfer函数)发送代币的疑问
原生代币与ERC20代币转账实现的正确性确认
你的实现方式完全正确,没有把问题复杂化,这两种代币的转账逻辑本身就存在差异:
原生代币(以AVAX为例)的转账逻辑
原生代币是区块链网络的基础资产,转账本质就是发起一笔普通链上交易,直接调用sendTransaction即可——只需要指定接收地址to和转账金额value,不需要和任何合约交互,因为链会直接更新双方账户的原生代币余额。
你写的代码是标准的原生代币转账写法:
await sendTransaction({ to, value: parseEther(value), })
ERC20代币(以USDT为例)的转账逻辑
ERC20代币是基于智能合约发行的资产,所有的余额记录、转账操作都由对应的ERC20合约负责管理,所以必须通过调用合约的transfer方法来完成转账。
你用writeContractAsync调用ERC20合约的transfer方法是完全标准的正确做法,需要的参数也都没少:
- ERC20合约的ABI:用来让钱包解析合约的方法结构
- 代币合约地址:指定要操作的是哪一个ERC20合约
- 方法名
transfer:ERC20标准定义的转账方法 - 参数:接收地址和解析后的转账金额(注意要匹配代币的小数位数,比如USDT是6位小数,
parsed要确保是正确的数值)
你的代码示例完全符合规范:
await writeContractAsync({ abi: erc20Abi, address: txDetails.tokenAddress, functionName: 'transfer', args: [txDetails.to, parsed], });
内容的提问来源于stack exchange,提问作者samplecode3300
相关产品推荐
相关产品推荐

