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 文件来获取事件的引用。
我有一个调用在 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 文件来获取事件的引用。