我有一个调用在 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 的方法是什么?我应该部署实例文件吗?我是否必须在我的合同中声明该事件才能在外部访问它?
答案 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) 智能合约,但这对于以太坊区块链完全相同。