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

时间:2021-07-14 19:13:26

标签: javascript ethereum solidity web3

我有一个调用在 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 );

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

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

1 个答案:

答案 0 :(得分:0)

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

例如,考虑在 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)
    })

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