NFTISMUS-N Contract

Here you can find all information about the NFTISMUS-N ERC721 Token contract.

This NFT Contract will handle all standard ERC-721 transactions. For every new NFT minted, there will be a bonus payout of 10 NFM Tokens.

This contract is deployed on Polygon at the following address:

0x699624845276283e25e68cee31aa17e1463a3e5d

This token contract includes the ERC721-Standard:

  • IERC721TokenReceiver

  • IERC721Errors

  • IERC721Metadata

  • IERC721Enumerable (changed)

  • IERC2981

  • INFMController

  • INFMMint

/**
 *Submitted for verification at polygonscan.com on 2023-08-14
*/

//SPDX-License-Identifier:MIT
pragma solidity ^0.8.0;

interface ERC721TokenReceiver {     
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4);
}
interface IERC721Errors {     
    error ERC721InvalidOwner(address owner);

    error ERC721NonexistentToken(uint256 tokenId);

    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
     
    error ERC721InvalidSender(address sender);
     
    error ERC721InvalidReceiver(address receiver);
     
    error ERC721InsufficientApproval(address operator, uint256 tokenId);
     
    error ERC721InvalidApprover(address approver);
     
    error ERC721InvalidOperator(address operator);
}
interface INFMController {
    function _checkWLSC(address Controller, address Client) external pure returns (bool);
    
    function _getTreasury() external pure returns (address);

    function _getMinting() external pure returns (address);
}
interface INFMMint{
    function _updateBNFTAmount(address minter) external returns (bool);
}
contract ERC165 {
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        _registerInterface(0x01ffc9a7);
    }

    function supportsInterface(bytes4 interfaceId) external virtual view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "Invalid interface ID");
        _supportedInterfaces[interfaceId] = true;
    }
}

contract NFTNContract is ERC165,IERC721Errors,ERC721TokenReceiver {
    string private _name;
    string private _symbol;
    uint256 private _tokenIdCounter;
    uint256 private _locked=0;
    address private _owner;
    address private _SController;
    uint256 private _commision=2;
    uint256 private _mintcomission=0.0007*10**18;
    //Maps
    mapping(uint256 => address) private _owners;
    mapping(address => uint256[]) private _ownedTokens;
    mapping(uint256 => string) private _tokenURIs;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    mapping(uint256 => address) private _royaltiesOwner;
    mapping(uint256 => uint256) private _royalties;
    mapping(uint256 => bool) private _enumeration;
    //Events
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    event Royalties(uint256 indexed tokenId, address indexed recipient, uint256 value);
    event Mint(address indexed to, uint256 indexed tokenId);
    //Interfaces
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
    bytes4 private constant _INTERFACE_ID_ERC721_RECEIVER = 0x150b7a02;
    //Reentrancy
    modifier reentrancyGuard() {
        require(_locked == 0);
        _locked = 1;
        _;
        _locked = 0;
    }
    constructor(string memory nn, string memory sy, address SController ) {
        _name = nn;
        _symbol = sy;
        _owner = msg.sender;
        _SController=SController;
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC2981);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
        _registerInterface(_INTERFACE_ID_ERC721_RECEIVER);
    }
    
    function name() external view returns (string memory) {
        return _name;
    }
    
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    function comission() external view returns (uint256,uint256) {
        require(
            INFMController(address(_SController))._checkWLSC(_SController, msg.sender) == true ||
                _owner == msg.sender,
            "oO"
        );
        return (_commision,_mintcomission);
    }
    function changeComission(uint256 nc,uint256 nmc) external returns (bool) {
        require(
            INFMController(address(_SController))._checkWLSC(_SController, msg.sender) == true ||
                _owner == msg.sender,
            "oO"
        );
        if(_commision!=nc){
            _commision=nc;
        }
        if(_mintcomission!=nmc){
            _mintcomission=nmc;
        }
        return true;
    }
    
    function totalSupply() external view returns (uint256) {
        return _tokenIdCounter;
    }
    
    function balanceOf(address owner) external view returns (uint256) {
        return _ownedTokens[owner].length;
    }
    function returnAllNftsOf(address owner) external view returns (uint256[] memory) {
        return _ownedTokens[owner];
    }
    
    function ownerOf(uint256 tokenId) external view returns (address) {
        require(_exists(tokenId), "Token does not exist");
        return _owners[tokenId];
    }
    
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "Token does not exist");
        return _tokenURIs[tokenId];
    }
    
    function approve(address to, uint256 tokenId) external {
        address owner = this.ownerOf(tokenId);
        require(to != owner, "Cannot approve to current owner");
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender) || msg.sender == _owner, "Not approved");
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }
    
    function getApproved(uint256 tokenId) external view returns (address) {
        require(_exists(tokenId), "Token does not exist");
        return _tokenApprovals[tokenId];
    }
    
    function setApprovalForAll(address operator, bool approved) external {
        require(operator != msg.sender, "Cannot set approval for self");
        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }
    
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    
    function transferFrom(address from, address to, uint256 tokenId) external {
        require(_isApprovedOrOwner(msg.sender, tokenId), "Not approved or owner");
        _transfer(from, to, tokenId);
    }
    
    function safeTransferFrom(address from, address to, uint256 tokenId) external {
        _safeTransferFrom(from, to, tokenId, '');
    }
    
    function _safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(msg.sender, tokenId), "Not approved or owner");
        _transfer(from, to, tokenId);
        _checkOnERC721Received(from, to, tokenId, _data);
    }
    
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _owners[tokenId] != address(0);
    }
    
    function setTokenURI(uint256 tokenId, string memory tokenuRI) internal returns (bool) {
        require(_exists(tokenId), "Token does not exist");
        _tokenURIs[tokenId] = tokenuRI;
        return true;
    }
    
    function setRoyalties(uint256 tokenId, uint256 value) external {
        require(_exists(tokenId), "Token does not exist");
        require(_owners[tokenId]==msg.sender, "Not owner");
        uint256 b =value; 
        //Limit to max 10 Matic
        if(value > 10000000000000000000){
            b=10000000000000000000;
        }
        _royalties[tokenId] = b;
        _royaltiesOwner[tokenId]=_owners[tokenId];
        emit Royalties(tokenId, msg.sender, b);
    }
    function _burn(uint256 tokenId) public reentrancyGuard{
        require(_isApprovedOrOwner(msg.sender, tokenId), "Not approved or owner");
        address previousOwner = this.ownerOf(tokenId);
        _removeTokenFromOwner(previousOwner, tokenId);
        _addTokenToOwner(address(0),tokenId);
        _owners[tokenId] = address(0);
        if (previousOwner == address(0)) {
            revert ERC721NonexistentToken(tokenId);
        }
        emit Transfer(previousOwner, address(0), tokenId);
    }
    function getRoyalties(uint256 tokenId) external view returns (uint256, address) {
        require(_exists(tokenId), "Token does not exist");
        return (_royalties[tokenId],_royaltiesOwner[tokenId]);
    }
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) public view returns (
        address receiver,
        uint256 royaltyAmount
    ){return (_royaltiesOwner[_tokenId],_royalties[_tokenId]);}
    
    function supportsInterface(bytes4 interfaceId) external override  view returns (bool) {
        return
            interfaceId == _INTERFACE_ID_ERC721 ||
            interfaceId == _INTERFACE_ID_ERC721_METADATA ||
            interfaceId == _INTERFACE_ID_ERC2981 ||
            interfaceId == _INTERFACE_ID_ERC721_ENUMERABLE ||
            interfaceId == _INTERFACE_ID_ERC721_RECEIVER ||
            this.supportsInterface(interfaceId);
    }
    
    function _transfer(address from, address to, uint256 tokenId) internal {
        require(this.ownerOf(tokenId) == from, "Not the owner of the token");
        require(to != address(0), "Cannot transfer to zero address");

        _removeTokenFromOwner(from, tokenId);
        _addTokenToOwner(to,tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "Token does not exist");
        address owner = this.ownerOf(tokenId);
        return (spender == owner || this.getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }
    
    // Helper functions for array manipulation
    
    function _addTokenToOwner(address owner, uint256 tokenId) internal {
        _ownedTokens[owner].push(tokenId);
    }
    
    function _removeTokenFromOwner(address owner, uint256 tokenId) internal {
        uint256[] storage ownerTokens = _ownedTokens[owner];
        for (uint256 i = 0; i < ownerTokens.length; i++) {
            if (ownerTokens[i] == tokenId) {
                // Swap with the last element and remove
                ownerTokens[i] = ownerTokens[ownerTokens.length - 1];
                ownerTokens.pop();
                break;
            }
        }
    }    
    function _removeTokenFromApproval(uint256 tokenId) internal {
        if (_tokenApprovals[tokenId] != address(0)) {
            delete _tokenApprovals[tokenId];
        }
    }
    receive() external payable{}
    fallback() external payable{}
    function getNFMformint(uint256 tokenId) public returns (bool){
        require(_exists(tokenId), "Token does not exist");
        require(_owners[tokenId]==msg.sender, "Not owner");
        require(_enumeration[tokenId]==true,"AC");
        if(INFMMint(address( INFMController(address(_SController) )._getMinting() ))._updateBNFTAmount(msg.sender)==true){
            _enumeration[tokenId]=false;
            return true;
        }else{
            revert("Failed");
        }            
    }
    function mint(address to, string memory tokenuRI ) external payable reentrancyGuard {
        require(msg.value >= _mintcomission,"NV");
        require(to != address(0), "Cannot mint to zero address");        
        
        uint256 tokenId = _tokenIdCounter;
        _tokenIdCounter++;
        _owners[tokenId] = to;
        _ownedTokens[to].push(tokenId);
        _enumeration[tokenId]=true;
        setTokenURI(tokenId, tokenuRI);       
        emit Mint(to, tokenId);
        emit Transfer(address(0), to, tokenId);
        payable(address(this)).transfer(_mintcomission);
    }
    function isContract(address _addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) public override  returns(bytes4){
        return _INTERFACE_ID_ERC721_RECEIVER;
    }
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private {
        if (isContract(to)==true) {
            try ERC721TokenReceiver(to).onERC721Received(to, from, tokenId, data) returns (bytes4 retval) {
                if (retval != ERC721TokenReceiver.onERC721Received.selector) {
                    revert ERC721InvalidReceiver(to);
                }
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert ERC721InvalidReceiver(to);
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    }
    
}

Last updated