我正试图从expectEvent.inTransaction()中复制@openzeppelin/test-helpers中的“硬帽子”。
场景: token正在从owner转移到receiverContract。我想检查receiverContract是否发出了一个Received事件。
事务如下所示,由所有者发起。
const tx = await token.transferFrom(
owner.address, // <- From this wallet
receiverContract.address, // <- To this contract
tokenId,
{
from: owner.address,
}
);此测试可以显示发出Transfer事件的令牌。
await expect(tx)
.to.emit(this.token, "Transfer")
.withArgs(owner.address, receiverContract.address, tokenId);但我想写这样的东西..。
await expect(tx) // <- Not sure what to put here
.to.emit(receiverContract, "Received") // <- This may also be off
.withArgs(token, owner.address, tokenId, null);或者,我可以查看接收者的收据对象,但我也不知道如何得到.通常是通过..。
const tx = await token.transferFrom(owner.address, receiverContract.address, tokenId, {from: owner.address});
const receipt = await tx.wait();
console.log("receipt", receipt); // <- This will show an events array
// which I can check. But how do I get this same receipt object for
// the receiverContract发布于 2022-10-09 04:22:59
这可能会很晚,但可能会对其他人有所帮助。
合同不能代表另一个合同发出事件。这意味着您的receiverContract需要发出这个“接收”事件。
如果您是receiverContract的部署人员,您可以实现这一点。(由于在transferFrom()函数中有一个‘ERC721’-我认为这个令牌契约是ERC721或类似的-为了实现这一点,需要在receiverContract契约中有一个onERC721received()函数,如下所示:
function onERC721received(address, address _from, uint256 _tokenID) public returns (bytes4) {
emit Received(msg.sender, _sender, _tokenID)
//msg.sender will be the contract that made the transfer call.
return this.onERC721Received.selector;
}N.B:如果receiverContract也是ERC721契约,则需要在其中使用receiverContract关键字。
然后,令牌契约将需要在完成传输之前调用此函数选择器。基于ERC721模板的OpenZeppelin契约只包含在_checkOnERC721Received()检查中的safeTransferFrom(),而不是transferFrom()函数中。如果您正在实现自己的契约,则需要在调用任何传输之前调用的函数(如onERC721received ())中调用_beforeTokenTransfer选择器。
最后,您应该小心地调用其他契约,阅读更多关于可重入攻击的信息,并且也要注意,任何人都可以调用onERC721Received函数而不需要真正的传输。
https://stackoverflow.com/questions/72064651
复制相似问题