Rinkeby测试网执行ERC20 transfer函数原生交易后收款方余额无变化
问题根因
- 核心错误为构造原生交易时
to字段赋值错误:调用ERC20合约的transfer方法属于合约交互操作,交易的接收方必须是ERC20代币合约地址,而非代币收款地址。你当前代码中txData.to = receiver,相当于把包含transfer方法调用的交易数据发送给了普通用户收款地址,普通外部账户不会解析执行合约方法的编码数据,因此仅完成了一笔0 ETH的转账,没有触发任何代币余额变更逻辑。 - 辅助验证依据:返回的交易回执里
logs字段为空数组,符合上述推断——正常ERC20转账成功会触发Transfer事件,回执的logs中会包含对应事件数据。
修复方案
- 核心修改:调整
txData的to字段值为你的ERC20代币合约地址config.contractAddress,修改后的txData结构如下:
const txData = { nonce, gasLimit, gasPrice, value, data, // 已经是正确的transfer方法编码,无需修改 from: config.deployerAddress, to: config.contractAddress // 此处替换为代币合约地址 };
- 可选优化:你当前代码中获取
gasPrice时未加await,web3.eth.gasPrice是异步方法,建议修改为如下写法避免取到空值:
const gasPrice = web3.utils.toHex(await web3.eth.gasPrice || 2 * 1e9);
- 效果验证:修改后重新发起交易,交易成功后回执的
logs字段会包含对应Transfer事件,此时查询收款方代币余额即可正常更新。
内容的提问来源于stack exchange,提问作者Paritosh
相关产品推荐
相关产品推荐

