使用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
相关产品推荐
相关产品推荐

