首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用安全帽检测接收合同中的发射?

如何使用安全帽检测接收合同中的发射?
EN

Stack Overflow用户
提问于 2022-04-29 23:48:28
回答 1查看 700关注 0票数 2

我正试图从expectEvent.inTransaction()中复制@openzeppelin/test-helpers中的“硬帽子”。

场景: token正在从owner转移到receiverContract。我想检查receiverContract是否发出了一个Received事件。

事务如下所示,由所有者发起。

代码语言:javascript
复制
const tx = await token.transferFrom(
  owner.address, // <- From this wallet
  receiverContract.address, // <- To this contract
  tokenId,
  {
    from: owner.address,
  }
);

此测试可以显示发出Transfer事件的令牌。

代码语言:javascript
复制
await expect(tx)
  .to.emit(this.token, "Transfer")
  .withArgs(owner.address, receiverContract.address, tokenId);

但我想写这样的东西..。

代码语言:javascript
复制
await expect(tx) // <- Not sure what to put here
  .to.emit(receiverContract, "Received") // <- This may also be off
  .withArgs(token, owner.address, tokenId, null);

或者,我可以查看接收者的收据对象,但我也不知道如何得到.通常是通过..。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2022-10-09 04:22:59

这可能会很晚,但可能会对其他人有所帮助。

合同不能代表另一个合同发出事件。这意味着您的receiverContract需要发出这个“接收”事件。

如果您是receiverContract的部署人员,您可以实现这一点。(由于在transferFrom()函数中有一个‘ERC721’-我认为这个令牌契约是ERC721或类似的-为了实现这一点,需要在receiverContract契约中有一个onERC721received()函数,如下所示:

代码语言:javascript
复制
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函数而不需要真正的传输。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72064651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档