ERC721合约调用:转账调用者不是所有者也不是批准的

问题描述 投票:0回答:1

我正在编写一个 React 应用程序,它负责调用一个合约,通过 ethers.js 将 ERC721 NFT 从一种形式转换为另一种形式。在我的 Web 应用程序流程中,我要求用户授予对其 Metamask 钱包的访问权限,以便显示符合转换条件的 NFT,并在合约调用发生之前批准交易。

当我尝试对现有 ERC721 合约进行调用时出现错误,指出交易的调用者不是所有者或未获准调用该合约。然而,当我在区块浏览器中查看相关 NFT 时,我可以看到调用钱包实际上是 NFT 的所有者,但我得到了这个异常:

execution reverted: \"ERC721: transfer caller is not owner nor approved\" (action=\"estimateGas\", data=\"0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000314552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564000000000000000000000000000000\", reason=\"ERC721: transfer caller is not owner nor approved\", transaction={ \"data\": \"0x8914d9f00000000000000000000000000000000000000000000000000000000000001363\", \"from\": \"<wallet of sender>\", \"to\": \"<contract address>\" }, invocation=null, revert={ \"args\": [ \"ERC721: transfer caller is not owner nor approved\" ], \"name\": \"Error\", \"signature\": \"Error(string)\" }, code=CALL_EXCEPTION, version=6.8.1)"

查看合同源,我可以看到在转换过程中进行了批准调用,该调用应该处理批准过程:

function Nft3DTo2D(uint256 tokenId) external {
    
    uint256[] memory tokenIds = nft3DContract.walletOfOwner(msg.sender);
    require(_contains(tokenIds, tokenId) == true, "Address does not hold token!");

    nft3DContract.safeTransferFrom(msg.sender, address(this), tokenId);
    nft2DContract.approve(msg.sender, tokenId); # approval happens here
    nft2DContract.safeTransferFrom(address(this), msg.sender, tokenId);

}

我不太确定为什么会遇到这个问题。有什么想法吗?

blockchain ethers.js nft evm erc721
1个回答
0
投票

“调用钱包”并不是做出转账动作的演员。

是合约,当调用

nft3DContract.safeTransferFrom
时,用户需要调用
nft3DContract.approve
来授予合约进行转账操作的权限。

顺便说一句,

nft2DContract.approve
是多余的,因为在这种情况下合约是所有者

© www.soinside.com 2019 - 2024. All rights reserved.