sun*_*nce 7 javascript solidity smartcontracts web3js nft
我有一个 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;
}
Run Code Online (Sandbox Code Playgroud)
这是我的市场代码(stripeMarket Contract)函数片段:
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);
}
Run Code Online (Sandbox Code Playgroud)
在这里我尝试使用 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}});
}
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
ERC721:转账调用者不是所有者,也不是经过批准的。
Pet*_*jda 15
当nftContract执行时setApprovalForAll(contractAddress, true),它允许contractAddress(市场合约)操作所有的nftContract代币。
但新铸造的代币归msg.sender-而不是 拥有nftContract。因此该批准不适用于该代币。
根据您的用例,您可以
将新代币铸造到nftContract(而不是msg.sender),以便市场合约可以操作它。或者直接将其铸造到市场合约中。
// the owner is the `nftContract`
_mint(address(this), newItemId);
// the Market contract is allowed to operate the `nftContract`'s tokens
setApprovalForAll(contractAddress, true);
Run Code Online (Sandbox Code Playgroud)
在执行 之前让msg.sender(令牌所有者)执行。approve(marketAddress, tokenId)nftContractcreateItem()
这将给予市场合约批准来操作 所拥有的这一特定代币msg.sender。(假设它与_owner- 否则它会失败。)
| 归档时间: |
|
| 查看次数: |
14844 次 |
| 最近记录: |