EthereumEthereum
0x11...74fc
Monster Portal Badge

Monster Portal Badge

MPB

收藏品
大小
500
收藏品
所有者
478
96% 独特的所有者
此合同的源代码已经过验证!
合同元数据
编译器
0.8.0+commit.c7dfd78e
语言
Solidity
合同源代码
文件 1 的 16:Address.sol
合同源代码
文件 2 的 16:Context.sol
合同源代码
文件 3 的 16:ERC165.sol
合同源代码
文件 4 的 16:ERC721.sol
合同源代码
文件 5 的 16:ERC721Enumerable.sol
合同源代码
文件 6 的 16:ERC721Pausable.sol
合同源代码
文件 7 的 16:IERC165.sol
合同源代码
文件 8 的 16:IERC721.sol
合同源代码
文件 9 的 16:IERC721Enumerable.sol
合同源代码
文件 10 的 16:IERC721Metadata.sol
合同源代码
文件 11 的 16:IERC721Receiver.sol
合同源代码
文件 12 的 16:MonsterPortalBadge.sol
// https://cryptomasterclub.com
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Pausable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol";

contract MonsterPortalBadge is ERC721Enumerable, ERC721Pausable, Ownable {
    
    using SafeMath for uint256;
    
    string _baseTokenURI = "ipfs://QmeacGfGj5AVUd7fd1xvMDwCPscfMkmWMmxe6Zet3iS8Q4/";
    
    uint public MAX_BADGE = 500;
    uint public mintLimitPerUser = 1;
    
    bool public canDestroyPortal = false;
    
    mapping(address => uint) public badgeOwnersMintLimit;
    
    event DestroyPortal(
       address from,
       uint256 portalTokenId
    );
    
    constructor() ERC721("Monster Portal Badge", "MPB") {}
    
    function mintBadge() external {
        require(canDestroyPortal == false, "MonsterPortalBadge: Minting badge is over.");
        require(badgeOwnersMintLimit[_msgSender()] < mintLimitPerUser, "MonsterPortalBadge: Badge limit exceeded.");
        require(totalSupply().add(1) <= MAX_BADGE, "MonsterPortalBadge: All badge portals are minted.");
        badgeOwnersMintLimit[_msgSender()] = badgeOwnersMintLimit[_msgSender()].add(1);
        _safeMint(_msgSender(), totalSupply().add(1));
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override(ERC721Enumerable, ERC721Pausable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    function destroyPortal(uint256 tokenPortalId) public {
        require(canDestroyPortal, "MonsterPortalBadge: Destroying portal is not enable yet.");
        require(
            _isApprovedOrOwner(_msgSender(), tokenPortalId),
            "MonsterPortalBadge: caller is not the owner nor approved address."
        );
        _burn(tokenPortalId);
        emit DestroyPortal(_msgSender(), tokenPortalId);
    }
    
    
    //  ====== Admin only functions ======
    function pause() external onlyOwner() {
        _pause();
    }
    
    function unpause() external onlyOwner() {
        _unpause();
    }
    
    function updateCanDestroyPortal(bool isDestroy) external onlyOwner() {
        canDestroyPortal = isDestroy;
    }
    
    function updateMintLimitPerUser(uint256 limitPerUser) external onlyOwner() {
        mintLimitPerUser = limitPerUser;
    }
    
    function updateBadgeSupply(uint256 _badgeSupply) external onlyOwner() {
        MAX_BADGE = _badgeSupply;
    }
    
    function updateBaseURI(string memory newURI) external onlyOwner() {
        _baseTokenURI = newURI;
    }
    
}
合同源代码
文件 13 的 16:Ownable.sol
合同源代码
文件 14 的 16:Pausable.sol
合同源代码
文件 15 的 16:SafeMath.sol
合同源代码
文件 16 的 16:Strings.sol
设置
{
  "compilationTarget": {
    "portal/MonsterPortalBadge.sol": "MonsterPortalBadge"
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "remappings": []
}
ABI
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"portalTokenId","type":"uint256"}],"name":"DestroyPortal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_BADGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"badgeOwnersMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canDestroyPortal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenPortalId","type":"uint256"}],"name":"destroyPortal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBadge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_badgeSupply","type":"uint256"}],"name":"updateBadgeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isDestroy","type":"bool"}],"name":"updateCanDestroyPortal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limitPerUser","type":"uint256"}],"name":"updateMintLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"}]