转移代币时报Uncaught Error: invalid address错误如何解决?
问题排查与解决方案
1. 金额精度未按ERC20要求转换
ERC20标准的transfer方法第二个参数要求传入代币最小单位的整数数值,不能直接传递页面输入的常规计数单位数值。例如你的代币小数位为18位,用户输入转账1个代币时,实际需要传入的是1 * 10^18的数值。
你当前直接传递$("#amt").val(),没有做精度转换,会导致合约校验余额不足,触发转账失败。
修复示例代码:
// 可先调用合约接口获取小数位,也可以直接写死为你合约对应的decimals值 tokenContract.decimals((err, decimals) => { const transferAmt = web3.toBigNumber($("#amt").val()).mul(web3.toBigNumber(10).pow(decimals)) // 后续调用transfer使用转换后的transferAmt })
2. 调用合约方法缺少必填交易参数
你使用的是web3 0.x版本的API,调用合约写方法(需要上链的交易)时,除了合约方法本身的入参之外,还需要传入交易配置对象,指定发起交易的地址、gasLimit等参数,否则web3无法自动关联Metamask的当前账户。
修复后的transfer调用示例:
// 先获取Metamask当前选中的账户 web3.eth.getAccounts((err, accounts) => { if (err || !accounts.length) return console.error('未获取到Metamask账户') const fromAddr = accounts[0] // 这里传入上一步转换好精度的transferAmt tokenContract.transfer( $("#targetAddr").val().toString(), transferAmt, { from: fromAddr, gas: 200000 // 可根据实际业务调整gas值 }, (err, txHash) => { if (err) return console.error('转账失败', err) console.log('转账交易哈希', txHash) } ) })
3. 可选校验项
- 确认
$("#targetAddr").val()返回的地址是带0x前缀的合法Hex地址,可提前用web3.isAddress()方法做校验,避免传入格式错误的地址 - 确认当前Metamask选中的账户有足够的代币余额,同时账户内有足够的ETH支付链上gas费
- 确认合约实例初始化时传入的ABI包含完整的
transfer方法定义,参数类型、顺序和合约代码完全一致
内容的提问来源于stack exchange,提问作者DemonDia
相关产品推荐
相关产品推荐

