2

I am newbie on solidity . trying to create NFT contract . I ve able to hardhat compile and deploy contract .

enter image description here

however during verify my contract with arguments and I am getting this error:

Error in plugin @nomiclabs/hardhat-etherscan: The contract verification failed. Reason: Fail - Unable to verify

enter image description here

I am also importing Open Zeppelin contracts ERC721Enumerable and Ownable.

Here's my contract.sol

pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";

contract TigerNft is ERC721Enumerable, Ownable {

    using SafeMath for uint256;
    string public FTP_PROVENANCE = "";
    uint256 public constant MAX_SUPPLY = 10000;
    uint256 public constant MAX_PUBLIC_MINT = 2;
    uint256 public constant MINT_PRICE = 28000000000000000; //0.028 ether;
    string private _baseTokenURI;

    uint256 public startingIndexBlock;
    uint256 public startingIndex;
    uint256 public REVEAL_TIMESTAMP;
    bool public saleIsActive = false;
    bool public isAllowListActive = false;
    mapping(address => uint256) public _allowList;

    constructor() ERC721("FortuneTigersPunk", "FTP") {
        _baseTokenURI = "ipfs://QmNm3JHSGhBgL5D5sBov2kjAtxDKEoC9SF1Rq81Tqt52jp/";
   
    }
     modifier callerIsUser() {
        require(tx.origin == msg.sender, "Caller is contract");
        _;
    }
      /* Set provenance once it's calculated 
     This function is to update the hash of the image containing all the apes. This image is generated and stored outside of the blockchain */

    function setProvenanceHash(string memory provenanceHash) public onlyOwner
    {
        FTP_PROVENANCE = provenanceHash;
    }
    
     function setBaseURI(string memory baseURI) public onlyOwner {
        setBaseURI(baseURI);
    }
    function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
        isAllowListActive = _isAllowListActive;
    }

    function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _allowList[addresses[i]] = numAllowedToMint;
        }
    }
    function numAvailableToMint(address addr) external view returns (uint256) {
        return _allowList[addr];
    }
    function mintAllowList(uint8 numberOfTokens) external payable{
    uint256 ts = totalSupply();
    require(isAllowListActive, "Allow list is not active");
    require(numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase");
    require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
    require(MINT_PRICE.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");

        _allowList[msg.sender] -= numberOfTokens;
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, ts + i);
       }
   }

    function setSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    function mint(uint numberOfTokens) public payable {
        uint256 ts = totalSupply();
        require(saleIsActive, "Sale must be active to mint tokens");
        require(numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(MINT_PRICE.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");

        for (uint i = 0; i < numberOfTokens; i++) {
            if (totalSupply() < MAX_SUPPLY) {
            _safeMint(msg.sender, ts + i);
           }
        }
    // If we haven't set the starting index and this is either 1) the last saleable token or 2) the first token to be sold after
        // the end of pre-sale, set the starting index block
     if (startingIndexBlock == 0 && (totalSupply() == MAX_SUPPLY || block.timestamp >= REVEAL_TIMESTAMP)) {
            startingIndexBlock = block.number;
      } 
    }
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Here's my deploy.ts

import { ethers} from "hardhat"

const main = async () =>{
  const FTPFactory = await ethers.getContractFactory("TigerNft") ;
  const FTPContract = await FTPFactory.deploy();
  console.log(`NFT address: ${FTPContract.address}`);
}
  main().catch((error)=> {
    console.error(error);
    process.exitCode =1;
  });

Here's my hardhat.config.ts

import * as dotenv from "dotenv";
import { HardhatUserConfig, task } from "hardhat/config";
import "@nomiclabs/hardhat-etherscan";
import "@nomiclabs/hardhat-waffle";
import "@nomiclabs/hardhat-ethers";
import "@typechain/hardhat";
import "hardhat-gas-reporter";

dotenv.config();

task("accounts", "Prints the list of accounts", async (taskArgs, hre) => {
  const accounts = await hre.ethers.getSigners();

  for (const account of accounts) {
    console.log(account.address);
  }
});

const config: HardhatUserConfig = {
  solidity: "0.8.4",
  networks: {
    rinkeby: {
      url: process.env.RINKEBY_URL,
      accounts:
        process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
    },
  },
  gasReporter: {
    enabled: process.env.REPORT_GAS !== undefined,
    currency: "USD",
  },
  etherscan: {
    apiKey: process.env.ETHERSCAN_API_KEY,
  },
};
export default config;
brook18
  • 179
  • 2
  • 5
  • 12

2 Answers2

0

I fixed this error try to put const FTPContract = await FTPFactory.deploy("FortuneTigersPunk", "FTP");

compile, deploy again and verify.

  • Cant bro . if you mention above changes in deploy scritpt . hit below error >npx hardhat run scripts/TigerNftdeploy.ts --network rinkeby No need to generate any newer typings. Error: too many arguments: in Contract constructor (count=2, expectedCount=0, code=UNEXPECTED_ARGUMENT, version=contracts/5.5.0) at Logger.makeError (C:\Users\jj\hardhat- reason: 'too many arguments: in Contract constructor', code: 'UNEXPECTED_ARGUMENT', count: 2, expectedCount: 0 – brook18 Mar 08 '22 at 13:56
  • (C:\Users\jj\hardhat- reason: 'too many arguments: in Contract constructor', code: 'UNEXPECTED_ARGUMENT', count: 2, expectedCount: 0 – brook18 Mar 08 '22 at 13:58
  • @brook18 , the line given above should have been an example, not a literal replacement. I assume you are working on a different contract. What you needed was that string of text, up to the parameters for .deploy(), in your case, your contract has no args, so you can ignore "fortuneTigersPunk" and "FTP" – LeftBrain Mar 31 '22 at 15:36
0

i try import factories from typechain and its working fine now.

However i still dont know it it failed at 1st stage without import factories.

import { ethers} from "hardhat"
import { TigerNft__factory} from "../typechain-types";

const main = async () =>{
  // const FTPFactory = await ethers.getContractFactory("TigerNft") ;
  const FTPFactory = await ethers.getContractFactory("TigerNft") as TigerNft__factory;
  const FTPContract = await FTPFactory.deploy();
  // const FTPContract = await FTPFactory.deploy("FortuneTigersPunk", "FTP");
  // const MAXNFT = (await ethers.getContractFactory("MaxNFT")) as MaxNFT__factory;
  //const nft = await MAXNFT.deploy();

 // console.log(`NFT address: ${nft.address}`);
  console.log(`NFT address: ${FTPContract.address}`);
}
  main().catch((error)=> {
    console.error(error);
    process.exitCode =1;
  });

enter image description here

brook18
  • 179
  • 2
  • 5
  • 12