MATIC Price: $0.99 (+1.66%)
Gas: 50 Gwei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Value
Mint Existing Si...535572332024-02-15 16:45:0710 days 18 hrs ago1708015507IN
0xd8dc97...06B96DE1
0 MATIC0.01232422124.50348935
Mint Existing Si...535570972024-02-15 16:40:1010 days 19 hrs ago1708015210IN
0xd8dc97...06B96DE1
0 MATIC0.01008972101.92982885
Mint Existing Si...534342472024-02-12 13:55:2313 days 21 hrs ago1707746123IN
0xd8dc97...06B96DE1
0 MATIC0.01302103131.54286162
Mint Existing Si...534340992024-02-12 13:50:0913 days 21 hrs ago1707745809IN
0xd8dc97...06B96DE1
0 MATIC0.02337716236.16395087
Mint Existing Si...533596802024-02-10 17:25:1115 days 18 hrs ago1707585911IN
0xd8dc97...06B96DE1
0 MATIC0.0033065233.40358518
Mint Existing Si...531155072024-02-04 13:35:1621 days 22 hrs ago1707053716IN
0xd8dc97...06B96DE1
0 MATIC0.01912351193.19216533
Mint Existing Si...529592522024-01-31 11:05:1226 days 36 mins ago1706699112IN
0xd8dc97...06B96DE1
0 MATIC0.01508257152.36927165
Mint Existing Si...529591112024-01-31 11:00:1226 days 41 mins ago1706698812IN
0xd8dc97...06B96DE1
0 MATIC0.03415053345.00019913
Update Token Cla...522017742024-01-11 14:51:5445 days 20 hrs ago1704984714IN
0xd8dc97...06B96DE1
0 MATIC0.00842438281
Update Token URI522017742024-01-11 14:51:5445 days 20 hrs ago1704984714IN
0xd8dc97...06B96DE1
0 MATIC0.01201724281
Update Token Cla...521881052024-01-11 6:20:4646 days 5 hrs ago1704954046IN
0xd8dc97...06B96DE1
0 MATIC0.0009293831
Update Token URI521881012024-01-11 6:20:3846 days 5 hrs ago1704954038IN
0xd8dc97...06B96DE1
0 MATIC0.0013257431
Update Token Cla...521826122024-01-11 2:51:2646 days 8 hrs ago1704941486IN
0xd8dc97...06B96DE1
0 MATIC0.0011751642
Update Token Cla...521825712024-01-11 2:49:5846 days 8 hrs ago1704941398IN
0xd8dc97...06B96DE1
0 MATIC0.0020954642
Update Token URI521824552024-01-11 2:45:1646 days 8 hrs ago1704941116IN
0xd8dc97...06B96DE1
0 MATIC0.0019593343
Mint Existing Si...521368702024-01-09 22:00:0847 days 13 hrs ago1704837608IN
0xd8dc97...06B96DE1
0 MATIC0.01490843150.61007498
Mint Existing Si...521366032024-01-09 21:50:0847 days 13 hrs ago1704837008IN
0xd8dc97...06B96DE1
0 MATIC0.02790142281.86960792
Update Token Cla...520291052024-01-07 2:32:5050 days 9 hrs ago1704594770IN
0xd8dc97...06B96DE1
0 MATIC0.0009593632
Update Token URI520290702024-01-07 2:31:3450 days 9 hrs ago1704594694IN
0xd8dc97...06B96DE1
0 MATIC0.0015044733
Initialise New S...517999362024-01-01 2:30:4556 days 9 hrs ago1704076245IN
0xd8dc97...06B96DE1
0 MATIC0.0176873771.81348903
Mint Existing Si...517836042023-12-31 15:30:1856 days 20 hrs ago1704036618IN
0xd8dc97...06B96DE1
0 MATIC0.01951701197.16749458
Mint Existing Si...517834612023-12-31 15:25:1456 days 20 hrs ago1704036314IN
0xd8dc97...06B96DE1
0 MATIC0.01884544190.38298638
Mint Existing Si...508605392023-12-07 18:55:0980 days 16 hrs ago1701975309IN
0xd8dc97...06B96DE1
0 MATIC0.02331871235.57348517
Mint Existing Si...506444142023-12-02 7:45:1086 days 3 hrs ago1701503110IN
0xd8dc97...06B96DE1
0 MATIC0.0033833834.18007381
Set Approval For...505767982023-11-30 15:01:5187 days 20 hrs ago1701356511IN
0xd8dc97...06B96DE1
0 MATIC0.02222739481.46676937
View all transactions

Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x2aA20F...92bDF260
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
ArtzoneCreator

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 3000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 19 : ArtzoneCreator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "../ERC1155/ERC1155CreatorBase.sol";
import "./IArtzoneCreator.sol";
import "../Helpers/Permissions/PermissionControl.sol";

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract ArtzoneCreator is
  ReentrancyGuard,
  ERC1155CreatorBase,
  IArtzoneCreator,
  PermissionControl
{
  uint64 public constant MAX_BPS = 10_000;
  uint256 public ARTZONE_MINTER_FEE_BPS;

  mapping(uint256 => address) internal _tokenRevenueRecipient;
  mapping(uint256 => mapping(address => uint256)) internal _userTokenClaimCount;

  constructor(
    string memory name_,
    string memory symbol_,
    uint256 feeBps_
  ) ERC1155CreatorBase(name_, symbol_) {
    ARTZONE_MINTER_FEE_BPS = feeBps_;
  }

  modifier checkTokenClaimable(uint256 tokenId, address user) {
    TokenClaimType claimStatus = _tokenMetadata[tokenId].claimStatus;
    if (isPermissionedUser(user)) {
      require(
        claimStatus == TokenClaimType.PUBLIC || claimStatus == TokenClaimType.ADMIN,
        "Token mint disabled"
      );
    } else {
      require(claimStatus == TokenClaimType.PUBLIC, "Token public mint disabled");
    }
    _;
  }

  /**
   * @dev See {IArtzoneCreator-initialiseNewSingleToken}.
   */
  function initialiseNewSingleToken(
    TokenMetadataConfig calldata tokenConfig,
    address revenueRecipient
  ) external onlyPermissionedUser returns (uint256 tokenId) {
    tokenId = _initialiseToken(tokenConfig, revenueRecipient);
  }

  /**
   * @dev See {IArtzoneCreator-initialiseNewMultipleToken}.
   */
  function initialiseNewMultipleTokens(
    TokenMetadataConfig[] calldata tokenConfigs,
    address[] calldata revenueRecipients
  ) external onlyPermissionedUser returns (uint256[] memory tokenIds) {
    uint256 length = tokenConfigs.length;
    tokenIds = new uint256[](length);

    for (uint256 i = 0; i < length; ) {
      uint256 tokenId = _initialiseToken(tokenConfigs[i], revenueRecipients[i]);
      tokenIds[i] = tokenId;
      unchecked {
        i++;
      }
    }
  }

  /**
   * @dev Internal function to initialise a token via all the parameters of `TokenMetadataConfig` specified alongside with the `revenueRecipient` for mint fee collection.
   */
  function _initialiseToken(TokenMetadataConfig calldata tokenConfig, address revenueRecipient)
    internal
    returns (uint256 tokenId)
  {
    require(tokenConfig.totalSupply == 0, "Initial total supply should be 0");
    require(tokenConfig.maxSupply > 0, "Invalid amount");
    require(tokenConfig.maxClaimPerUser > 0, "Invalid max claim quantity");
    require(
      tokenConfig.maxClaimPerUser <= tokenConfig.maxSupply,
      "Invalid individual claim quantity"
    );

    tokenId = ++_tokenCount;

    _tokenMetadata[tokenId] = tokenConfig;
    _tokenRevenueRecipient[tokenId] = revenueRecipient;

    emit TokenInitialised(
      tokenId,
      tokenConfig.maxSupply,
      tokenConfig.price,
      tokenConfig.maxClaimPerUser,
      tokenConfig.uri,
      revenueRecipient
    );
  }

  /**
   * @dev See {IArtzoneCreator-mintExistingSingleToken}.
   */
  function mintExistingSingleToken(
    address receiver,
    uint256 tokenId,
    uint256 amount
  ) external payable {
    require(amount > 0, "Invalid amount");
    if (!isPermissionedUser(msg.sender) && _tokenMetadata[tokenId].price > 0) {
      uint256 totalPayableAmount = _tokenMetadata[tokenId].price * amount;
      require(msg.value == totalPayableAmount, "Unmatched value sent");
      _processMintFees(tokenId, totalPayableAmount);
    }
    _mintExistingToken(tokenId, receiver, amount);
  }

  /**
   * @dev See {IArtzoneCreator-mintExistingMultipleToken}.
   */
  function mintExistingMultipleTokens(
    address[] calldata receivers,
    uint256[] calldata tokenIds,
    uint256[] calldata amounts
  ) external payable {
    require(
      receivers.length == tokenIds.length && tokenIds.length == amounts.length,
      "Invalid inputs"
    );
    uint256 length = receivers.length;

    if (!isPermissionedUser(msg.sender)) {
      uint256 totalPayableAmount;
      uint256[] memory payableAmounts = new uint256[](length);
      for (uint256 i = 0; i < length; ) {
        uint256 payableAmount = _tokenMetadata[tokenIds[i]].price * amounts[i];
        totalPayableAmount += payableAmount;
        payableAmounts[i] = payableAmount;
        unchecked {
          i++;
        }
      }
      require(msg.value == totalPayableAmount, "Unmatched value sent");
      _batchProcessMintFees(tokenIds, payableAmounts);
    }

    for (uint256 i = 0; i < length; ) {
      require(amounts[i] > 0, "Invalid amount");
      _mintExistingToken(tokenIds[i], receivers[i], amounts[i]);
      unchecked {
        i++;
      }
    }
  }

  /**
   * @dev Internal function to process minting of a valid `tokenId` with the specified `amount` and `receiver`.
   */
  function _mintExistingToken(
    uint256 tokenId,
    address receiver,
    uint256 amount
  ) internal nonReentrant checkTokenClaimable(tokenId, msg.sender) {
    require(tokenId <= _tokenCount, "Invalid tokenId specified");
    require(
      _tokenMetadata[tokenId].totalSupply + amount <= _tokenMetadata[tokenId].maxSupply,
      "Invalid amount specified"
    );
    require(
      _userTokenClaimCount[tokenId][receiver] + amount <= _tokenMetadata[tokenId].maxClaimPerUser,
      "Exceed token max claim limit"
    );

    _tokenMetadata[tokenId].totalSupply += amount;
    _userTokenClaimCount[tokenId][receiver] += amount;
    _mint(receiver, tokenId, amount, "");

    emit TokenMint(tokenId, amount, receiver, msg.sender, _tokenMetadata[tokenId].price * amount);
  }

  /**
   * @dev Internal function to handle multiple processing of mint fees when `mintExistingMultipleTokens` is called via a non-permissioned user.
   */
  function _batchProcessMintFees(uint256[] calldata tokenIds, uint256[] memory payableAmounts)
    internal
  {
    for (uint256 i = 0; i < tokenIds.length; ) {
      if (payableAmounts[i] > 0) {
        _processMintFees(tokenIds[i], payableAmounts[i]);
      }
      unchecked {
        i++;
      }
    }
  }

  /**
   * @dev Internal function to process mint fees and transfer outstanding payable revenue to `revenueRecipient` after deducting from Artzone's fee cut portion.
   */
  function _processMintFees(uint256 tokenId, uint256 totalPayableAmount) internal nonReentrant {
    uint256 artzoneFee = (totalPayableAmount * ARTZONE_MINTER_FEE_BPS) / MAX_BPS;
    payable(_tokenRevenueRecipient[tokenId]).transfer(totalPayableAmount - artzoneFee);
  }

  /**
   * @dev Set token uri after a token is minted by permissioned user.
   */
  function updateTokenURI(uint256 tokenId, string calldata uri)
    external
    override(ERC1155CreatorBase, IERC1155CreatorBase)
    onlyPermissionedUser
  {
    _setTokenURI(tokenId, uri);
  }

  /**
   * @dev Set token uri after a token is minted by permissioned user.
   */
  function updateTokenClaimStatus(uint256 tokenId, TokenClaimType claimStatus)
    external
    override(ERC1155CreatorBase, IERC1155CreatorBase)
    onlyPermissionedUser
  {
    _setTokenClaimStatus(tokenId, claimStatus);
  }

  /**
   * @dev Set secondary royalties for a particular tokenId by permissioned user.
   */
  function setRoyalties(
    uint256 tokenId,
    address payable[] calldata receivers,
    uint256[] calldata basisPoints
  ) external override(ERC1155CreatorBase, IERC1155CreatorBase) onlyPermissionedUser {
    _setRoyalties(tokenId, receivers, basisPoints);
  }

  /**
   * @dev See {IArtzoneCreator-updateTokenRevenueRecipient}.
   */
  function updateTokenRevenueRecipient(uint256 tokenId, address newRecipient)
    external
    isExistingToken(tokenId)
    onlyPermissionedUser
  {
    require(newRecipient != address(0), "Null address");
    _tokenRevenueRecipient[tokenId] = newRecipient;

    emit TokenRevenueRecipientUpdate(tokenId, newRecipient);
  }

  /**
   * @dev See {IArtzoneCreator-updateArtzoneFeeBps}.
   */
  function updateArtzoneFeeBps(uint256 bps) external onlyPermissionedUser {
    require(bps < MAX_BPS, "Invalid basis points");
    ARTZONE_MINTER_FEE_BPS = bps;
  }

   /**
   * @dev See {IArtzoneCreator-updateArtzoneFeeBps}.
   */
   function tokenAmountClaimedByUser(uint256 tokenId, address recipient) external view returns (uint256) {
      return _userTokenClaimCount[tokenId][recipient];
   }

  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC1155CreatorBase, PermissionControl, IERC165)
    returns (bool)
  {
    return super.supportsInterface(interfaceId) ||
      ERC1155CreatorBase.supportsInterface(interfaceId) ||
      PermissionControl.supportsInterface(interfaceId);
  }

  /**
   * @dev See {IArtzoneCreator-withdraw}.
   */
  function withdraw(address recipient) external payable onlyOwner {
    payable(recipient).transfer(address(this).balance);
  }

  /// @dev Lets the contract receives native tokens from `nativeTokenWrapper` withdraw.
  receive() external payable {}
}

File 2 of 19 : ERC1155CreatorBase.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";

import "./ERC1155Core.sol";
import "./IERC1155CreatorBase.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
abstract contract ERC1155CreatorBase is ERC1155Core, IERC1155CreatorBase, ReentrancyGuard {
  using Strings for uint256;

  uint256 internal _tokenCount = 0;

  mapping(uint256 => TokenMetadataConfig) internal _tokenMetadata;
  // mapping(uint256 => uint256) internal _tokenSupply;
  // // Mapping for individual token URIs
  // mapping(uint256 => string) internal _tokenURIs;
  // mapping(uint256 => RoyaltyConfig[]) internal _tokenRoyalty;

  bytes4 private constant ERC1155_CREATORBASE_V1 = 0x28f10a21;

  /**
   * External interface identifiers for royalties
   */

  /**
   *  @dev CreatorCore
   *
   *  bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6
   *
   *  => 0xbb3bafd6 = 0xbb3bafd6
   */
  bytes4 private constant INTERFACE_ID_ROYALTIES_CREATORBASE = 0xbb3bafd6;

  /**
   *  @dev Rarible: RoyaltiesV1
   *
   *  bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
   *  bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
   *
   *  => 0xb9c4d9fb ^ 0x0ebd4c7f = 0xb7799584
   */
  bytes4 private constant INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;

  /**
   *  @dev Foundation
   *
   *  bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c
   *
   *  => 0xd5a06d4c = 0xd5a06d4c
   */
  bytes4 private constant INTERFACE_ID_ROYALTIES_FOUNDATION = 0xd5a06d4c;

  /**
   *  @dev EIP-2981
   *
   * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
   *
   * => 0x2a55205a = 0x2a55205a
   */
  bytes4 private constant INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;

  modifier isExistingToken(uint256 tokenId) {
    require(tokenId > 0 && tokenId <= _tokenCount, "Invalid token");
    _;
  }

  /**
   * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
   */
  constructor(string memory name_, string memory symbol_) {
    _name = name_;
    _symbol = symbol_;
  }

  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC1155Core, IERC165)
    returns (bool)
  {
    return
      interfaceId == type(IERC1155CreatorBase).interfaceId ||
      interfaceId == ERC1155_CREATORBASE_V1 ||
      super.supportsInterface(interfaceId) ||
      interfaceId == INTERFACE_ID_ROYALTIES_CREATORBASE ||
      interfaceId == INTERFACE_ID_ROYALTIES_RARIBLE ||
      interfaceId == INTERFACE_ID_ROYALTIES_FOUNDATION ||
      interfaceId == INTERFACE_ID_ROYALTIES_EIP2981;
  }

  /**
   * @dev See {IERC1155CreatorBase-updateTokenURI}.
   */
  function updateTokenURI(uint256 tokenId, string calldata uri) external virtual {
    _setTokenURI(tokenId, uri);
  }

  /**
   * @dev See {IERC1155CreatorBase-updateTokenClaimStatus}.
   */
  function updateTokenClaimStatus(uint256 tokenId, TokenClaimType claimStatus) external virtual {
    _setTokenClaimStatus(tokenId, claimStatus);
  }

  /**
   * @dev See {IERC1155CreatorBase-updateTokenURI}.
   */
  function setRoyalties(
    uint256 tokenId,
    address payable[] calldata receivers,
    uint256[] calldata basisPoints
  ) external virtual {
    _setRoyalties(tokenId, receivers, basisPoints);
  }

  /**
   * @dev Set token uri for an existing tokenId.
   */
  function _setTokenURI(uint256 tokenId, string calldata uri)
    internal
    virtual
    isExistingToken(tokenId)
  {
    _tokenMetadata[tokenId].uri = uri;
  }

  /**
   * @dev Set new public mint price for an existing tokenId.
   */
  function _setTokenMintPrice(uint256 tokenId, uint256 newPrice)
    internal
    virtual
    isExistingToken(tokenId)
  {
    _tokenMetadata[tokenId].price = newPrice;
  }

  /**
   * @dev Set claim status for an existing tokenId.
   */
  function _setTokenClaimStatus(uint256 tokenId, TokenClaimType claimStatus)
    internal
    virtual
    isExistingToken(tokenId)
  {
    _tokenMetadata[tokenId].claimStatus = claimStatus;

    emit TokenClaimStatusUpdate(tokenId, claimStatus);
  }

  /**
   * @dev See {IERC1155MetadataURI-uri}.
   */
  function uri(uint256 id) external view returns (string memory tokenURI) {
    tokenURI = _tokenURI(id);
  }

  /**
   * @dev See {IERC1155CreatorBase-totalSupply}.
   */
  function totalSupply(uint256 tokenId)
    external
    view
    isExistingToken(tokenId)
    returns (uint256 totalSupply)
  {
    totalSupply = _tokenMetadata[tokenId].totalSupply;
  }

  /**
   * @dev See {IERC1155CreatorBase-maxSupply}.
   */
  function maxSupply(uint256 tokenId)
    external
    view
    isExistingToken(tokenId)
    returns (uint256 maxSupply)
  {
    maxSupply = _tokenMetadata[tokenId].maxSupply;
  }

  /**
   * @dev See {IERC1155CreatorBase-publicMintPrice}.
   */
  function publicMintPrice(uint256 tokenId)
    external
    view
    isExistingToken(tokenId)
    returns (uint256 mintPrice)
  {
    mintPrice = _tokenMetadata[tokenId].price;
  }

  /**
   * @dev See {IERC1155CreatorBase-publicMintPrice}.
   */
  function updateTokenMintPrice(uint256 tokenId, uint256 newPrice) external {
    _tokenMetadata[tokenId].price = newPrice;
  }

  /**
   * @dev See {IERC1155CreatorBase-tokenMetadata}.
   */
  function tokenMetadata(uint256 tokenId)
    external
    view
    isExistingToken(tokenId)
    returns (
      uint256 totalSupply,
      uint256 maxSupply,
      uint256 mintPrice,
      uint256 maxClaimPerUser,
      string memory uri,
      TokenClaimType claimStatus
    )
  {
    TokenMetadataConfig memory tokenMetadata = _tokenMetadata[tokenId];
    totalSupply = tokenMetadata.totalSupply;
    maxSupply = tokenMetadata.maxSupply;
    mintPrice = tokenMetadata.price;
    maxClaimPerUser = tokenMetadata.maxClaimPerUser;
    uri = tokenMetadata.uri;
    claimStatus = tokenMetadata.claimStatus;
  }

  /**
   * @dev Retrieve an existing token's URI
   */
  function _tokenURI(uint256 tokenId)
    internal
    view
    isExistingToken(tokenId)
    returns (string memory uri)
  {
    uri = _tokenMetadata[tokenId].uri;
  }

  /**
   * @dev See {ICreatorCore-getRoyalties}.
   */
  function getRoyalties(uint256 tokenId)
    external
    view
    virtual
    override
    returns (address payable[] memory, uint256[] memory)
  {
    return _getRoyalties(tokenId);
  }

  /**
   * @dev See {ICreatorCore-getFees}.
   */
  function getFees(uint256 tokenId)
    external
    view
    virtual
    override
    returns (address payable[] memory, uint256[] memory)
  {
    return _getRoyalties(tokenId);
  }

  /**
   * @dev See {ICreatorCore-getFeeRecipients}.
   */
  function getFeeRecipients(uint256 tokenId)
    external
    view
    virtual
    override
    returns (address payable[] memory)
  {
    return _getRoyaltyReceivers(tokenId);
  }

  /**
   * @dev See {ICreatorCore-getFeeBps}.
   */
  function getFeeBps(uint256 tokenId) external view virtual override returns (uint256[] memory) {
    return _getRoyaltyBPS(tokenId);
  }

  /**
   * @dev See {ICreatorCore-royaltyInfo}.
   */
  function royaltyInfo(uint256 tokenId, uint256 value)
    external
    view
    virtual
    override
    returns (address, uint256)
  {
    return _getRoyaltyInfo(tokenId, value);
  }

  /**
   * Helper to get royalties for a token
   */
  function _getRoyalties(uint256 tokenId)
    internal
    view
    isExistingToken(tokenId)
    returns (address payable[] memory receivers, uint256[] memory bps)
  {
    RoyaltyConfig[] memory royalties = _tokenMetadata[tokenId].royalties;

    if (royalties.length == 0) {
      receivers = new address payable[](1);
      receivers[0] = payable(address(0));
      bps = new uint256[](1);
      bps[0] = 0;
    }

    if (royalties.length > 0) {
      receivers = new address payable[](royalties.length);
      bps = new uint256[](royalties.length);
      for (uint256 i; i < royalties.length; ) {
        receivers[i] = royalties[i].receiver;
        bps[i] = royalties[i].bps;
        unchecked {
          ++i;
        }
      }
    }
  }

  /**
   * Helper to get royalty receivers for a token
   */
  function _getRoyaltyReceivers(uint256 tokenId)
    internal
    view
    returns (address payable[] memory recievers)
  {
    (recievers, ) = _getRoyalties(tokenId);
  }

  /**
   * Helper to get royalty basis points for a token
   */
  function _getRoyaltyBPS(uint256 tokenId) internal view returns (uint256[] memory bps) {
    (, bps) = _getRoyalties(tokenId);
  }

  function _getRoyaltyInfo(uint256 tokenId, uint256 value)
    internal
    view
    returns (address receiver, uint256 amount)
  {
    (address payable[] memory receivers, uint256[] memory bps) = _getRoyalties(tokenId);
    require(receivers.length <= 1, "More than 1 royalty receiver");

    if (receivers.length == 0) {
      return (address(this), 0);
    }
    return (receivers[0], (bps[0] * value) / 10000);
  }

  /**
   * Set royalties for a token
   */
  function _setRoyalties(
    uint256 tokenId,
    address payable[] calldata receivers,
    uint256[] calldata basisPoints
  ) internal {
    _checkRoyalties(receivers, basisPoints);
    delete _tokenMetadata[tokenId].royalties;
    _setRoyalties(receivers, basisPoints, _tokenMetadata[tokenId].royalties);
    emit RoyaltiesUpdated(tokenId, receivers, basisPoints);
  }

  /**
   * Helper function to set royalties
   */
  function _setRoyalties(
    address payable[] calldata receivers,
    uint256[] calldata basisPoints,
    RoyaltyConfig[] storage royalties
  ) private {
    for (uint256 i; i < basisPoints.length; ) {
      royalties.push(RoyaltyConfig({receiver: receivers[i], bps: uint16(basisPoints[i])}));
      unchecked {
        ++i;
      }
    }
  }

  /**
   * Helper function to check that royalties provided are valid
   */
  function _checkRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints)
    private
    pure
  {
    require(receivers.length == basisPoints.length, "Invalid receivers & bps input");

    uint256 totalBasisPoints;
    for (uint256 i; i < basisPoints.length; ) {
      totalBasisPoints += basisPoints[i];
      unchecked {
        ++i;
      }
    }
    require(totalBasisPoints < 10000, "Invalid total royalties");
  }
}

File 3 of 19 : IArtzoneCreator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "../ERC1155/IERC1155CreatorBase.sol";

interface IArtzoneCreator is IERC1155CreatorBase {
  /**
   * @dev Event when a Token parameters are initialised.
   */
  event TokenInitialised(
    uint256 indexed tokenId,
    uint256 maxSupply,
    uint256 price,
    uint256 maxClaimPerUser,
    string tokenUri,
    address revenueRecipient
  );

  /**
   * @dev Event when an Initialised Token has been minted.
   */
  event TokenMint(
    uint256 indexed tokenId,
    uint256 amount,
    address receiver,
    address minter,
    uint256 value
  );

  /**
   * @dev Event when a revenue recipient of an initialised token has been updated.
   */
  event TokenRevenueRecipientUpdate(uint256 indexed tokenId, address revenueRecipient);


  /**
   * @dev Set the parameters for a tokenId - tokenUri and maximum amount to be minted. Returns tokenId assigned. Can only be called by Admin.
   */
  function initialiseNewSingleToken(
    TokenMetadataConfig calldata tokenConfig,
    address revenueRecipient
  ) external returns (uint256);

  /**
   * @dev Set the parameters for multiple tokenIds - tokenUri and maximum amount to be minted.  Can only be called by owner/admin. Returns array of tokenIds assigned.
   */
  function initialiseNewMultipleTokens(
    TokenMetadataConfig[] calldata tokenConfigs,
    address[] calldata revenueRecipients
  ) external returns (uint256[] memory);

  /**
   * @dev Mints existing single token.  Can be called by any user. Returns tokenId assigned.
   */
  function mintExistingSingleToken(
    address receiver,
    uint256 tokenId,
    uint256 amount
  ) external payable;

  /**
   * @dev Mints multiple tokens.  Can be called by any user. Returns tokenId assigned.
   */
  function mintExistingMultipleTokens(
    address[] calldata receivers,
    uint256[] calldata tokenIds,
    uint256[] calldata amounts
  ) external payable;

  /**
   * @dev Returns the total quantity claimed by a user for a token.
   */
  function tokenAmountClaimedByUser(uint256 tokenId, address recipient) external view returns(uint256);

  /**
   * @dev Update revenue recipient for an initialised token. Can only be called by Admin.
   */
  function updateTokenRevenueRecipient(uint256 tokenId, address newRecipient) external;

  /**
   * @dev Update Artzone Minter fee basis points for NFT minting sale. Can only be called by Admin.
   */
  function updateArtzoneFeeBps(uint256 bps) external;

  /**
   * @dev Withdraw function to withdraw fees collected from each paid NFT mint by public users to a specified recipient. To only be called by Admin.
   */
  function withdraw(address recipient) external payable;
}

File 4 of 19 : PermissionControl.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "../BoringOwnable.sol";
import "./IPermissionControl.sol";

abstract contract PermissionControl is IPermissionControl, BoringOwnable, ERC165 {
  using EnumerableSet for EnumerableSet.AddressSet;

  EnumerableSet.AddressSet private _permissionedUsers;

  /**
   * @dev Only allows approved admins or owner to call the specified function
   */
  modifier onlyPermissionedUser() {
    require(
      owner == msg.sender || _permissionedUsers.contains(msg.sender),
      "PermissionControl: Only owner or existing admin allowed."
    );
    _;
  }

  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165, IERC165)
    returns (bool)
  {
    return
      interfaceId == type(IPermissionControl).interfaceId || super.supportsInterface(interfaceId);
  }

  /**
   * @dev See {IAdminControl-getAdmins}.
   */
  function getAllPermissionedUsers()
    external
    view
    override
    returns (address[] memory permissionedUsers)
  {
    permissionedUsers = new address[](_permissionedUsers.length());
    for (uint256 i = 0; i < _permissionedUsers.length(); i++) {
      permissionedUsers[i] = _permissionedUsers.at(i);
    }
  }

  /**
   * @dev See {IPernissionControl-grantPermissionToUser}.
   */
  function grantPermissionToUser(address newAdmin) external override onlyOwner {
    if (!_permissionedUsers.contains(newAdmin)) {
      emit PermissionGranted(newAdmin, msg.sender);
      _permissionedUsers.add(newAdmin);
    }
  }

  /**
   * @dev See {IPernissionControl-revokePermission}.
   */
  function revokePermission(address newAdmin) external override onlyOwner {
    if (_permissionedUsers.contains(newAdmin)) {
      emit PermissionRevoked(newAdmin, msg.sender);
      _permissionedUsers.remove(newAdmin);
    }
  }

  /**
   * @dev See {IAdminControl-isAdmin}.
   */
  function isPermissionedUser(address user) public view override returns (bool) {
    return (owner == user || _permissionedUsers.contains(user));
  }
}

File 5 of 19 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 6 of 19 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 7 of 19 : ERC165Checker.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165Checker.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Library used to query support of an interface declared via {IERC165}.
 *
 * Note that these functions return the actual result of the query: they do not
 * `revert` if an interface is not supported. It is up to the caller to decide
 * what to do in these cases.
 */
library ERC165Checker {
    // As per the EIP-165 spec, no interface should ever match 0xffffffff
    bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff;

    /**
     * @dev Returns true if `account` supports the {IERC165} interface,
     */
    function supportsERC165(address account) internal view returns (bool) {
        // Any contract that implements ERC165 must explicitly indicate support of
        // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid
        return
            _supportsERC165Interface(account, type(IERC165).interfaceId) &&
            !_supportsERC165Interface(account, _INTERFACE_ID_INVALID);
    }

    /**
     * @dev Returns true if `account` supports the interface defined by
     * `interfaceId`. Support for {IERC165} itself is queried automatically.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) {
        // query support of both ERC165 as per the spec and support of _interfaceId
        return supportsERC165(account) && _supportsERC165Interface(account, interfaceId);
    }

    /**
     * @dev Returns a boolean array where each value corresponds to the
     * interfaces passed in and whether they're supported or not. This allows
     * you to batch check interfaces for a contract where your expectation
     * is that some interfaces may not be supported.
     *
     * See {IERC165-supportsInterface}.
     *
     * _Available since v3.4._
     */
    function getSupportedInterfaces(address account, bytes4[] memory interfaceIds)
        internal
        view
        returns (bool[] memory)
    {
        // an array of booleans corresponding to interfaceIds and whether they're supported or not
        bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length);

        // query support of ERC165 itself
        if (supportsERC165(account)) {
            // query support of each interface in interfaceIds
            for (uint256 i = 0; i < interfaceIds.length; i++) {
                interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]);
            }
        }

        return interfaceIdsSupported;
    }

    /**
     * @dev Returns true if `account` supports all the interfaces defined in
     * `interfaceIds`. Support for {IERC165} itself is queried automatically.
     *
     * Batch-querying can lead to gas savings by skipping repeated checks for
     * {IERC165} support.
     *
     * See {IERC165-supportsInterface}.
     */
    function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) {
        // query support of ERC165 itself
        if (!supportsERC165(account)) {
            return false;
        }

        // query support of each interface in _interfaceIds
        for (uint256 i = 0; i < interfaceIds.length; i++) {
            if (!_supportsERC165Interface(account, interfaceIds[i])) {
                return false;
            }
        }

        // all interfaces supported
        return true;
    }

    /**
     * @notice Query if a contract implements an interface, does not check ERC165 support
     * @param account The address of the contract to query for support of an interface
     * @param interfaceId The interface identifier, as specified in ERC-165
     * @return true if the contract at account indicates support of the interface with
     * identifier interfaceId, false otherwise
     * @dev Assumes that account contains a contract that supports ERC165, otherwise
     * the behavior of this method is undefined. This precondition can be checked
     * with {supportsERC165}.
     * Interface identification is specified in ERC-165.
     */
    function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) {
        bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId);
        (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams);
        if (result.length < 32) return false;
        return success && abi.decode(result, (bool));
    }
}

File 8 of 19 : EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

File 9 of 19 : ERC1155Core.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.11;

import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import "@openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Core is ERC165, IERC1155, IERC1155MetadataURI {
  using Address for address;

  // Token name
  string internal _name;

  // Token symbol
  string internal _symbol;

  // Mapping from token ID to account balances
  mapping(uint256 => mapping(address => uint256)) private _balances;

  // Mapping from account to operator approvals
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(ERC165, IERC165)
    returns (bool)
  {
    return
      interfaceId == type(IERC1155).interfaceId ||
      interfaceId == type(IERC1155MetadataURI).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  /**
   * @dev See {IERC1155-balanceOf}.
   *
   * Requirements:
   *
   * - `account` cannot be the zero address.
   */
  function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
    require(account != address(0), "ERC1155: address zero is not a valid owner");
    return _balances[id][account];
  }

  /**
   * @dev See {IERC1155-balanceOfBatch}.
   *
   * Requirements:
   *
   * - `accounts` and `ids` must have the same length.
   */
  function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
    public
    view
    virtual
    override
    returns (uint256[] memory)
  {
    require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

    uint256[] memory batchBalances = new uint256[](accounts.length);

    for (uint256 i = 0; i < accounts.length; ++i) {
      batchBalances[i] = balanceOf(accounts[i], ids[i]);
    }

    return batchBalances;
  }

  function name() public view virtual returns (string memory) {
    return _name;
  }

  function symbol() public view virtual returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC1155-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public virtual override {
    _setApprovalForAll(msg.sender, operator, approved);
  }

  /**
   * @dev See {IERC1155-isApprovedForAll}.
   */
  function isApprovedForAll(address account, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[account][operator];
  }

  /**
   * @dev See {IERC1155-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) public virtual override {
    require(
      from == msg.sender || isApprovedForAll(from, msg.sender),
      "ERC1155: caller is not token owner or approved"
    );
    _safeTransferFrom(from, to, id, amount, data);
  }

  /**
   * @dev See {IERC1155-safeBatchTransferFrom}.
   */
  function safeBatchTransferFrom(
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) public virtual override {
    require(
      from == msg.sender || isApprovedForAll(from, msg.sender),
      "ERC1155: caller is not token owner or approved"
    );
    _safeBatchTransferFrom(from, to, ids, amounts, data);
  }

  /**
   * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
   *
   * Emits a {TransferSingle} event.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `from` must have a balance of tokens of type `id` of at least `amount`.
   * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
   * acceptance magic value.
   */
  function _safeTransferFrom(
    address from,
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) internal virtual {
    require(to != address(0), "ERC1155: transfer to the zero address");

    address operator = msg.sender;
    uint256[] memory ids = _asSingletonArray(id);
    uint256[] memory amounts = _asSingletonArray(amount);

    _beforeTokenTransfer(operator, from, to, ids, amounts, data);

    uint256 fromBalance = _balances[id][from];
    require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
    unchecked {
      _balances[id][from] = fromBalance - amount;
    }
    _balances[id][to] += amount;

    emit TransferSingle(operator, from, to, id, amount);

    _afterTokenTransfer(operator, from, to, ids, amounts, data);

    _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
  }

  /**
   * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
   *
   * Emits a {TransferBatch} event.
   *
   * Requirements:
   *
   * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
   * acceptance magic value.
   */
  function _safeBatchTransferFrom(
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) internal virtual {
    require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
    require(to != address(0), "ERC1155: transfer to the zero address");

    address operator = msg.sender;

    _beforeTokenTransfer(operator, from, to, ids, amounts, data);

    for (uint256 i = 0; i < ids.length; ++i) {
      uint256 id = ids[i];
      uint256 amount = amounts[i];

      uint256 fromBalance = _balances[id][from];
      require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
      unchecked {
        _balances[id][from] = fromBalance - amount;
      }
      _balances[id][to] += amount;
    }

    emit TransferBatch(operator, from, to, ids, amounts);

    _afterTokenTransfer(operator, from, to, ids, amounts, data);

    _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
  }

  /**
   * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
   *
   * Emits a {TransferSingle} event.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
   * acceptance magic value.
   */
  function _mint(
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) internal virtual {
    require(to != address(0), "ERC1155: mint to the zero address");

    address operator = msg.sender;
    uint256[] memory ids = _asSingletonArray(id);
    uint256[] memory amounts = _asSingletonArray(amount);

    _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

    _balances[id][to] += amount;
    emit TransferSingle(operator, address(0), to, id, amount);

    _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

    _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
  }

  /**
   * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
   *
   * Emits a {TransferBatch} event.
   *
   * Requirements:
   *
   * - `ids` and `amounts` must have the same length.
   * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
   * acceptance magic value.
   */
  function _mintBatch(
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) internal virtual {
    require(to != address(0), "ERC1155: mint to the zero address");
    require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

    address operator = msg.sender;

    _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

    for (uint256 i = 0; i < ids.length; i++) {
      _balances[ids[i]][to] += amounts[i];
    }

    emit TransferBatch(operator, address(0), to, ids, amounts);

    _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

    _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
  }

  /**
   * @dev Destroys `amount` tokens of token type `id` from `from`
   *
   * Emits a {TransferSingle} event.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `from` must have at least `amount` tokens of token type `id`.
   */
  function _burn(
    address from,
    uint256 id,
    uint256 amount
  ) internal virtual {
    require(from != address(0), "ERC1155: burn from the zero address");

    address operator = msg.sender;
    uint256[] memory ids = _asSingletonArray(id);
    uint256[] memory amounts = _asSingletonArray(amount);

    _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

    uint256 fromBalance = _balances[id][from];
    require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
    unchecked {
      _balances[id][from] = fromBalance - amount;
    }

    emit TransferSingle(operator, from, address(0), id, amount);

    _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
  }

  /**
   * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
   *
   * Emits a {TransferBatch} event.
   *
   * Requirements:
   *
   * - `ids` and `amounts` must have the same length.
   */
  function _burnBatch(
    address from,
    uint256[] memory ids,
    uint256[] memory amounts
  ) internal virtual {
    require(from != address(0), "ERC1155: burn from the zero address");
    require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

    address operator = msg.sender;

    _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

    for (uint256 i = 0; i < ids.length; i++) {
      uint256 id = ids[i];
      uint256 amount = amounts[i];

      uint256 fromBalance = _balances[id][from];
      require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
      unchecked {
        _balances[id][from] = fromBalance - amount;
      }
    }

    emit TransferBatch(operator, from, address(0), ids, amounts);

    _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
  }

  /**
   * @dev Approve `operator` to operate on all of `owner` tokens
   *
   * Emits an {ApprovalForAll} event.
   */
  function _setApprovalForAll(
    address owner,
    address operator,
    bool approved
  ) internal virtual {
    require(owner != operator, "ERC1155: setting approval status for self");
    _operatorApprovals[owner][operator] = approved;
    emit ApprovalForAll(owner, operator, approved);
  }

  /**
   * @dev Hook that is called before any token transfer. This includes minting
   * and burning, as well as batched variants.
   *
   * The same hook is called on both single and batched variants. For single
   * transfers, the length of the `ids` and `amounts` arrays will be 1.
   *
   * Calling conditions (for each `id` and `amount` pair):
   *
   * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
   * of token type `id` will be  transferred to `to`.
   * - When `from` is zero, `amount` tokens of token type `id` will be minted
   * for `to`.
   * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
   * will be burned.
   * - `from` and `to` are never both zero.
   * - `ids` and `amounts` have the same, non-zero length.
   *
   * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
   */
  function _beforeTokenTransfer(
    address operator,
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) internal virtual {}

  /**
   * @dev Hook that is called after any token transfer. This includes minting
   * and burning, as well as batched variants.
   *
   * The same hook is called on both single and batched variants. For single
   * transfers, the length of the `id` and `amount` arrays will be 1.
   *
   * Calling conditions (for each `id` and `amount` pair):
   *
   * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
   * of token type `id` will be  transferred to `to`.
   * - When `from` is zero, `amount` tokens of token type `id` will be minted
   * for `to`.
   * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
   * will be burned.
   * - `from` and `to` are never both zero.
   * - `ids` and `amounts` have the same, non-zero length.
   *
   * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
   */
  function _afterTokenTransfer(
    address operator,
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) internal virtual {}

  function _doSafeTransferAcceptanceCheck(
    address operator,
    address from,
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) private {
    if (to.isContract()) {
      try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (
        bytes4 response
      ) {
        if (response != IERC1155Receiver.onERC1155Received.selector) {
          revert("ERC1155: ERC1155Receiver rejected tokens");
        }
      } catch Error(string memory reason) {
        revert(reason);
      } catch {
        revert("ERC1155: transfer to non-ERC1155Receiver implementer");
      }
    }
  }

  function _doSafeBatchTransferAcceptanceCheck(
    address operator,
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) private {
    if (to.isContract()) {
      try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
        bytes4 response
      ) {
        if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
          revert("ERC1155: ERC1155Receiver rejected tokens");
        }
      } catch Error(string memory reason) {
        revert(reason);
      } catch {
        revert("ERC1155: transfer to non-ERC1155Receiver implementer");
      }
    }
  }

  function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
    uint256[] memory array = new uint256[](1);
    array[0] = element;

    return array;
  }
}

File 10 of 19 : IERC1155CreatorBase.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "../Helpers/Royalties/IRoyalties.sol";

interface IERC1155CreatorBase is IRoyalties {
  struct RoyaltyConfig {
    address payable receiver;
    uint16 bps;
  }

  enum TokenClaimType {
    PUBLIC,
    ADMIN,
    DISABLED
  }

  struct TokenMetadataConfig {
    uint256 totalSupply;
    uint256 maxSupply;
    uint256 maxClaimPerUser;
    uint256 price;
    string uri;
    RoyaltyConfig[] royalties;
    TokenClaimType claimStatus;
  }

  event TokenClaimStatusUpdate(uint256 indexed tokenId, TokenClaimType claimStatus);

  /**
   * @dev Set secondary royalties configuration(s) for token by admin.
   */
  function setRoyalties(
    uint256 tokenId,
    address payable[] calldata receivers,
    uint256[] calldata basisPoints
  ) external;

  /**
   * @dev Update token uri after a token is minted by permissioned user.
   */
  function updateTokenURI(uint256 tokenId, string calldata uri) external;

  /**
   * @dev Toggle `claimable` flag for claiming of tokens
   */
  function updateTokenClaimStatus(uint256 tokenId, TokenClaimType claimStatus) external;

  /**
   * @dev Update token public minting price.
   */
  function updateTokenMintPrice(uint256 tokenId, uint256 newPrice) external;

  /**
   * @dev Total amount of tokens in with a given tokenId.
   */
  function totalSupply(uint256 tokenId) external view returns (uint256);

  /**
   * @dev Maximum amount of supply to be minted with a given tokenId.
   */
  function maxSupply(uint256 tokenId) external view returns (uint256);

  /**
   * @dev Price to mint a given initialised tokenId.
   */
  function publicMintPrice(uint256 tokenId) external view returns (uint256);

  /**
   * @dev Returns TokenMetadataConfig specified by a tokenId.
   */
  function tokenMetadata(uint256 tokenId)
    external
    view
    returns (
      uint256,
      uint256,
      uint256,
      uint256,
      string memory,
      TokenClaimType
    );
}

File 11 of 19 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 12 of 19 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 13 of 19 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 14 of 19 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 15 of 19 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 16 of 19 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 17 of 19 : IRoyalties.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IRoyalties is IERC165 {
  event RoyaltiesUpdated(
    uint256 indexed tokenId,
    address payable[] receivers,
    uint256[] basisPoints
  );

  /**
   * @dev Get royalites of a token.  Returns list of receivers and basisPoints
   */
  function getRoyalties(uint256 tokenId)
    external
    view
    returns (address payable[] memory, uint256[] memory);

  // Royalty support for various other standards
  function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory);

  function getFeeBps(uint256 tokenId) external view returns (uint256[] memory);

  function getFees(uint256 tokenId)
    external
    view
    returns (address payable[] memory, uint256[] memory);

  function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);
}

File 18 of 19 : BoringOwnable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract BoringOwnableData {
  address public owner;
  address public pendingOwner;
}

contract BoringOwnable is BoringOwnableData {
  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

  /// @notice `owner` defaults to msg.sender on construction.
  constructor() {
    owner = msg.sender;
    emit OwnershipTransferred(address(0), msg.sender);
  }

  /// @notice Transfers ownership to `newOwner`. Either directly or claimable by the new pending owner.
  /// Can only be invoked by the current `owner`.
  /// @param newOwner Address of the new owner.
  /// @param direct True if `newOwner` should be set immediately. False if `newOwner` needs to use `claimOwnership`.
  /// @param renounce Allows the `newOwner` to be `address(0)` if `direct` and `renounce` is True. Has no effect otherwise.
  function transferOwnership(
    address newOwner,
    bool direct,
    bool renounce
  ) public onlyOwner {
    if (direct) {
      // Checks
      require(newOwner != address(0) || renounce, "Ownable: zero address");

      // Effects
      emit OwnershipTransferred(owner, newOwner);
      owner = newOwner;
      pendingOwner = address(0);
    } else {
      // Effects
      pendingOwner = newOwner;
    }
  }

  /// @notice Needs to be called by `pendingOwner` to claim ownership.
  function claimOwnership() public {
    address _pendingOwner = pendingOwner;

    // Checks
    require(msg.sender == _pendingOwner, "Ownable: caller != pending owner");

    // Effects
    emit OwnershipTransferred(owner, _pendingOwner);
    owner = _pendingOwner;
    pendingOwner = address(0);
  }

  /// @notice Only allows the `owner` to execute the function.
  modifier onlyOwner() {
    require(msg.sender == owner, "Ownable: caller is not the owner");
    _;
  }
}

File 19 of 19 : IPermissionControl.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

interface IPermissionControl is IERC165 {
  event PermissionGranted(address indexed newAdmin, address indexed assigner);
  event PermissionRevoked(address indexed oldAdmin, address indexed assigner);

  /**
   * @dev gets address of all approved admins.
   */
  function getAllPermissionedUsers() external view returns (address[] memory);

  /**
   * @dev add an admin.  Can only be called by contract owner.
   */
  function grantPermissionToUser(address admin) external;

  /**
   * @dev remove an admin.  Can only be called by contract owner.
   */
  function revokePermission(address admin) external;

  /**
   * @dev checks whether or not given address is an admin, which includes owner
   * Returns True if they are
   */
  function isPermissionedUser(address admin) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 3000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"feeBps_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"assigner","type":"address"}],"name":"PermissionGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"assigner","type":"address"}],"name":"PermissionRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"RoyaltiesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"enum IERC1155CreatorBase.TokenClaimType","name":"claimStatus","type":"uint8"}],"name":"TokenClaimStatusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxClaimPerUser","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenUri","type":"string"},{"indexed":false,"internalType":"address","name":"revenueRecipient","type":"address"}],"name":"TokenInitialised","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"revenueRecipient","type":"address"}],"name":"TokenRevenueRecipientUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"ARTZONE_MINTER_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BPS","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllPermissionedUsers","outputs":[{"internalType":"address[]","name":"permissionedUsers","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"grantPermissionToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxClaimPerUser","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"components":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint16","name":"bps","type":"uint16"}],"internalType":"struct IERC1155CreatorBase.RoyaltyConfig[]","name":"royalties","type":"tuple[]"},{"internalType":"enum IERC1155CreatorBase.TokenClaimType","name":"claimStatus","type":"uint8"}],"internalType":"struct IERC1155CreatorBase.TokenMetadataConfig[]","name":"tokenConfigs","type":"tuple[]"},{"internalType":"address[]","name":"revenueRecipients","type":"address[]"}],"name":"initialiseNewMultipleTokens","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"maxClaimPerUser","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"components":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint16","name":"bps","type":"uint16"}],"internalType":"struct IERC1155CreatorBase.RoyaltyConfig[]","name":"royalties","type":"tuple[]"},{"internalType":"enum IERC1155CreatorBase.TokenClaimType","name":"claimStatus","type":"uint8"}],"internalType":"struct IERC1155CreatorBase.TokenMetadataConfig","name":"tokenConfig","type":"tuple"},{"internalType":"address","name":"revenueRecipient","type":"address"}],"name":"initialiseNewSingleToken","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isPermissionedUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintExistingMultipleTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintExistingSingleToken","outputs":[],"stateMutability":"payable","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":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicMintPrice","outputs":[{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"revokePermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyalties","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":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"tokenAmountClaimedByUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenMetadata","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"},{"internalType":"uint256","name":"maxClaimPerUser","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"enum IERC1155CreatorBase.TokenClaimType","name":"claimStatus","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateArtzoneFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"enum IERC1155CreatorBase.TokenClaimType","name":"claimStatus","type":"uint8"}],"name":"updateTokenClaimStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"updateTokenMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newRecipient","type":"address"}],"name":"updateTokenRevenueRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"updateTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"tokenURI","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80636914db6011610179578063bb3bafd6116100d6578063d936fba91161008a578063f242432a11610064578063f242432a14610824578063f723bbed14610844578063fd967f471461086457600080fd5b8063d936fba914610778578063e30c3978146107bb578063e985e9c5146107db57600080fd5b8063d120ef91116100bb578063d120ef9114610732578063d2473f7514610762578063d5a06d4c146106e457600080fd5b8063bb3bafd6146106e4578063bd85b0391461071257600080fd5b80638da5cb5b1161012d578063a22cb46511610112578063a22cb46514610677578063a3bf5b9a14610697578063b9c4d9fb146106b757600080fd5b80638da5cb5b1461062a57806395d89b411461066257600080fd5b806378fc05091161015e57806378fc0509146105d75780637a017dec146105f7578063869f75941461060a57600080fd5b80636914db60146105925780636e06dc56146105c457600080fd5b806318e97fd1116102275780634e1273f4116101db57806351cff8d9116101c057806351cff8d91461053d57806357172f94146105505780635c49dc0c1461057257600080fd5b80634e1273f4146105085780634e71e0c81461052857600080fd5b80632a55205a1161020c5780632a55205a146104895780632eb2c2d6146104c85780633c671d68146104e857600080fd5b806318e97fd11461044957806320e4afe21461046957600080fd5b80630c03b3141161027e5780630ebd4c7f116102635780630ebd4c7f146103dc5780631467e656146104095780631503ba1b1461042957600080fd5b80630c03b3141461039c5780630e89341c146103bc57600080fd5b806306fdde03116102af57806306fdde0314610338578063078dfbe71461035a5780630895cb5a1461037c57600080fd5b8062fdd58e146102d557806301ffc9a71461030857600080fd5b366102d057005b600080fd5b3480156102e157600080fd5b506102f56102f0366004613d95565b610893565b6040519081526020015b60405180910390f35b34801561031457600080fd5b50610328610323366004613dd7565b610941565b60405190151581526020016102ff565b34801561034457600080fd5b5061034d61096a565b6040516102ff9190613e41565b34801561036657600080fd5b5061037a610375366004613e69565b6109fc565b005b34801561038857600080fd5b506102f5610397366004613eae565b610b5c565b3480156103a857600080fd5b5061037a6103b7366004613f05565b610bff565b3480156103c857600080fd5b5061034d6103d7366004613f22565b610cae565b3480156103e857600080fd5b506103fc6103f7366004613f22565b610cb9565b6040516102ff9190613f76565b34801561041557600080fd5b5061037a610424366004613f22565b610cc4565b34801561043557600080fd5b50610328610444366004613f05565b610dab565b34801561045557600080fd5b5061037a610464366004613f89565b610dce565b34801561047557600080fd5b5061037a61048436600461404a565b610e6a565b34801561049557600080fd5b506104a96104a43660046140c4565b610f0f565b604080516001600160a01b0390931683526020830191909152016102ff565b3480156104d457600080fd5b5061037a6104e3366004614232565b610f28565b3480156104f457600080fd5b5061037a6105033660046142ed565b610fe1565b34801561051457600080fd5b506103fc610523366004614312565b61107c565b34801561053457600080fd5b5061037a6111ba565b61037a61054b366004613f05565b611284565b34801561055c57600080fd5b50610565611313565b6040516102ff91906143df565b34801561057e57600080fd5b506103fc61058d36600461442c565b6113c2565b34801561059e57600080fd5b506105b26105ad366004613f22565b61152f565b6040516102ff969594939291906144d0565b61037a6105d2366004614515565b61174e565b3480156105e357600080fd5b5061037a6105f236600461454a565b61184e565b61037a61060536600461456f565b6119f7565b34801561061657600080fd5b506102f5610625366004613f22565b611c7f565b34801561063657600080fd5b5060005461064a906001600160a01b031681565b6040516001600160a01b0390911681526020016102ff565b34801561066e57600080fd5b5061034d611ce7565b34801561068357600080fd5b5061037a610692366004614609565b611cf6565b3480156106a357600080fd5b5061037a6106b2366004613f05565b611d01565b3480156106c357600080fd5b506106d76106d2366004613f22565b611dac565b6040516102ff9190614677565b3480156106f057600080fd5b506107046106ff366004613f22565b611db7565b6040516102ff92919061468a565b34801561071e57600080fd5b506102f561072d366004613f22565b611dcc565b34801561073e57600080fd5b5061037a61074d3660046140c4565b60009182526008602052604090912060030155565b34801561076e57600080fd5b506102f5600b5481565b34801561078457600080fd5b506102f561079336600461454a565b6000918252600d602090815260408084206001600160a01b0393909316845291905290205490565b3480156107c757600080fd5b5060015461064a906001600160a01b031681565b3480156107e757600080fd5b506103286107f63660046146b8565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561083057600080fd5b5061037a61083f3660046146d6565b611e31565b34801561085057600080fd5b506102f561085f366004613f22565b611eea565b34801561087057600080fd5b5061087a61271081565b60405167ffffffffffffffff90911681526020016102ff565b60006001600160a01b0383166109165760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5060008181526004602090815260408083206001600160a01b03861684529091529020545b92915050565b600061094c82611f52565b8061095b575061095b82611f8c565b8061093b575061093b82611f52565b6060600280546109799061473f565b80601f01602080910402602001604051908101604052809291908181526020018280546109a59061473f565b80156109f25780601f106109c7576101008083540402835291602001916109f2565b820191906000526020600020905b8154815290600101906020018083116109d557829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a565760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161090d565b8115610b2e576001600160a01b038316151580610a705750805b610abc5760405162461bcd60e51b815260206004820152601560248201527f4f776e61626c653a207a65726f20616464726573730000000000000000000000604482015260640161090d565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03851673ffffffffffffffffffffffffffffffffffffffff1991821617909155600180549091169055505050565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385161790555b505050565b600080546001600160a01b0316331480610b7c5750610b7c6009336120d3565b610bee5760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b610bf883836120f5565b9392505050565b6000546001600160a01b03163314610c595760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161090d565b610c646009826120d3565b610cab5760405133906001600160a01b038316907f0ceda602a8e00ef76afe24614343eb6c034877c816b6184d641d2d8b713a0fc690600090a3610ca9600982612336565b505b50565b606061093b8261234b565b606061093b8261243e565b6000546001600160a01b0316331480610ce35750610ce36009336120d3565b610d555760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b6127108110610da65760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420626173697320706f696e7473000000000000000000000000604482015260640161090d565b600b55565b600080546001600160a01b038381169116148061093b575061093b6009836120d3565b6000546001600160a01b0316331480610ded5750610ded6009336120d3565b610e5f5760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b610b57838383612449565b6000546001600160a01b0316331480610e895750610e896009336120d3565b610efb5760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b610f0885858585856124b4565b5050505050565b600080610f1c8484612544565b915091505b9250929050565b6001600160a01b038516331480610f6257506001600160a01b038516600090815260056020908152604080832033845290915290205460ff165b610fd45760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161090d565b610f088585858585612618565b6000546001600160a01b031633148061100057506110006009336120d3565b6110725760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b610ca982826128b9565b606081518351146110f55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d617463680000000000000000000000000000000000000000000000606482015260840161090d565b6000835167ffffffffffffffff811115611111576111116140e6565b60405190808252806020026020018201604052801561113a578160200160208202803683370190505b50905060005b84518110156111b25761118585828151811061115e5761115e61477a565b60200260200101518583815181106111785761117861477a565b6020026020010151610893565b8282815181106111975761119761477a565b60209081029190910101526111ab816147a6565b9050611140565b509392505050565b6001546001600160a01b03163381146112155760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604482015260640161090d565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19928316179055600180549091169055565b6000546001600160a01b031633146112de5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161090d565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610ca9573d6000803e3d6000fd5b606061131f600961296b565b67ffffffffffffffff811115611337576113376140e6565b604051908082528060200260200182016040528015611360578160200160208202803683370190505b50905060005b611370600961296b565b8110156113be57611382600982612975565b8282815181106113945761139461477a565b6001600160a01b0390921660209283029190910190910152806113b6816147a6565b915050611366565b5090565b6000546060906001600160a01b03163314806113e457506113e46009336120d3565b6114565760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b838067ffffffffffffffff811115611470576114706140e6565b604051908082528060200260200182016040528015611499578160200160208202803683370190505b50915060005b818110156115255760006114fc8888848181106114be576114be61477a565b90506020028101906114d091906147c1565b8787858181106114e2576114e261477a565b90506020020160208101906114f79190613f05565b6120f5565b9050808483815181106115115761151161477a565b60209081029190910101525060010161149f565b5050949350505050565b600080600080606060008660008111801561154c57506007548111155b6115885760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b6000600860008a81526020019081526020016000206040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820180546115e09061473f565b80601f016020809104026020016040519081016040528092919081815260200182805461160c9061473f565b80156116595780601f1061162e57610100808354040283529160200191611659565b820191906000526020600020905b81548152906001019060200180831161163c57829003601f168201915b5050505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156116e257600084815260209081902060408051808201909152908401546001600160a01b038116825274010000000000000000000000000000000000000000900461ffff1681830152825260019092019101611687565b50505090825250600682015460209091019060ff16600281111561170857611708614498565b600281111561171957611719614498565b9052508051602082015160608301516040840151608085015160c090950151939e929d50909b50995091975095509350505050565b6000811161179e5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161090d565b6117a733610dab565b1580156117c4575060008281526008602052604090206003015415155b15611843576000828152600860205260408120600301546117e69083906147ff565b90508034146118375760405162461bcd60e51b815260206004820152601460248201527f556e6d6174636865642076616c75652073656e74000000000000000000000000604482015260640161090d565b6118418382612981565b505b610b57828483612a52565b8160008111801561186157506007548111155b61189d5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b6000546001600160a01b03163314806118bc57506118bc6009336120d3565b61192e5760405162461bcd60e51b815260206004820152603860248201527f5065726d697373696f6e436f6e74726f6c3a204f6e6c79206f776e6572206f7260448201527f206578697374696e672061646d696e20616c6c6f7765642e0000000000000000606482015260840161090d565b6001600160a01b0382166119845760405162461bcd60e51b815260206004820152600c60248201527f4e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161090d565b6000838152600c6020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038616908117909155915191825284917f101aeb7710975ec1cb613d272ac257419e630443626182262a93a40f0d7ffc6291015b60405180910390a2505050565b8483148015611a0557508281145b611a515760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420696e70757473000000000000000000000000000000000000604482015260640161090d565b84611a5b33610dab565b611b99576000808267ffffffffffffffff811115611a7b57611a7b6140e6565b604051908082528060200260200182016040528015611aa4578160200160208202803683370190505b50905060005b83811015611b3b576000868683818110611ac657611ac661477a565b90506020020135600860008b8b86818110611ae357611ae361477a565b90506020020135815260200190815260200160002060030154611b0691906147ff565b9050611b12818561481e565b935080838381518110611b2757611b2761477a565b602090810291909101015250600101611aaa565b50813414611b8b5760405162461bcd60e51b815260206004820152601460248201527f556e6d6174636865642076616c75652073656e74000000000000000000000000604482015260640161090d565b611b96878783612dff565b50505b60005b81811015611c75576000848483818110611bb857611bb861477a565b9050602002013511611c0c5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161090d565b611c6d868683818110611c2157611c2161477a565b90506020020135898984818110611c3a57611c3a61477a565b9050602002016020810190611c4f9190613f05565b868685818110611c6157611c6161477a565b90506020020135612a52565b600101611b9c565b5050505050505050565b600081600081118015611c9457506007548111155b611cd05760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b505060009081526008602052604090206001015490565b6060600380546109799061473f565b610ca9338383612e75565b6000546001600160a01b03163314611d5b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161090d565b611d666009826120d3565b15610cab5760405133906001600160a01b038316907f5f708ef9fc37d19d88246c264788c8cdf640c9ff500bd168e941ea1421c4f6c490600090a3610ca9600982612f6a565b606061093b82612f7f565b606080611dc383612f91565b91509150915091565b600081600081118015611de157506007548111155b611e1d5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b505060009081526008602052604090205490565b6001600160a01b038516331480611e6b57506001600160a01b038516600090815260056020908152604080832033845290915290205460ff165b611edd5760405162461bcd60e51b815260206004820152602e60248201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60448201527f6572206f7220617070726f766564000000000000000000000000000000000000606482015260840161090d565b610f088585858585613249565b600081600081118015611eff57506007548111155b611f3b5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b505060009081526008602052604090206003015490565b60006001600160e01b031982167feda87d0100000000000000000000000000000000000000000000000000000000148061093b575061093b825b60006001600160e01b031982167f706787ea000000000000000000000000000000000000000000000000000000001480611fef57506001600160e01b031982167f28f10a2100000000000000000000000000000000000000000000000000000000145b80611ffe5750611ffe82613423565b8061203257506001600160e01b031982167fbb3bafd600000000000000000000000000000000000000000000000000000000145b8061206657506001600160e01b031982167fb779958400000000000000000000000000000000000000000000000000000000145b8061209a57506001600160e01b031982167fd5a06d4c00000000000000000000000000000000000000000000000000000000145b8061093b57506001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001492915050565b6001600160a01b03811660009081526001830160205260408120541515610bf8565b60008235156121465760405162461bcd60e51b815260206004820181905260248201527f496e697469616c20746f74616c20737570706c792073686f756c642062652030604482015260640161090d565b600083602001351161219a5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420616d6f756e74000000000000000000000000000000000000604482015260640161090d565b60008360400135116121ee5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d617820636c61696d207175616e74697479000000000000604482015260640161090d565b82602001358360400135111561226c5760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420696e646976696475616c20636c61696d207175616e74697460448201527f7900000000000000000000000000000000000000000000000000000000000000606482015260840161090d565b60076000815461227b906147a6565b91829055506000818152600860205260409020909150839061229d8282614b22565b50506000818152600c6020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861617905582917fdb0748d0c31ebef021c4cb9b9df7307f5058c3f90a2a9ea05122e7fccb6e6e2991860135906060870135908701356123156080890189614836565b8860405161232896959493929190614bce565b60405180910390a292915050565b6000610bf8836001600160a01b0384166134be565b60608160008111801561236057506007548111155b61239c5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b600083815260086020526040902060040180546123b89061473f565b80601f01602080910402602001604051908101604052809291908181526020018280546123e49061473f565b80156124315780601f1061240657610100808354040283529160200191612431565b820191906000526020600020905b81548152906001019060200180831161241457829003601f168201915b5050505050915050919050565b6060610bf882612f91565b8260008111801561245c57506007548111155b6124985760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b6000848152600860205260409020610f08906004018484613c96565b6124c08484848461350d565b60008581526008602052604081206124dd91600590910190613d16565b6124ff84848484600860008b81526020019081526020016000206005016135e8565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee858585856040516125359493929190614c25565b60405180910390a25050505050565b60008060008061255386612f91565b915091506001825111156125a95760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c747920726563656976657200000000604482015260640161090d565b81516125bd57306000935093505050610f21565b816000815181106125d0576125d061477a565b602002602001015161271086836000815181106125ef576125ef61477a565b602002602001015161260191906147ff565b61260b9190614cc2565b9350935050509250929050565b815183511461268f5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d61746368000000000000000000000000000000000000000000000000606482015260840161090d565b6001600160a01b03841661270b5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161090d565b3360005b845181101561284b57600085828151811061272c5761272c61477a565b60200260200101519050600085838151811061274a5761274a61477a565b60209081029190910181015160008481526004835260408082206001600160a01b038e1683529093529190912054909150818110156127f15760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161090d565b60008381526004602090815260408083206001600160a01b038e8116855292528083208585039055908b1682528120805484929061283090849061481e565b9250508190555050505080612844906147a6565b905061270f565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161289b929190614ce4565b60405180910390a46128b18187878787876136cc565b505050505050565b816000811180156128cc57506007548111155b6129085760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b6000838152600860205260409020600601805483919060ff1916600183600281111561293657612936614498565b0217905550827f49993f795aecdb61a2b7e7ea79c558418851ac427cc322a3064e408765783530836040516119ea9190614cf7565b600061093b825490565b6000610bf883836138c2565b600260065414156129d45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161090d565b6002600655600b54600090612710906129ed90846147ff565b6129f79190614cc2565b6000848152600c60205260409020549091506001600160a01b03166108fc612a1f8385614d05565b6040518115909202916000818181858888f19350505050158015612a47573d6000803e3d6000fd5b505060016006555050565b60026006541415612aa55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161090d565b60026006908155600084815260086020526040902001548390339060ff16612acc82610dab565b15612b53576000816002811115612ae557612ae5614498565b1480612b0257506001816002811115612b0057612b00614498565b145b612b4e5760405162461bcd60e51b815260206004820152601360248201527f546f6b656e206d696e742064697361626c656400000000000000000000000000604482015260640161090d565b612bb4565b6000816002811115612b6757612b67614498565b14612bb45760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e207075626c6963206d696e742064697361626c6564000000000000604482015260640161090d565b600754861115612c065760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420746f6b656e49642073706563696669656400000000000000604482015260640161090d565b600086815260086020526040902060018101549054612c2690869061481e565b1115612c745760405162461bcd60e51b815260206004820152601860248201527f496e76616c696420616d6f756e74207370656369666965640000000000000000604482015260640161090d565b600086815260086020908152604080832060020154600d83528184206001600160a01b038a16855290925290912054612cae90869061481e565b1115612cfc5760405162461bcd60e51b815260206004820152601c60248201527f45786365656420746f6b656e206d617820636c61696d206c696d697400000000604482015260640161090d565b60008681526008602052604081208054869290612d1a90849061481e565b90915550506000868152600d602090815260408083206001600160a01b038916845290915281208054869290612d5190849061481e565b92505081905550612d73858786604051806020016040528060008152506138ec565b857f1cca3d449a48a282d9e3a7bc58b3d4f414669cb0828191d3d651c274012a5eff85873388600860008d815260200190815260200160002060030154612dba91906147ff565b604051612dea94939291909384526001600160a01b03928316602085015291166040830152606082015260800190565b60405180910390a25050600160065550505050565b60005b82811015612e6f576000828281518110612e1e57612e1e61477a565b60200260200101511115612e6757612e67848483818110612e4157612e4161477a565b90506020020135838381518110612e5a57612e5a61477a565b6020026020010151612981565b600101612e02565b50505050565b816001600160a01b0316836001600160a01b03161415612efd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c660000000000000000000000000000000000000000000000606482015260840161090d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000610bf8836001600160a01b038416613a15565b6060612f8a82612f91565b5092915050565b60608082600081118015612fa757506007548111155b612fe35760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b604482015260640161090d565b600084815260086020908152604080832060050180548251818502810185019093528083529192909190849084015b8282101561306d57600084815260209081902060408051808201909152908401546001600160a01b038116825274010000000000000000000000000000000000000000900461ffff1681830152825260019092019101613012565b50505050905080516000141561310a5760408051600180825281830190925290602080830190803683370190505093506000846000815181106130b2576130b261477a565b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505092506000836000815181106130fd576130fd61477a565b6020026020010181815250505b80511561324257805167ffffffffffffffff81111561312b5761312b6140e6565b604051908082528060200260200182016040528015613154578160200160208202803683370190505b509350805167ffffffffffffffff811115613171576131716140e6565b60405190808252806020026020018201604052801561319a578160200160208202803683370190505b50925060005b8151811015613240578181815181106131bb576131bb61477a565b6020026020010151600001518582815181106131d9576131d961477a565b60200260200101906001600160a01b031690816001600160a01b03168152505081818151811061320b5761320b61477a565b60200260200101516020015161ffff1684828151811061322d5761322d61477a565b60209081029190910101526001016131a0565b505b5050915091565b6001600160a01b0384166132c55760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161090d565b3360006132d185613b08565b905060006132de85613b08565b905060008681526004602090815260408083206001600160a01b038c168452909152902054858110156133795760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e7366657200000000000000000000000000000000000000000000606482015260840161090d565b60008781526004602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906133b890849061481e565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613418848a8a8a8a8a613b53565b505050505050505050565b60006001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000148061348657506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061093b57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461093b565b60008181526001830160205260408120546135055750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561093b565b50600061093b565b82811461355c5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642072656365697665727320262062707320696e707574000000604482015260640161090d565b6000805b828110156135965783838281811061357a5761357a61477a565b905060200201358261358c919061481e565b9150600101613560565b506127108110610f085760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420746f74616c20726f79616c74696573000000000000000000604482015260640161090d565b60005b828110156128b1578160405180604001604052808888858181106136115761361161477a565b90506020020160208101906136269190613f05565b6001600160a01b031681526020018686858181106136465761364661477a565b61ffff60209182029390930135831690935250835460018181018655600095865294839020845191018054949093015190911674010000000000000000000000000000000000000000027fffffffffffffffffffff000000000000000000000000000000000000000000009093166001600160a01b0390911617919091179055016135eb565b6001600160a01b0384163b156128b1576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c81906137299089908990889088908890600401614d1c565b6020604051808303816000875af1925050508015613764575060408051601f3d908101601f1916820190925261376191810190614d7a565b60015b61381a57613770614d97565b806308c379a014156137aa5750613785614db3565b8061379057506137ac565b8060405162461bcd60e51b815260040161090d9190613e41565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840161090d565b6001600160e01b031981167fbc197c8100000000000000000000000000000000000000000000000000000000146138b95760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161090d565b50505050505050565b60008260000182815481106138d9576138d961477a565b9060005260206000200154905092915050565b6001600160a01b0384166139685760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161090d565b33600061397485613b08565b9050600061398185613b08565b905060008681526004602090815260408083206001600160a01b038b168452909152812080548792906139b590849061481e565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46138b983600089898989613b53565b60008181526001830160205260408120548015613afe576000613a39600183614d05565b8554909150600090613a4d90600190614d05565b9050818114613ab2576000866000018281548110613a6d57613a6d61477a565b9060005260206000200154905080876000018481548110613a9057613a9061477a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613ac357613ac3614e5b565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061093b565b600091505061093b565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613b4257613b4261477a565b602090810291909101015292915050565b6001600160a01b0384163b156128b1576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190613bb09089908990889088908890600401614e71565b6020604051808303816000875af1925050508015613beb575060408051601f3d908101601f19168201909252613be891810190614d7a565b60015b613bf757613770614d97565b6001600160e01b031981167ff23a6e6100000000000000000000000000000000000000000000000000000000146138b95760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e73000000000000000000000000000000000000000000000000606482015260840161090d565b828054613ca29061473f565b90600052602060002090601f016020900481019282613cc45760008555613d0a565b82601f10613cdd5782800160ff19823516178555613d0a565b82800160010185558215613d0a579182015b82811115613d0a578235825591602001919060010190613cef565b506113be929150613d34565b5080546000825590600052602060002090810190610cab9190613d49565b5b808211156113be5760008155600101613d35565b5b808211156113be5780547fffffffffffffffffffff00000000000000000000000000000000000000000000168155600101613d4a565b6001600160a01b0381168114610cab57600080fd5b60008060408385031215613da857600080fd5b8235613db381613d80565b946020939093013593505050565b6001600160e01b031981168114610cab57600080fd5b600060208284031215613de957600080fd5b8135610bf881613dc1565b6000815180845260005b81811015613e1a57602081850181015186830182015201613dfe565b81811115613e2c576000602083870101525b50601f01601f19169290920160200192915050565b602081526000610bf86020830184613df4565b80358015158114613e6457600080fd5b919050565b600080600060608486031215613e7e57600080fd5b8335613e8981613d80565b9250613e9760208501613e54565b9150613ea560408501613e54565b90509250925092565b60008060408385031215613ec157600080fd5b823567ffffffffffffffff811115613ed857600080fd5b830160e08186031215613eea57600080fd5b91506020830135613efa81613d80565b809150509250929050565b600060208284031215613f1757600080fd5b8135610bf881613d80565b600060208284031215613f3457600080fd5b5035919050565b600081518084526020808501945080840160005b83811015613f6b57815187529582019590820190600101613f4f565b509495945050505050565b602081526000610bf86020830184613f3b565b600080600060408486031215613f9e57600080fd5b83359250602084013567ffffffffffffffff80821115613fbd57600080fd5b818601915086601f830112613fd157600080fd5b813581811115613fe057600080fd5b876020828501011115613ff257600080fd5b6020830194508093505050509250925092565b60008083601f84011261401757600080fd5b50813567ffffffffffffffff81111561402f57600080fd5b6020830191508360208260051b8501011115610f2157600080fd5b60008060008060006060868803121561406257600080fd5b85359450602086013567ffffffffffffffff8082111561408157600080fd5b61408d89838a01614005565b909650945060408801359150808211156140a657600080fd5b506140b388828901614005565b969995985093965092949392505050565b600080604083850312156140d757600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715614122576141226140e6565b6040525050565b600067ffffffffffffffff821115614143576141436140e6565b5060051b60200190565b600082601f83011261415e57600080fd5b8135602061416b82614129565b60405161417882826140fc565b83815260059390931b850182019282810191508684111561419857600080fd5b8286015b848110156141b3578035835291830191830161419c565b509695505050505050565b600082601f8301126141cf57600080fd5b813567ffffffffffffffff8111156141e9576141e96140e6565b6040516142006020601f19601f85011601826140fc565b81815284602083860101111561421557600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561424a57600080fd5b853561425581613d80565b9450602086013561426581613d80565b9350604086013567ffffffffffffffff8082111561428257600080fd5b61428e89838a0161414d565b945060608801359150808211156142a457600080fd5b6142b089838a0161414d565b935060808801359150808211156142c657600080fd5b506142d3888289016141be565b9150509295509295909350565b60038110610cab57600080fd5b6000806040838503121561430057600080fd5b823591506020830135613efa816142e0565b6000806040838503121561432557600080fd5b823567ffffffffffffffff8082111561433d57600080fd5b818501915085601f83011261435157600080fd5b8135602061435e82614129565b60405161436b82826140fc565b83815260059390931b850182019282810191508984111561438b57600080fd5b948201945b838610156143b25785356143a381613d80565b82529482019490820190614390565b965050860135925050808211156143c857600080fd5b506143d58582860161414d565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156144205783516001600160a01b0316835292840192918401916001016143fb565b50909695505050505050565b6000806000806040858703121561444257600080fd5b843567ffffffffffffffff8082111561445a57600080fd5b61446688838901614005565b9096509450602087013591508082111561447f57600080fd5b5061448c87828801614005565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b600381106144cc57634e487b7160e01b600052602160045260246000fd5b9052565b86815285602082015284604082015283606082015260c0608082015260006144fb60c0830185613df4565b905061450a60a08301846144ae565b979650505050505050565b60008060006060848603121561452a57600080fd5b833561453581613d80565b95602085013595506040909401359392505050565b6000806040838503121561455d57600080fd5b823591506020830135613efa81613d80565b6000806000806000806060878903121561458857600080fd5b863567ffffffffffffffff808211156145a057600080fd5b6145ac8a838b01614005565b909850965060208901359150808211156145c557600080fd5b6145d18a838b01614005565b909650945060408901359150808211156145ea57600080fd5b506145f789828a01614005565b979a9699509497509295939492505050565b6000806040838503121561461c57600080fd5b823561462781613d80565b915061463560208401613e54565b90509250929050565b600081518084526020808501945080840160005b83811015613f6b5781516001600160a01b031687529582019590820190600101614652565b602081526000610bf8602083018461463e565b60408152600061469d604083018561463e565b82810360208401526146af8185613f3b565b95945050505050565b600080604083850312156146cb57600080fd5b8235613eea81613d80565b600080600080600060a086880312156146ee57600080fd5b85356146f981613d80565b9450602086013561470981613d80565b93506040860135925060608601359150608086013567ffffffffffffffff81111561473357600080fd5b6142d3888289016141be565b600181811c9082168061475357607f821691505b6020821081141561477457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156147ba576147ba614790565b5060010190565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff218336030181126147f557600080fd5b9190910192915050565b600081600019048311821515161561481957614819614790565b500290565b6000821982111561483157614831614790565b500190565b6000808335601e1984360301811261484d57600080fd5b83018035915067ffffffffffffffff82111561486857600080fd5b602001915036819003821315610f2157600080fd5b601f821115610b5757600081815260208120601f850160051c810160208610156148a45750805b601f850160051c820191505b818110156128b1578281556001016148b0565b67ffffffffffffffff8311156148db576148db6140e6565b6148ef836148e9835461473f565b8361487d565b6000601f841160018114614923576000851561490b5750838201355b600019600387901b1c1916600186901b178355610f08565b600083815260209020601f19861690835b828110156149545786850135825560209485019460019092019101614934565b50868210156149715760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000808335601e1984360301811261499a57600080fd5b83018035915067ffffffffffffffff8211156149b557600080fd5b6020019150600681901b3603821315610f2157600080fd5b81356149d881613d80565b6001600160a01b038116905081548173ffffffffffffffffffffffffffffffffffffffff198216178355602084013561ffff81168114614a1757600080fd5b75ffff00000000000000000000000000000000000000008160a01b16837fffffffffffffffffffff000000000000000000000000000000000000000000008416171784555050505050565b68010000000000000000831115614a7b57614a7b6140e6565b805483825580841015614ab2576000828152602081208581019083015b80821015614aae57828255600182019150614a98565b5050505b5060008181526020812083915b858110156128b157614ad183836149cd565b6040929092019160019182019101614abf565b6000813561093b816142e0565b60038210614b0f57634e487b7160e01b600052602160045260246000fd5b60ff1981541660ff831681178255505050565b813581556020820135600182015560408201356002820155606082013560038201556080820135601e19833603018112614b5b57600080fd5b8201803567ffffffffffffffff811115614b7457600080fd5b602082019150803603821315614b8957600080fd5b614b978183600486016148c3565b5050614ba660a0830183614983565b614bb4818360058601614a62565b5050610ca9614bc560c08401614ae4565b60068301614af1565b86815285602082015284604082015260a060608201528260a0820152828460c0830137600060c08483010152600060c0601f19601f86011683010190506001600160a01b0383166080830152979650505050505050565b6040808252810184905260008560608301825b87811015614c68578235614c4b81613d80565b6001600160a01b0316825260209283019290910190600101614c38565b5083810360208501528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff851115614ca157600080fd5b8460051b915081866020830137600091016020019081529695505050505050565b600082614cdf57634e487b7160e01b600052601260045260246000fd5b500490565b60408152600061469d6040830185613f3b565b6020810161093b82846144ae565b600082821015614d1757614d17614790565b500390565b60006001600160a01b03808816835280871660208401525060a06040830152614d4860a0830186613f3b565b8281036060840152614d5a8186613f3b565b90508281036080840152614d6e8185613df4565b98975050505050505050565b600060208284031215614d8c57600080fd5b8151610bf881613dc1565b600060033d1115614db05760046000803e5060005160e01c5b90565b600060443d1015614dc15790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715614e0f57505050505090565b8285019150815181811115614e275750505050505090565b843d8701016020828501011115614e415750505050505090565b614e50602082860101876140fc565b509095945050505050565b634e487b7160e01b600052603160045260246000fd5b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261450a60a0830184613df456fea2646970667358221220d1e7a9e9d591a51b70aa6e49db6680d84e81a5db4f01c9157eaa635e7ebe1f3064736f6c634300080b0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.