检查所有者是 msg.sender,但仍然给出 ERC721:转移调用者不是所有者也未被批准

Check owner is msg.sender, but still gives ERC721: transfer caller is not owner nor approved

我似乎无法弄清楚哪里出了问题,即使是查看发布的其他问题也是如此。 代币应该持有 nft

在NFT合约中,

function NFTMe(string memory tokenUR) public returns (uint256) {
        uint256 newTokenId = _tokenIds.current();
        _mint(msg.sender, newTokenId);
        _setTokenURI(newTokenId, tokenUR);
        // setApprovalForAll(msg.sender, true); <-- this will give me reverted with reason string 'ERC721: approve to caller'
        _tokenIds.increment();
        return newId ;
    }

我还有一个功能可以查看谁是所有者:

function getOwner(uint256 tokenId) public view returns(address) {
        address owner = ERC721.ownerOf(tokenId);
        return owner;
    }

当我部署时,它说 currentOwner 是创建它的所有者。

令牌中,

constructor( string memory _name, string memory _symbol, address nftAddr) ERC20(_name, _symbol) {
nft = IERC721(nftAddr);
}
function transfer() public {
    // 'ERC721: transfer caller is not owner nor approved'
    nft.transferFrom(msg.sender, address(this), nftId); 
 }
// 'ERC721: transfer caller is not owner nor approved'
nft.transferFrom(msg.sender, address(this), nftId); 

在这种情况下,“转移呼叫者”是您的 token 合约。哪个不是token owner,没有被用户(token owner)同意转让token。

最简单的解决方案是让 token 合约在 NFT 合约的 NFTMe() 函数内由用户自动批准:

_approve(tokenContractAddress, newTokenId);