Web3 - 从接口合同访问事件 - 此合同中不存在事件

Web3 - Accessing events from interface contract - Event doesn't exist in this contract

我有一个调用在 solidity 接口中声明的事件的合约。

我想知道如何从 Web3 收听该事件

import "../interfaces/Event.sol";
contract MyContract is ISEvents { 

 function emitEvent(uint32 operatorShare) external returns (bytes32 ID)
{
     emit myEvent(data);
}
}

接口文件

interface ISEvents {.
    event myEvent(
        uint256 adata
    );
}

web3 代码段

// MyContract is the web3 instance of MyContract
Myevent =MyContract.events.myEvent()
Myevent.on('data', eventcallback );

此returns:此合约中不存在事件“myEvent”。

web3监听myEvent的方法是什么?我应该部署实例文件吗?我是否必须在我的合同中声明该事件才能从外部访问它?

是的,您必须在合同中声明该事件才能从外部访问它。

例如,考虑 https://bscscan.com/address/0x2170Ed0880ac9A755fd29B2688956BD959F933F8#code

处的 ERC20 智能合约的可靠性代码

它包含以下声明的事件:

event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);

要从您的 web3 javascript/nodejs 代码拦截这些事件,您可以执行以下操作:

    const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed.binance.org/');
    const wallet = new ethers.Wallet(privateKey)
    const account2 = wallet.connect(provider);

    const factory = new ethers.Contract(
    '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',
    [
        'event Transfer(address indexed from, address indexed to, uint256 value)',
        'event Approval(address indexed owner, address indexed spender, uint256 value)',
    ],
    account2
    );

    factory.on('Transfer', async (from, to, value) => {
        console.log('transfer ' + from + ' ' + to + ' ' + value)
    })

    factory.on('Approval', async (owner, spender, value) => {
        console.log('approval ' + owner + ' ' + spender + ' ' + value)
    })

这是针对部署在币安智能链上的 ERC20 (BEP20) 智能合约的,但这与以太坊区块链完全相同。

在 Web3.js 个变量上更新您的 ABI 和合同地址。

所以我自己想到了如果有人使用 Solidity Interface 遇到同样的问题,可以在一个中心位置声明我们的事件并在您的不同合约之间共享它。

由于事件是在实例文件中声明的,并且由于 Javascript 无法解析父合同中的引用,您必须使用该 Solidity 实例的 ABI 文件来获取事件的引用。