ERC721智能合约撤销批准

  • 本文关键字:智能 ERC721 solidity evm
  • 更新时间 :
  • 英文 :


我对ERC721的处理有一些疑问。我想让用户批准一个外部智能合约来转移它的一个NFT。我使用的是approve(to, tokenId)

那么,在某些情况下,合同应该能够通过调用approve(address(0), tokenId)撤销其自己的授权(NFT所有者从智能合约中调用取消方法,执行一些操作并撤销自己对令牌的权限)

在这一步,我得到了以下错误:ERC721:批准的调用者不是所有者,也不是被批准的

我的理解是,为了使合同能够调用批准,NFT所有者应该与setApprovalForAll(operator, _approved)一起批准?用户拥有的同一集合中的其他NFT怎么办?合同也能管理它们吗?我想尽可能地限制智能合约的权限,并坚持一个非常具体的NFT转移(其token_id)谁能告诉我做这件事的正确方法?

听起来你在这个过程中涉及到两个合同和一个EOA。您希望NFT合约赋予另一个合约转移令牌的权限,以及删除该权限。您应该遵循以下顺序:

1)。EOA调用NFT合约上的approve(to, tokenID)2)。NFT合约有一个函数调用approve(address(0), tokenID)3)。非nft契约调用步骤2中的函数——比;作梦误差

如果非nft合约没有获得tokenID的批准权限,您确实会得到此错误。即使令牌所有者正在调用该函数,调用的上下文也会将Non-NFT合约地址读取为msg.sender。实际上,如果Non-NFT契约中的函数进行了委托调用而不是常规调用,则可以避免这种情况。

如果您只使用一个NFT,则不需要使用setApprovalForAll。您可以通过调用approve()来批准合同,然后使用上述方法撤销合同。

最新更新