问题说明:
如果合约返回多个不同类型值组成的元组,在ether.js中需要获取合约的多个返回值,进行后续的处理,比如合约中返回操作状态,操作时间,交易地址,交易数量等四个变量在dapp中展示四个变量的基础信息。
解决方案:
如果合约中没有触发event或者只触发了一个event,那么可以通过变量 events[0].args 变量解析元组分别析构四个变量的值,但是如果合约触发了多个event,那么events返回的是合约触发的event数组对象,需要遍历所有的event事件,根据事件名来区分执行的事件,通过返回的event来解析元组数据,析构出四个返回结果值。
具体合约代码如下:
// 处理触发了多个event的合约接口返回结果,根据触发的事件名称来获取返回结果。此处合约触发了transferAll函数 // 该还是调用了USDT.transferFrom,触发了usdt的transfer事件。因此触发了多个事件需要通过事件名称transferAll // 来处理返回结果。 const tx = await contract.transferAll(address); // 调用 Solidity 合约中的 transferAll 函数 const txReceipt = await tx.wait(); // 获取交易收据 for (let i = 0; i < events; i++) { const event = events[i]; if (event.event === "transferAll") { v_status = args.status; v_collector = args.transfer; v_tokenBalance = args.tokenBalance; //转换时间戳为本地时区自然时间 v_timestamp = (new Date(args.timestamp * 1000)).toLocaleString() //console.log('执行结果:', status); // 打印执行结果 //console.log('转账地址:', transfer); // 打印转账地址 //console.log('转账数量:', tokenBalance); // 打印转账数量 //console.log('转账时间:', timestamp); // 打印转账时间 break; } }
另外可以通过如下代码处理方式来接收元组返回的多个数据,通过EC6语法格式,析构元组中的变量
await contract.transferAllT(address).then(([collStatus, collAddress, collNum, collTime]) => { console.log(collStatus); console.log(collAddress); console.log(collNum); console.log(collTime); }).catch((error) => { console.log(error); });
至此,完成ether.js中接收solidity合约中触发多个event返回多个值的处理方式的所有操作流程。
pdf+视频Arbitrum链发币教程及多模式组合合约源代码下载:
Arbitrum链发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频Arbitrum链发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册