我有一个nftToken合同,它将造币券传递给msg.sender,然后我在市场合同中有一个函数,它将nft从所有者转移到市场契约。但是,我收到了一个错误: ERC721:传输调用者既不是所有者也不是批准者。
下面是我的nftContract (nft)函数片段:
function createToken(string memory tokenURI) public returns (uint) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(msg.sender, newItemId);
_setTokenURI(newItemId, tokenURI);
setApprovalForAll(contractAddress, true);
return newItemId;
}
下面是我的市场代码(stripeMarket合同)函数片段:
function createItem(
address nftContract,
uint256 tokenId
) public payable{
address _owner = IERC721(nftContract).ownerOf(tokenId);
IERC721(nftContract).transferFrom(_owner, address(this),tokenId);
IERC721(nftContract).approve(address(this),tokenId);
}
在这里,我试图用web3从前端调用它:
const getItems=async()=>{
await contracts.nft.methods.createToken("https://i.ytimg.com/vi/nYxGhQYi0s4/maxresdefault.jpg").send({from: accounts[0]});
const owners = await contracts.nft.methods.ownerOf(1).call({from:accounts[0]});
await contracts.stripeMarket.methods.createItem(contracts.nft._address,1).send({from: {owners}});
}
但我发现了错误:
ERC721:传输呼叫者既不是所有者也不是被批准的.
发布于 2021-09-26 08:28:28
当nftContract
**'s执行setApprovalForAll(contractAddress, true)
时,它允许contractAddress
(市场契约)操作所有的令牌**。
但是新铸造的令牌属于msg.sender
-,而不是。因此,批准不适用于此令牌。
根据您的用例,您可以
nftContract
(而不是msg.sender
),以便允许市场合同操作它。或者直接按照市场合约来做。//所有者是nftContract
_mint(地址(这里),newItemId);//市场合同允许操作nftContract
的令牌setApprovalForAll(contractAddress,true);
msg.sender
(令牌所有者)在执行createItem()
之前在nftContract
上执行approve(marketAddress, tokenId)
。这将使市场合同批准经营这一特定的令牌拥有的msg.sender
。(假设它与_owner
的地址相同,否则它将失败。)
https://stackoverflow.com/questions/69302320
复制相似问题