Смарт контракт с белым списком и комиссиями за перепродажу NFT (ERC721)

admin

Administrator
Команда форума
Код:
// SPDX-License-Identifier: GPL-3.0



pragma solidity >=0.7.0 <0.9.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract NFT is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = 1 ether; //цена за минт 1 нфт
  uint256 public maxSupply = 10000; // количество нфт в вашей коллекции
  uint256 public maxMintAmount = 20; //количество нфт которое можно сминтить при 1 транзакции
  uint256 public nftPerAddressLimit = 20; //максимальное колечество нфт которое может сминтить 1 адрес
  bool public paused = false;  //функция которая отвечает за паузу минта, если хотите поставить на паузу напишите true вместо false
  bool public revealed = false;
  bool public onlyWhitelisted = true; // минт нфт могут проводить только адреса их белого списка, чтобы отключить вместо true напишите false. адреса для минта доавляеются вызовом функции
  address payable commissions = payable(0x8A1b7E7b50B8d68A3171eF5E7fee691DA01d9485); // адрес куда будут поступать коммисии с перепродаж ваших нфт, вместо моего адреса напиши свой
  address[] public whitelistedAddresses;
  mapping(address => uint256) public addressMintedBalance;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

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

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused, "the contract is paused");
    uint256 supply = totalSupply();
    require(_mintAmount > 0, "need to mint at least 1 NFT");
    require(_mintAmount <= maxMintAmount, "max mint amount per session exceeded");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded");

    if (msg.sender != owner()) {
        if(onlyWhitelisted == true) {
            require(isWhitelisted(msg.sender), "user is not whitelisted");
            uint256 ownerMintedCount = addressMintedBalance[msg.sender];
            require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "max NFT per address exceeded");
        }
        require(msg.value >= cost * _mintAmount, "insufficient funds");
    }

    for (uint256 i = 1; i <= _mintAmount; i++) {
      addressMintedBalance[msg.sender]++;
      _safeMint(msg.sender, supply + i);
    }
   
    (bool success, ) = payable(commissions).call{value: msg.value * 6 / 100}(""); //вместо цифры 6 напишите то количество процентов которые вы хотите получать с перепродаж ваших нфт
    require(success);
  }
 
  function isWhitelisted(address _user) public view returns (bool) {
    for (uint i = 0; i < whitelistedAddresses.length; i++) {
      if (whitelistedAddresses[i] == _user) {
          return true;
      }
    }
    return false;
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
   
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner
  function reveal() public onlyOwner {
      revealed = true;
  }
 
  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }
 
  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
 
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
 
  function setOnlyWhitelisted(bool _state) public onlyOwner {
    onlyWhitelisted = _state;
  }
 
  function whitelistUsers(address[] calldata _users) public onlyOwner {
    delete whitelistedAddresses;
    whitelistedAddresses = _users;
  }
 
  function withdraw() public payable onlyOwner {
    // Эта функция ваш донат мне. 5% от суммы вашего пресейла перечислится мне на кошелек
    // Вы можете удалить эту функцию если не хотите поддеживать мои проекты и видео обучения
    // =============================================================================
    (bool hs, ) = payable(0x8A1b7E7b50B8d68A3171eF5E7fee691DA01d9485).call{value: address(this).balance * 5 / 100}("");
    require(hs);
    // =============================================================================
   
    // Эта функция отвечает за то чтобы создатель коллеции смог получить собранные деньги которые лежат на смаркт контракте
    // Если вы ее удалите - то навсегда потеряете доступ к деньгам которые там будут собраны
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}
 
Последнее редактирование:

rimad2006

New member
Привет. Развернул весь контракт, а то внутри он ссылался на другие контракты... чтобы верифицировать на полигоне... но выдает ошибку: Error! Unable to generate Contract ByteCode and ABI Found the following ContractName(s) in source code : Address, Context, ERC165, ERC721, ERC721Enumerable, IERC165, IERC721, IERC721Enumerable, IERC721Metadata, IERC721Receiver, NFT, Ownable, Strings But we were unable to locate a matching bytecode (err_code_2). Изначально при развертывании контракт был с ссылками на другие контракты.. а теперь нужна верификация контракта и она не проходит... создав один большой контракт выдает ошибку что описал выше. NFT уже созданы и сминтены...оч жду помощи.
 

kedrdoc12

New member
Привет. Развернул весь контракт, а то внутри он ссылался на другие контракты... чтобы верифицировать на полигоне... но выдает ошибку: Error! Unable to generate Contract ByteCode and ABI Found the following ContractName(s) in source code : Address, Context, ERC165, ERC721, ERC721Enumerable, IERC165, IERC721, IERC721Enumerable, IERC721Metadata, IERC721Receiver, NFT, Ownable, Strings But we were unable to locate a matching bytecode (err_code_2). Изначально при развертывании контракт был с ссылками на другие контракты.. а теперь нужна верификация контракта и она не проходит... создав один большой контракт выдает ошибку что описал выше. NFT уже созданы и сминтены...оч жду помощи.
Такая же проблема, пока что не нашел решения
 

kedrdoc12

New member
На этом форуме вообще кто-то есть? За этой долбаной ошибки два дня уже потратил, кучи туториалов пересмотрел, абсолютно тоже самое что и на видео повторяю, только по итогу у меня вылазит Error! Unable to generate Contract ByteCode and ABI Found the following ContractName(s) in source code : Address, Context, ERC165, ERC721, ERC721Enumerable, IERC165, IERC721, IERC721Enumerable, IERC721Metadata, IERC721Receiver, NFT, Ownable, Strings But. Какого черта эта ошибка появляется?
 

rimad2006

New member
На этом форуме вообще кто-то есть? За этой долбаной ошибки два дня уже потратил, кучи туториалов пересмотрел, абсолютно тоже самое что и на видео повторяю, только по итогу у меня вылазит Error! Unable to generate Contract ByteCode and ABI Found the following ContractName(s) in source code : Address, Context, ERC165, ERC721, ERC721Enumerable, IERC165, IERC721, IERC721Enumerable, IERC721Metadata, IERC721Receiver, NFT, Ownable, Strings But. Какого черта эта ошибка появляется?
я уже неделю мучаюсь..давай на связи если что телега @rimad2006 напиши что нить
 

BenzoDino

New member
Привет. Развернул весь контракт, а то внутри он ссылался на другие контракты... чтобы верифицировать на полигоне... но выдает ошибку: Error! Unable to generate Contract ByteCode and ABI Found the following ContractName(s) in source code : Address, Context, ERC165, ERC721, ERC721Enumerable, IERC165, IERC721, IERC721Enumerable, IERC721Metadata, IERC721Receiver, NFT, Ownable, Strings But we were unable to locate a matching bytecode (err_code_2). Изначально при развертывании контракт был с ссылками на другие контракты.. а теперь нужна верификация контракта и она не проходит... создав один большой контракт выдает ошибку что описал выше. NFT уже созданы и сминтены...оч жду помощи.
Байткод ерр_код_2 не существует по єтому ничего не работает. Пока что не понимаю как решить сам не минтил.
 

Flowpk

New member
Подскажите пожалуйста , может ли один смартконтракт , включать в себя :
1) Деплоу NFT в смартконтракт
2) Отвечать за покупку продажу на сайте
3) отвечать за белый список
 

Stas

New member
Привет.Сможешь подробнее описать как добавить адреса для минта?(Пожалуйста)
 

Hammer

New member
Если кому еще актуально. Ошибка возникает, если в контракте есть конструктор. Решение ошибки достаточно простое. Когда получаете ошибку, валидатор дает код контракта который подгрузили и который был скомпилирован ранее, например в remix. Копируете код, который показывает валидатор (самый верхний). Открываете в редакторе и в конце контракта копируете часть, которая начинается с большого количества нулей до конца. Повторяете валидацию, а в поле конструктор вставляете скопированную часть контракта.
 

2133vasilii

New member
как сделать смартконтракт в сети BASE на минт НФТ? И чтоб можно было со своего сайта продавать их?
 
Сверху