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

调用智能合约函数时遭遇Uncaught (in promise) Error: invalid address错误的解决方法

修复Web3调用智能合约时的"invalid address"错误

咱先拆解下你遇到的这个错误,核心问题出在两个地方:

错误原因

  1. 参数传递混淆:你把交易的from选项当成了合约函数的第一个参数传入了。看错误提示里的value={"from":"0xaD1D30B476C195C23ef4CC9b7A3c53E7423B7690"},说明合约的getTicketsForPlayers函数需要接收一个地址类型的参数,但你把交易配置对象传进去了,Web3自然会报错说这是无效地址。
  2. 异步操作没处理:web3.eth.getAccounts()是异步函数,你没加await,导致变量a拿到的是一个Promise实例,不是实际的账户数组(不过这个变量你后面没用到,但写法上是不规范的)。

修复后的代码

给你调整后的版本,加上了错误捕获和规范的异步处理:

async function fetchPlayerTickets() { 
  try {
    // 先拿到合约实例
    const contractInstance = await App.contracts["MyContract"].deployed(); 
    // 异步获取账户,必须加await
    const accounts = await web3.eth.getAccounts(); 
    // 重点:第一个参数是合约函数需要的地址(比如玩家地址),第二个参数才是交易选项
    const playerTickets = await contractInstance.getTicketsForPlayers(App.account, {from: App.account}); 
    console.log("玩家门票信息:", playerTickets); 
  } catch (error) {
    console.error("调用合约函数失败:", error);
  }
}

额外说明

  • 如果你的getTicketsForPlayers函数其实不需要参数(比如查询当前调用者的门票),那应该把代码改成:
    const playerTickets = await contractInstance.getTicketsForPlayers({from: App.account});
    
    但结合错误提示来看,你的函数肯定是需要一个地址参数的,所以第一种写法才是正确的。
  • 给匿名函数加个名字,方便后续调试和调用;用try/catch包裹异步操作,能快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:17:34