检查所有者是 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);
我似乎无法弄清楚哪里出了问题,即使是查看发布的其他问题也是如此。 代币应该持有 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);