Contract verification failing on etherscan

I have been trying to verify NFT contract that was deployed on June 28th 2022. The developer who deployed the contract is no longer in contact but I have the source code for it. I tried to verify it using Remix, Hardhat and manually through etherscan but it is failing. I think the openzeppelin contracts that were used during deployment were old version as the contract was deployed an year back almost. I do not know exactly what version of OpenZeppelin contracts were used but I know the compiler was 0.8.7 that was used for deployment.

The mainnet NFT contract

The contract code is as following

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.0 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract ElonGoat is ERC721, Ownable, ReentrancyGuard {
    using Strings for uint256;

    string baseURI;
    string public baseExtension = ".json";
    uint256 totalSupply;
    uint256 currentSupply;
    uint256 NFTCost;

    constructor(string memory uri) ERC721("EGT", "EGT") {
        totalSupply = 628;
        currentSupply = 0;
        NFTCost = 0.085 ether;

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;

    function mint(uint256 amount) public payable {
        require(msg.sender != address(0), "ERC721Mint: INVALID_ADDRESS.");
            totalSupply >= currentSupply + amount,

        if (msg.sender != owner()) {
                msg.value >= NFTCost * amount,

        for (uint256 i = 0; i < amount; i++) {
            _safeMint(msg.sender, currentSupply + 1);

    function getTotalSupply() public view returns (uint256 supply) {
        return totalSupply;

    function getCurrentSupply() public view returns (uint256 supply) {
        return currentSupply;

    function tokenURI(
        uint256 tokenId
    ) public view virtual override returns (string memory) {
            "ERC721Metadata: URI query for nonexistent token"

        string memory currentBaseURI = _baseURI();
            bytes(currentBaseURI).length > 0
                ? string(
                : "";

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;

    function setNFTCost(uint256 newNFTCost) public onlyOwner nonReentrant {
        NFTCost = newNFTCost;

    function getBaseURI() public view returns (string memory) {
        return baseURI;

    function getNFTCost() public view returns (uint256) {
        return NFTCost;

    function setBaseExtension(
        string memory _newBaseExtension
    ) public onlyOwner {
        baseExtension = _newBaseExtension;

    function adminIncreaseMaxSupply(
        uint16 newMaxSupply
    ) external onlyOwner nonReentrant {
        totalSupply = newMaxSupply;

    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{
            value: address(this).balance

Any idea what could I be doing wrong?

I did read the post you have linked here. I am familiar with verification on etherscan through hardhat and remix. But here I am not sure how can I find the version of the OpenZeppelin contracts that were imported.

Is there a way to find that? Or it is just a bruteforce method to find the correct imported version of OpenZeppelin contracts that were imported during deployment. Because that is the reason that I see why the bytecode is not matching. I am sure other compiler settings are correct.

Not that I can think of. Sorry

No worries. Thanks. Looks like its going to extremely difficult to verify this contract then. Its like a shot in the dark.