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

转移代币时报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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:27:03