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

如何从Web3.js的web3.eth.Contract.getPastEvents返回的returnValues: Result{}中提取account值

解决Web3.js getPastEvents返回Result对象中提取account的问题

嘿,我懂你现在的困扰——getPastEvents返回的returnValues看着是个Result {}对象,明明知道里面有数据,却不知道怎么顺畅提取account值对吧?其实这个Result是Web3.js做了包装的可枚举对象,用几种简单方式就能轻松拿到你要的内容。

方法1:直接通过属性访问

哪怕控制台打印显示的是Result {},它里面的属性依然可以用点语法或者方括号直接访问。修改你的代码试试:

for (const element2 of lendingPairList) {
  const eventPair = new web3.eth.Contract(PairContractABI, element2)
  eventPair.getPastEvents("Deposit", {
    fromBlock: 12867493,
    toBlock: 'latest'
  })
  .then(events => {
    // 遍历每一条事件日志
    events.forEach(event => {
      // 直接提取account值
      const targetAccount = event.returnValues.account;
      // 也可以用方括号写法:event.returnValues['account']
      console.log("提取到的account地址:", targetAccount);
    });
  })
  .catch((err) => console.error(err));
}

方法2:转换为普通JavaScript对象

如果你更习惯操作普通对象,可以用展开运算符或者Object.assign()把Result转换成普通对象,这样结构会更直观:

events.forEach(event => {
  // 转换为普通对象
  const plainValues = { ...event.returnValues };
  const targetAccount = plainValues.account;
  console.log("转换后提取的account:", targetAccount);
});

关于你之前尝试的过滤和topics方式

你提到按文档用topics过滤没成功,大概率是因为Deposit事件里的account参数没有被Solidity的indexed关键字修饰——topics只能用来过滤被标记为indexed的参数,未被修饰的参数会被放在returnValues里,所以这种方式本来就不适合提取非索引参数,这不影响你从returnValues里拿值。另外记得确认你的PairContractABI里Deposit事件的定义是正确的,确保account是该事件的合法参数,这样Web3.js才能正确解析出对应属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:48:13