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

使用JavaScript调用Solidity ERC721智能合约铸造Token失败求助

问题排查:网页端调用ERC721合约mint无效果的原因

首先,从你描述的情况来看——Remix和Hardhat本地测试都能正常执行mint,但网页端交易显示成功却没有生成Token,核心问题出在交易对象的目标地址设置错误,我们一步步拆解:

核心错误点

1. 交易目标地址填错了

看你网页端代码里的txObject:

const txObject = {
 nonce: nonce_count,
 to: account_address, // 这里是错误的!
 // ...其他字段
};

你把交易的目标地址设置成了account_address(用户钱包地址),但实际上调用合约方法时,交易的to字段必须是合约地址。这就导致你发送的交易只是给自己转了0ETH(空交易),根本没有触发合约的mint方法,所以Etherscan显示交易成功,但合约的tokenCounter完全没变化。

2. Nonce获取的账户不匹配

代码中你用account_address获取nonce:

let nonce_count = await web3.eth.getTransactionCount(account_address);

但你签名用的是privateKey对应的账户account:

const account = web3.eth.accounts.privateKeyToAccount(privateKey).address;

如果account_address和account不是同一个地址,会导致nonce错误(不过你交易成功了,大概率这两个地址是同一个,但规范来说应该用签名账户的地址获取nonce)。

修复方案

步骤1:修正交易目标地址

把txObject里的to字段改为合约地址contract_address:

const txObject = {
 nonce: nonce_count,
 to: contract_address, // 替换成你的ERC721合约地址
 gasPrice: web3.utils.toHex(web3.utils.toWei('10','gwei')),
 gas: await transaction.estimateGas({from: account}),
 data: transaction.encodeABI()
};

步骤2:修正Nonce的获取来源

确保nonce是从签名用的账户获取:

const nonce_count = await web3.eth.getTransactionCount(account); // 用privateKey对应的账户地址

步骤3:验证ABI正确性

确认你使用的ABI和合约的mint方法签名完全一致,避免因为ABI错误导致方法调用失败。

验证修复效果

修复后重新发送交易,去Etherscan查看交易的Input Data字段,应该能看到mint方法的调用编码数据(而不是空的)。此时再查询合约的tokenCounter,应该会正常递增,同时能查询到新铸造的Token信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:27:47