如何解决tokenOfOwnerByIndexERC721 时执行恢复错误
尝试通过 Matic polygon 测试网帐户的索引获取 tokenId 时出错
"maticProvider": "https://polygon-mumbai.infura.io/v3/<project_id>","parentProvider": "https://goerli.infura.io/v3/<project_id>"
代码:
const network = new Network(config.network,config.version);
// Todo do somthing about the unused
const MaticNetwork = network.Matic;
const MainNetwork = network.Main;
const matic = new Matic({
maticProvider: config.maticProvider,parentProvider: config.parentProvider,rootChain: MainNetwork.Contracts.RootChain,withdrawManager: MainNetwork.Contracts.WithdrawManagerProxy,depositManager: MainNetwork.Contracts.DepositManagerProxy,registry: MainNetwork.Contracts.Registry
});
matic.tokenOfOwnerByIndexERC721(
'<accountAddress>','<tokenAddress>',{
from: '<accountAddress>',gas: 150000
})
.then(console.log)
这会引发错误
(node:16166) UnhandledPromiseRejectionWarning: Error: Returned error: execution reverted
at Object.ErrorResponse (/Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/web3-core-helpers/lib/errors.js:28:19)
at /Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/web3-core-requestmanager/lib/index.js:303:36
at XMLHttpRequest.request.onreadystatechange (/Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/web3-providers-http/lib/index.js:98:13)
at XMLHttpRequestEventTarget.dispatchEvent (/Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/xhr2-cookies/dist/xml-http-request-event-target.js:34:22)
at XMLHttpRequest._setReadyState (/Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/xhr2-cookies/dist/xml-http-request.js:208:14)
at XMLHttpRequest._onHttpResponseEnd (/Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/xhr2-cookies/dist/xml-http-request.js:318:14)
at IncomingMessage.<anonymous> (/Users/tcadmin/Documents/hub/trove/trove-matic/node_modules/xhr2-cookies/dist/xml-http-request.js:289:61)
at IncomingMessage.emit (events.js:327:22)
at endReadableNT (_stream_readable.js:1221:12)
at processticksAndRejections (internal/process/task_queues.js:84:21)
合同:
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
// implements the ERC721 standard
import "../node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol";
// keeps track of the number of tokens issued
import "../node_modules/@openzeppelin/contracts/utils/Counters.sol";
import "../node_modules/@openzeppelin/contracts/access/Ownable.sol";
// Accessing the Ownable method ensures that only the creator of the smart contract can interact with it
contract MyNFT is ERC721,Ownable {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
using Strings for uint256;
// the name and symbol for the NFT
constructor()//(string memory _name,string memory _symbol)
ERC721("TroveNFT","TNFT") {}
// Optional mapping for token URIs
mapping (uint256 => string) private _tokenURIs;
// Base URI
string private _baseURIextended;
string private _creatorSign;
function _setCreatorSignature(string memory signature_) internal virtual {
_creatorSign = signature_;
}
function _creatorSignature() public view returns (string memory) {
return _creatorSign;
}
function setBaseURI(string memory baseURI_) external onlyOwner() {
_baseURIextended = baseURI_;
}
function _setTokenURI(uint256 tokenId,string memory _tokenURI) internal virtual {
require(_exists(tokenId),"ERC721Metadata: URI set of nonexistent token");
_tokenURIs[tokenId] = _tokenURI;
}
function _baseURI() internal view virtual override returns (string memory) {
return _baseURIextended;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
string memory _tokenURI = _tokenURIs[tokenId];
string memory base = _baseURI();
// If there is no base URI,return the token URI.
if (bytes(base).length == 0) {
return _tokenURI;
}
// If both are set,concatenate the baseURI and tokenURI (via abi.encodePacked).
if (bytes(_tokenURI).length > 0) {
return string(abi.encodePacked(base,_tokenURI));
}
// If there is a baseURI but no tokenURI concatenate the tokenID to the baseURI.
return string(abi.encodePacked(base,tokenId.toString()));
}
// Create a function to mint/create the NFT
// receiver takes a type of address. This is the wallet address of the user that should receive the NFT minted using the smart contract
// tokenURI takes a string that contains Metadata about the NFT
function mintNFT(address receiver,string memory creator,string memory tokenURI_) public onlyOwner returns (uint256) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(receiver,newItemId);
_setTokenURI(newItemId,tokenURI_);
_setCreatorSignature(creator);
// returns the id for the newly created token
return newItemId;
}
}
请帮忙!
解决方法
发现问题。
合同需要扩展 ERC721Enumerable
以在其中实现 tokenOfOwnerByIndex
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。