我使用wagmi useContractWrite钩子执行智能契约函数,并希望从通过事件发出的函数中捕获响应。事件似乎是在data.logs下捕获的,事件参数/params包含在logs[0].data字段中,但是命名的参数/params不存在。是否还需要做一些额外的工作来捕获事件参数,或者我必须以某种方式解析日志0.data中完整字符串中的各个参数。
数据字符串中突出显示的部分是事件的第一个参数,其余部分将在该参数之后追加。
下面是来自useContractWrite的响应数据对象的屏幕截图。

发布于 2023-02-07 16:08:49
您需要解析来自logs[0].data字段的各个参数,因为它包含事件的编码数据,而不是命名的参数。
您可以在这里阅读更多内容:https://docs.ethers.org/v5/api/utils/abi/coder/
示例代码:
/* some more code here */
// define signature and hash
const eventSignature = 'YourEvent(uint256, string)';
const eventSignatureHash = ethers.utils.id(eventSignature);
/* some more code here */
// check topics for your event
if (logs.topics[0] === eventSignatureHash) {
const decodedEvent = ethers.utils.defaultAbiCoder.decode(
[
'uint256',
'string'
],
logs[0].data
);
// console decoded data
console.log(decodedEvent);
}示例演示console.log()输出的decodedEvent:
[ 123, 'hello world' ]发布于 2023-04-10 20:05:52
如果您使用的是Wagmi,则不需要经过复杂的事务日志解码过程。您可以简单地使用Wagmi的useContractEvent({})钩子和useContractWrite({})来处理事件。
钩子的结构如下:
useContractEvent({
address: 'Your Contract Address',
abi: 'You Contract ABI',
eventName: 'Name of Your Event',
listener(parameter1, parameter2, parameter3) {
console.log(parameter1, parameter2, parameter3)
},
})阅读它的文档,并根据您的需要修改这个挂钩:
https://ethereum.stackexchange.com/questions/144431
复制相似问题