Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Minter For P... | 18322590 | 468 days ago | IN | 0 ETH | 0.00091791 | ||||
Set Minter For P... | 16480324 | 727 days ago | IN | 0 ETH | 0.00093299 | ||||
Set Minter For P... | 16355896 | 744 days ago | IN | 0 ETH | 0.00116946 | ||||
Set Minter For P... | 16021215 | 791 days ago | IN | 0 ETH | 0.00095271 | ||||
Set Minter For P... | 15891527 | 809 days ago | IN | 0 ETH | 0.00247679 | ||||
Set Minter For P... | 15885373 | 810 days ago | IN | 0 ETH | 0.00104976 | ||||
Set Minter For P... | 15829028 | 818 days ago | IN | 0 ETH | 0.00152651 | ||||
Add Approved Min... | 15791064 | 823 days ago | IN | 0 ETH | 0.00388236 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MinterFilterV1
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 25 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. import "../../interfaces/0.8.x/IMinterFilterV0.sol"; import "../../interfaces/0.8.x/IFilteredMinterV0.sol"; import "../../interfaces/0.8.x/IAdminACLV0.sol"; import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol"; import "@openzeppelin-4.5/contracts/utils/structs/EnumerableMap.sol"; pragma solidity 0.8.17; /** * @title Minter filter contract that allows filtered minters to be set * on a per-project basis. * This is designed to be used with IGenArt721CoreContractV3 contracts. * @author Art Blocks Inc. * @notice Privileged Roles and Ownership: * This contract is designed to be managed, with limited powers. * Privileged roles and abilities are controlled by the core contract's Admin * ACL contract and a project's artist. Both of these roles hold extensive * power and can modify a project's current minter. * Care must be taken to ensure that the admin ACL contract and artist * addresses are secure behind a multi-sig or other access control mechanism. * ---------------------------------------------------------------------------- * The following functions are restricted to the core contract's Admin ACL * contract: * - addApprovedMinters * - removeApprovedMinters * - removeMintersForProjects * ---------------------------------------------------------------------------- * The following functions are restricted to the core contract's Admin ACL * contract or a project's artist: * - setMinterForProject * - removeMinterForProject * ---------------------------------------------------------------------------- * Additional admin and artist privileged roles may be described on minters */ contract MinterFilterV1 is IMinterFilterV0 { // add Enumerable Map methods using EnumerableMap for EnumerableMap.UintToAddressMap; /// Core contract address this minter interacts with address public immutable genArt721CoreAddress; /// This contract integrates with the IV3 core contract IGenArt721CoreContractV3 private immutable genArtCoreContract; /// projectId => minter address EnumerableMap.UintToAddressMap private minterForProject; /// minter address => qty projects currently using minter mapping(address => uint256) public numProjectsUsingMinter; /// minter address => is an approved minter? mapping(address => bool) public isApprovedMinter; modifier onlyNonZeroAddress(address _address) { require(_address != address(0), "Must input non-zero address"); _; } // modifier to restrict access to only AdminACL allowed calls // @dev defers which ACL contract is used to the core contract modifier onlyCoreAdminACL(bytes4 _selector) { require(_coreAdminACLAllowed(_selector), "Only Core AdminACL allowed"); _; } // modifier to restrict access to only the artist of `_projectId`, or // AdminACL allowed calls // @dev defers which ACL contract is used to the core contract modifier onlyCoreAdminACLOrArtist(uint256 _projectId, bytes4 _selector) { require( msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId) || _coreAdminACLAllowed(_selector), "Only Core AdminACL or Artist" ); _; } modifier onlyValidProjectId(uint256 _projectId) { require( _projectId < genArtCoreContract.nextProjectId(), "Only existing projects" ); _; } modifier usingApprovedMinter(address _minterAddress) { require( isApprovedMinter[_minterAddress], "Only approved minters are allowed" ); _; } /** * @notice Initializes contract to be a Minter for `_genArt721Address`. * @param _genArt721Address Art Blocks core contract address * this contract will be a minter for. Can never be updated. */ constructor(address _genArt721Address) onlyNonZeroAddress(_genArt721Address) { genArt721CoreAddress = _genArt721Address; genArtCoreContract = IGenArt721CoreContractV3(_genArt721Address); } /** * @notice Internal function that determines if msg.sender is allowed to * call a function on this contract. Defers to core contract's * adminACLAllowed function. */ function _coreAdminACLAllowed(bytes4 _selector) internal returns (bool) { return genArtCoreContract.adminACLAllowed( msg.sender, address(this), _selector ); } /** * @notice Approves minter `_minterAddress`. * @param _minterAddress Minter to be added as an approved minter. */ function addApprovedMinter(address _minterAddress) external onlyCoreAdminACL(this.addApprovedMinter.selector) onlyNonZeroAddress(_minterAddress) { isApprovedMinter[_minterAddress] = true; emit MinterApproved( _minterAddress, IFilteredMinterV0(_minterAddress).minterType() ); } /** * @notice Removes previously approved minter `_minterAddress`. * @param _minterAddress Minter to remove. */ function removeApprovedMinter(address _minterAddress) external onlyCoreAdminACL(this.removeApprovedMinter.selector) { require(isApprovedMinter[_minterAddress], "Only approved minters"); require( numProjectsUsingMinter[_minterAddress] == 0, "Only unused minters" ); isApprovedMinter[_minterAddress] = false; emit MinterRevoked(_minterAddress); } /** * @notice Sets minter for project `_projectId` to minter * `_minterAddress`. * @param _projectId Project ID to set minter for. * @param _minterAddress Minter to be the project's minter. */ function setMinterForProject(uint256 _projectId, address _minterAddress) external onlyCoreAdminACLOrArtist(_projectId, this.setMinterForProject.selector) usingApprovedMinter(_minterAddress) onlyValidProjectId(_projectId) { // decrement number of projects using a previous minter (bool hasPreviousMinter, address previousMinter) = minterForProject .tryGet(_projectId); if (hasPreviousMinter) { numProjectsUsingMinter[previousMinter]--; } // add new minter numProjectsUsingMinter[_minterAddress]++; minterForProject.set(_projectId, _minterAddress); emit ProjectMinterRegistered( _projectId, _minterAddress, IFilteredMinterV0(_minterAddress).minterType() ); } /** * @notice Updates project `_projectId` to have no configured minter. * @param _projectId Project ID to remove minter. * @dev requires project to have an assigned minter */ function removeMinterForProject(uint256 _projectId) external onlyCoreAdminACLOrArtist( _projectId, this.removeMinterForProject.selector ) { _removeMinterForProject(_projectId); } /** * @notice Updates an array of project IDs to have no configured minter. * @param _projectIds Array of project IDs to remove minters for. * @dev requires all project IDs to have an assigned minter * @dev caution with respect to single tx gas limits */ function removeMintersForProjects(uint256[] calldata _projectIds) external onlyCoreAdminACL(this.removeMintersForProjects.selector) { uint256 numProjects = _projectIds.length; for (uint256 i; i < numProjects; i++) { _removeMinterForProject(_projectIds[i]); } } /** * @notice Updates project `_projectId` to have no configured minter * (reverts tx if project does not have an assigned minter). * @param _projectId Project ID to remove minter. */ function _removeMinterForProject(uint256 _projectId) private { // remove minter for project and emit // `minterForProject.get()` reverts tx if no minter set for project numProjectsUsingMinter[minterForProject.get(_projectId)]--; minterForProject.remove(_projectId); emit ProjectMinterRemoved(_projectId); } /** * @notice Mint a token from project `_projectId` to `_to`, originally * purchased by `sender`. * @param _to The new token's owner. * @param _projectId Project ID to mint a new token on. * @param sender Address purchasing a new token. * @return _tokenId Token ID of minted token * @dev reverts w/nonexistent key error when project has no assigned minter */ function mint( address _to, uint256 _projectId, address sender ) external returns (uint256 _tokenId) { // CHECKS // minter is the project's minter require( msg.sender == minterForProject.get(_projectId), "Only assigned minter" ); // EFFECTS uint256 tokenId = genArtCoreContract.mint_Ecf(_to, _projectId, sender); return tokenId; } /** * @notice Gets the assigned minter for project `_projectId`. * @param _projectId Project ID to query. * @return address Minter address assigned to project `_projectId` * @dev requires project to have an assigned minter */ function getMinterForProject(uint256 _projectId) external view onlyValidProjectId(_projectId) returns (address) { (bool _hasMinter, address _currentMinter) = minterForProject.tryGet( _projectId ); require(_hasMinter, "No minter assigned"); return _currentMinter; } /** * @notice Queries if project `_projectId` has an assigned minter. * @param _projectId Project ID to query. * @return bool true if project has an assigned minter, else false */ function projectHasMinter(uint256 _projectId) external view onlyValidProjectId(_projectId) returns (bool) { (bool _hasMinter, ) = minterForProject.tryGet(_projectId); return _hasMinter; } /** * @notice Gets quantity of projects that have assigned minters. * @return uint256 quantity of projects that have assigned minters */ function getNumProjectsWithMinters() external view returns (uint256) { return minterForProject.length(); } /** * @notice Get project ID and minter address at index `_index` of * enumerable map. * @param _index enumerable map index to query. * @return projectId project ID at index `_index` * @return minterAddress minter address for project at index `_index` * @return minterType minter type of minter at minterAddress * @dev index must be < quantity of projects that have assigned minters */ function getProjectAndMinterInfoAt(uint256 _index) external view returns ( uint256 projectId, address minterAddress, string memory minterType ) { (projectId, minterAddress) = minterForProject.at(_index); minterType = IFilteredMinterV0(minterAddress).minterType(); return (projectId, minterAddress, minterType); } }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; interface IMinterFilterV0 { /** * @notice Approved minter `_minterAddress`. */ event MinterApproved(address indexed _minterAddress, string _minterType); /** * @notice Revoked approval for minter `_minterAddress` */ event MinterRevoked(address indexed _minterAddress); /** * @notice Minter `_minterAddress` of type `_minterType` * registered for project `_projectId`. */ event ProjectMinterRegistered( uint256 indexed _projectId, address indexed _minterAddress, string _minterType ); /** * @notice Any active minter removed for project `_projectId`. */ event ProjectMinterRemoved(uint256 indexed _projectId); function genArt721CoreAddress() external returns (address); function setMinterForProject(uint256, address) external; function removeMinterForProject(uint256) external; function mint( address _to, uint256 _projectId, address sender ) external returns (uint256); function getMinterForProject(uint256) external view returns (address); function projectHasMinter(uint256) external view returns (bool); }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; interface IFilteredMinterV0 { /** * @notice Price per token in wei updated for project `_projectId` to * `_pricePerTokenInWei`. */ event PricePerTokenInWeiUpdated( uint256 indexed _projectId, uint256 indexed _pricePerTokenInWei ); /** * @notice Currency updated for project `_projectId` to symbol * `_currencySymbol` and address `_currencyAddress`. */ event ProjectCurrencyInfoUpdated( uint256 indexed _projectId, address indexed _currencyAddress, string _currencySymbol ); /// togglePurchaseToDisabled updated event PurchaseToDisabledUpdated( uint256 indexed _projectId, bool _purchaseToDisabled ); // getter function of public variable function minterType() external view returns (string memory); function genArt721CoreAddress() external returns (address); function minterFilterAddress() external returns (address); // Triggers a purchase of a token from the desired project, to the // TX-sending address. function purchase(uint256 _projectId) external payable returns (uint256 tokenId); // Triggers a purchase of a token from the desired project, to the specified // receiving address. function purchaseTo(address _to, uint256 _projectId) external payable returns (uint256 tokenId); // Toggles the ability for `purchaseTo` to be called directly with a // specified receiving address that differs from the TX-sending address. function togglePurchaseToDisabled(uint256 _projectId) external; // Called to make the minter contract aware of the max invocations for a // given project. function setProjectMaxInvocations(uint256 _projectId) external; // Gets if token price is configured, token price in wei, currency symbol, // and currency address, assuming this is project's minter. // Supersedes any defined core price. function getPriceInfo(uint256 _projectId) external view returns ( bool isConfigured, uint256 tokenPriceInWei, string memory currencySymbol, address currencyAddress ); }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; interface IAdminACLV0 { /** * @notice Token ID `_tokenId` minted to `_to`. * @param previousSuperAdmin The previous superAdmin address. * @param newSuperAdmin The new superAdmin address. * @param genArt721CoreAddressesToUpdate Array of genArt721Core * addresses to update to the new superAdmin, for indexing purposes only. */ event SuperAdminTransferred( address indexed previousSuperAdmin, address indexed newSuperAdmin, address[] genArt721CoreAddressesToUpdate ); /// Type of the Admin ACL contract, e.g. "AdminACLV0" function AdminACLType() external view returns (string memory); /// super admin address function superAdmin() external view returns (address); /** * @notice Calls transferOwnership on other contract from this contract. * This is useful for updating to a new AdminACL contract. * @dev this function should be gated to only superAdmin-like addresses. */ function transferOwnershipOn(address _contract, address _newAdminACL) external; /** * @notice Calls renounceOwnership on other contract from this contract. * @dev this function should be gated to only superAdmin-like addresses. */ function renounceOwnershipOn(address _contract) external; /** * @notice Checks if sender `_sender` is allowed to call function with selector * `_selector` on contract `_contract`. */ function allowed( address _sender, address _contract, bytes4 _selector ) external returns (bool); }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; import "./IAdminACLV0.sol"; /// use the Royalty Registry's IManifold interface for token royalties import "./IManifold.sol"; interface IGenArt721CoreContractV3 is IManifold { /** * @notice Token ID `_tokenId` minted to `_to`. */ event Mint(address indexed _to, uint256 indexed _tokenId); /** * @notice currentMinter updated to `_currentMinter`. * @dev Implemented starting with V3 core */ event MinterUpdated(address indexed _currentMinter); /** * @notice Platform updated on bytes32-encoded field `_field`. */ event PlatformUpdated(bytes32 indexed _field); /** * @notice Project ID `_projectId` updated on bytes32-encoded field * `_update`. */ event ProjectUpdated(uint256 indexed _projectId, bytes32 indexed _update); event ProposedArtistAddressesAndSplits( uint256 indexed _projectId, address _artistAddress, address _additionalPayeePrimarySales, uint256 _additionalPayeePrimarySalesPercentage, address _additionalPayeeSecondarySales, uint256 _additionalPayeeSecondarySalesPercentage ); event AcceptedArtistAddressesAndSplits(uint256 indexed _projectId); // version and type of the core contract // coreVersion is a string of the form "0.x.y" function coreVersion() external view returns (string memory); // coreType is a string of the form "GenArt721CoreV3" function coreType() external view returns (string memory); // owner (pre-V3 was named admin) of contract // this is expected to be an Admin ACL contract for V3 function owner() external view returns (address); // Admin ACL contract for V3, will be at the address owner() function adminACLContract() external returns (IAdminACLV0); // backwards-compatible (pre-V3) admin - equal to owner() function admin() external view returns (address); /** * Function determining if _sender is allowed to call function with * selector _selector on contract `_contract`. Intended to be used with * peripheral contracts such as minters, as well as internally by the * core contract itself. */ function adminACLAllowed( address _sender, address _contract, bytes4 _selector ) external returns (bool); // getter function of public variable function nextProjectId() external view returns (uint256); // getter function of public mapping function tokenIdToProjectId(uint256 tokenId) external view returns (uint256 projectId); // @dev this is not available in V0 function isMintWhitelisted(address minter) external view returns (bool); function projectIdToArtistAddress(uint256 _projectId) external view returns (address payable); function projectIdToAdditionalPayeePrimarySales(uint256 _projectId) external view returns (address payable); function projectIdToAdditionalPayeePrimarySalesPercentage( uint256 _projectId ) external view returns (uint256); // @dev new function in V3 function getPrimaryRevenueSplits(uint256 _projectId, uint256 _price) external view returns ( uint256 artblocksRevenue_, address payable artblocksAddress_, uint256 artistRevenue_, address payable artistAddress_, uint256 additionalPayeePrimaryRevenue_, address payable additionalPayeePrimaryAddress_ ); // @dev new function in V3 function projectStateData(uint256 _projectId) external view returns ( uint256 invocations, uint256 maxInvocations, bool active, bool paused, uint256 completedTimestamp, bool locked ); // @dev Art Blocks primary sales payment address function artblocksPrimarySalesAddress() external view returns (address payable); /** * @notice Backwards-compatible (pre-V3) function returning Art Blocks * primary sales payment address (now called artblocksPrimarySalesAddress). */ function artblocksAddress() external view returns (address payable); // @dev Percentage of primary sales allocated to Art Blocks function artblocksPrimarySalesPercentage() external view returns (uint256); /** * @notice Backwards-compatible (pre-V3) function returning Art Blocks * primary sales percentage (now called artblocksPrimarySalesPercentage). */ function artblocksPercentage() external view returns (uint256); // @dev Art Blocks secondary sales royalties payment address function artblocksSecondarySalesAddress() external view returns (address payable); // @dev Basis points of secondary sales allocated to Art Blocks function artblocksSecondarySalesBPS() external view returns (uint256); // function to set a token's hash (must be guarded) function setTokenHash_8PT(uint256 _tokenId, bytes32 _hash) external; // @dev gas-optimized signature in V3 for `mint` function mint_Ecf( address _to, uint256 _projectId, address _by ) external returns (uint256 tokenId); /** * @notice Backwards-compatible (pre-V3) function that gets artist + * artist's additional payee royalty data for token ID `_tokenId`. * WARNING: Does not include Art Blocks portion of royalties. */ function getRoyaltyData(uint256 _tokenId) external view returns ( address artistAddress, address additionalPayee, uint256 additionalPayeePercentage, uint256 royaltyFeeByID ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableMap.sol) pragma solidity ^0.8.0; import "./EnumerableSet.sol"; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { using EnumerableSet for EnumerableSet.Bytes32Set; // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct Map { // Storage of keys EnumerableSet.Bytes32Set _keys; mapping(bytes32 => bytes32) _values; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { map._values[key] = value; return map._keys.add(key); } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { delete map._values[key]; return map._keys.remove(key); } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._keys.contains(key); } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._keys.length(); } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { bytes32 key = map._keys.at(index); return (key, map._values[key]); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { bytes32 value = map._values[key]; if (value == bytes32(0)) { return (_contains(map, key), bytes32(0)); } else { return (true, value); } } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), "EnumerableMap: nonexistent key"); return value; } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { bytes32 value = map._values[key]; require(value != 0 || _contains(map, key), errorMessage); return value; } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @dev Royalty Registry interface, used to support the Royalty Registry. /// @dev Source: https://github.com/manifoldxyz/royalty-registry-solidity/blob/main/contracts/specs/IManifold.sol /// @author: manifold.xyz /** * @dev Royalty interface for creator core classes */ interface IManifold { /** * @dev Get royalites of a token. Returns list of receivers and basisPoints * * bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6 * * => 0xbb3bafd6 = 0xbb3bafd6 */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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; } }
{ "optimizer": { "enabled": true, "runs": 25 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_genArt721Address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minterAddress","type":"address"},{"indexed":false,"internalType":"string","name":"_minterType","type":"string"}],"name":"MinterApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minterAddress","type":"address"}],"name":"MinterRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_minterAddress","type":"address"},{"indexed":false,"internalType":"string","name":"_minterType","type":"string"}],"name":"ProjectMinterRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"ProjectMinterRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"addApprovedMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genArt721CoreAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"getMinterForProject","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumProjectsWithMinters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getProjectAndMinterInfoAt","outputs":[{"internalType":"uint256","name":"projectId","type":"uint256"},{"internalType":"address","name":"minterAddress","type":"address"},{"internalType":"string","name":"minterType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isApprovedMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numProjectsUsingMinter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectHasMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"removeApprovedMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"removeMinterForProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_projectIds","type":"uint256[]"}],"name":"removeMintersForProjects","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"address","name":"_minterAddress","type":"address"}],"name":"setMinterForProject","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b5060405161160138038061160183398101604081905261002f916100a1565b806001600160a01b03811661008a5760405162461bcd60e51b815260206004820152601b60248201527f4d75737420696e707574206e6f6e2d7a65726f20616464726573730000000000604482015260640160405180910390fd5b506001600160a01b0316608081905260a0526100d1565b6000602082840312156100b357600080fd5b81516001600160a01b03811681146100ca57600080fd5b9392505050565b60805160a0516114e1610120600039600081816102b4015281816103cf01528181610494015281816106d30152818161082c015281816109550152610ca00152600061013a01526114e16000f3fe608060405234801561001057600080fd5b50600436106100af5760003560e01c80630d4d1513146100b457806326df17b5146100da5780633a3d146f146100fa578063718284221461012d57806392a10f8314610135578063a409177e14610174578063b34c5c8414610189578063bcc0fdf11461019c578063bee4d106146101af578063c47d50f5146101c2578063e7300db9146101d5578063faf0d745146101f7578063ff2505f01461020a575b600080fd5b6100c76100c23660046110c9565b61021d565b6040519081526020015b60405180910390f35b6100c76100e836600461110b565b60036020526000908152604090205481565b61011d61010836600461110b565b60046020526000908152604090205460ff1681565b60405190151581526020016100d1565b6100c761032a565b61015c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100d1565b610187610182366004611128565b61033b565b005b61018761019736600461119c565b6103ae565b61015c6101aa36600461119c565b61048f565b6101876101bd36600461110b565b61058d565b61011d6101d036600461119c565b6106ce565b6101e86101e336600461119c565b610786565b6040516100d193929190611205565b61018761020536600461122f565b61080b565b61018761021836600461110b565b610b1c565b60006102298184610c52565b6001600160a01b0316336001600160a01b0316146102855760405162461bcd60e51b815260206004820152601460248201527327b7363c9030b9b9b4b3b732b21036b4b73a32b960611b60448201526064015b60405180910390fd5b604051615de560e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f000000000000000000000000000000000000000000000000000000000000000090911690615de5906064016020604051808303816000875af11580156102fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610321919061125f565b95945050505050565b60006103366000610c67565b905090565b6352048bbf60e11b61034c81610c72565b6103685760405162461bcd60e51b815260040161027c90611278565b8160005b818110156103a757610395858583818110610389576103896112ac565b90506020020135610d15565b8061039f816112d8565b91505061036c565b5050505050565b60405163a47d29cb60e01b8152600481018290528190632cd3172160e21b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044291906112f1565b6001600160a01b0316336001600160a01b03161480610465575061046581610c72565b6104815760405162461bcd60e51b815260040161027c9061130e565b61048a83610d15565b505050565b6000817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610514919061125f565b81106105325760405162461bcd60e51b815260040161027c90611344565b60008061053f8186610d8a565b91509150816105855760405162461bcd60e51b8152602060048201526012602482015271139bc81b5a5b9d195c88185cdcda59db995960721b604482015260640161027c565b949350505050565b635f72688360e11b61059e81610c72565b6105ba5760405162461bcd60e51b815260040161027c90611278565b816001600160a01b03811661060f5760405162461bcd60e51b815260206004820152601b60248201527a4d75737420696e707574206e6f6e2d7a65726f206164647265737360281b604482015260640161027c565b6001600160a01b0383166000818152600460208190526040808320805460ff191660011790558051633a747a2b60e21b815290517f1ac09d1079d96f19b763467642c3c3b4e36b56222414f4a4a50f26c7011147bb93859363e9d1e8ac938082019391908290030181865afa15801561068c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106b4919081019061138a565b6040516106c19190611436565b60405180910390a2505050565b6000817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610753919061125f565b81106107715760405162461bcd60e51b815260040161027c90611344565b600061077d8185610d8a565b50949350505050565b60008060606107958285610da8565b8093508194505050816001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610803919081019061138a565b929491935050565b60405163a47d29cb60e01b815260048101839052829063faf0d74560e01b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa15801561087b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089f91906112f1565b6001600160a01b0316336001600160a01b031614806108c257506108c281610c72565b6108de5760405162461bcd60e51b815260040161027c9061130e565b6001600160a01b038316600090815260046020526040902054839060ff166109525760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920617070726f766564206d696e746572732061726520616c6c6f77656044820152601960fa1b606482015260840161027c565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d5919061125f565b81106109f35760405162461bcd60e51b815260040161027c90611344565b600080610a008189610d8a565b915091508115610a34576001600160a01b0381166000908152600360205260408120805491610a2e83611449565b91905055505b6001600160a01b0387166000908152600360205260408120805491610a58836112d8565b90915550610a6a905060008989610db7565b50866001600160a01b0316887f21fd9bfc68d8bc4b740ebf996aa9c255d1e6bb474f81dc2ad577d5d3c5a5e1e0896001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ad5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610afd919081019061138a565b604051610b0a9190611436565b60405180910390a35050505050505050565b6001620dafa160e41b0319610b3081610c72565b610b4c5760405162461bcd60e51b815260040161027c90611278565b6001600160a01b03821660009081526004602052604090205460ff16610bac5760405162461bcd60e51b81526020600482015260156024820152744f6e6c7920617070726f766564206d696e7465727360581b604482015260640161027c565b6001600160a01b03821660009081526003602052604090205415610c085760405162461bcd60e51b81526020600482015260136024820152724f6e6c7920756e75736564206d696e7465727360681b604482015260640161027c565b6001600160a01b038216600081815260046020526040808220805460ff19169055517f44f4322f8daa225d5f4877ad0f7d3dfba248a774396f3ca99405ed40a044fe819190a25050565b6000610c5e8383610dcd565b90505b92915050565b6000610c6182610e3d565b60405163230448b160e01b81523360048201523060248201526001600160e01b0319821660448201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063230448b1906064016020604051808303816000875af1158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c619190611460565b60036000610d238184610c52565b6001600160a01b0316815260208101919091526040016000908120805491610d4a83611449565b90915550610d5b9050600082610e48565b5060405181907f15267d34078ead35bc0303f6cdd08f99b837bdfcd7fab97fca4c58f3d85d760590600090a250565b6000808080610d998686610e54565b909450925050505b9250929050565b6000808080610d998686610e8e565b600061058584846001600160a01b038516610eb9565b600081815260028301602052604081205480151580610df15750610df18484610ed6565b610c5e5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161027c565b6000610c6182610ee2565b6000610c5e8383610eec565b6000818152600283016020526040812054819080610e8357610e768585610ed6565b925060009150610da19050565b600192509050610da1565b60008080610e9c8585610f09565b600081815260029690960160205260409095205494959350505050565b600082815260028401602052604081208290556105858484610f15565b6000610c5e8383610f21565b6000610c61825490565b60008181526002830160205260408120819055610c5e8383610f39565b6000610c5e8383610f45565b6000610c5e8383610f6f565b60008181526001830160205260408120541515610c5e565b6000610c5e8383610fbe565b6000826000018281548110610f5c57610f5c6112ac565b9060005260206000200154905092915050565b6000818152600183016020526040812054610fb657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c61565b506000610c61565b600081815260018301602052604081205480156110a7576000610fe2600183611482565b8554909150600090610ff690600190611482565b905081811461105b576000866000018281548110611016576110166112ac565b9060005260206000200154905080876000018481548110611039576110396112ac565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061106c5761106c611495565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c61565b6000915050610c61565b6001600160a01b03811681146110c657600080fd5b50565b6000806000606084860312156110de57600080fd5b83356110e9816110b1565b9250602084013591506040840135611100816110b1565b809150509250925092565b60006020828403121561111d57600080fd5b8135610c5e816110b1565b6000806020838503121561113b57600080fd5b82356001600160401b038082111561115257600080fd5b818501915085601f83011261116657600080fd5b81358181111561117557600080fd5b8660208260051b850101111561118a57600080fd5b60209290920196919550909350505050565b6000602082840312156111ae57600080fd5b5035919050565b60005b838110156111d05781810151838201526020016111b8565b50506000910152565b600081518084526111f18160208601602086016111b5565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090610321908301846111d9565b6000806040838503121561124257600080fd5b823591506020830135611254816110b1565b809150509250929050565b60006020828403121561127157600080fd5b5051919050565b6020808252601a908201527913db9b1e4810dbdc994810591b5a5b9050d308185b1b1bddd95960321b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016112ea576112ea6112c2565b5060010190565b60006020828403121561130357600080fd5b8151610c5e816110b1565b6020808252601c908201527b13db9b1e4810dbdc994810591b5a5b9050d3081bdc88105c9d1a5cdd60221b604082015260600190565b6020808252601690820152754f6e6c79206578697374696e672070726f6a6563747360501b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561139c57600080fd5b81516001600160401b03808211156113b357600080fd5b818401915084601f8301126113c757600080fd5b8151818111156113d9576113d9611374565b604051601f8201601f19908116603f0116810190838211818310171561140157611401611374565b8160405282815287602084870101111561141a57600080fd5b61142b8360208301602088016111b5565b979650505050505050565b602081526000610c5e60208301846111d9565b600081611458576114586112c2565b506000190190565b60006020828403121561147257600080fd5b81518015158114610c5e57600080fd5b81810381811115610c6157610c616112c2565b634e487b7160e01b600052603160045260246000fdfea26469706673582212209dd245079755c9ef2724018828d25b025cd1e276cd2c36d0b8114dbcbd2de91764736f6c63430008110033000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100af5760003560e01c80630d4d1513146100b457806326df17b5146100da5780633a3d146f146100fa578063718284221461012d57806392a10f8314610135578063a409177e14610174578063b34c5c8414610189578063bcc0fdf11461019c578063bee4d106146101af578063c47d50f5146101c2578063e7300db9146101d5578063faf0d745146101f7578063ff2505f01461020a575b600080fd5b6100c76100c23660046110c9565b61021d565b6040519081526020015b60405180910390f35b6100c76100e836600461110b565b60036020526000908152604090205481565b61011d61010836600461110b565b60046020526000908152604090205460ff1681565b60405190151581526020016100d1565b6100c761032a565b61015c7f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a81565b6040516001600160a01b0390911681526020016100d1565b610187610182366004611128565b61033b565b005b61018761019736600461119c565b6103ae565b61015c6101aa36600461119c565b61048f565b6101876101bd36600461110b565b61058d565b61011d6101d036600461119c565b6106ce565b6101e86101e336600461119c565b610786565b6040516100d193929190611205565b61018761020536600461122f565b61080b565b61018761021836600461110b565b610b1c565b60006102298184610c52565b6001600160a01b0316336001600160a01b0316146102855760405162461bcd60e51b815260206004820152601460248201527327b7363c9030b9b9b4b3b732b21036b4b73a32b960611b60448201526064015b60405180910390fd5b604051615de560e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a90911690615de5906064016020604051808303816000875af11580156102fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610321919061125f565b95945050505050565b60006103366000610c67565b905090565b6352048bbf60e11b61034c81610c72565b6103685760405162461bcd60e51b815260040161027c90611278565b8160005b818110156103a757610395858583818110610389576103896112ac565b90506020020135610d15565b8061039f816112d8565b91505061036c565b5050505050565b60405163a47d29cb60e01b8152600481018290528190632cd3172160e21b907f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b03169063a47d29cb90602401602060405180830381865afa15801561041e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061044291906112f1565b6001600160a01b0316336001600160a01b03161480610465575061046581610c72565b6104815760405162461bcd60e51b815260040161027c9061130e565b61048a83610d15565b505050565b6000817f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610514919061125f565b81106105325760405162461bcd60e51b815260040161027c90611344565b60008061053f8186610d8a565b91509150816105855760405162461bcd60e51b8152602060048201526012602482015271139bc81b5a5b9d195c88185cdcda59db995960721b604482015260640161027c565b949350505050565b635f72688360e11b61059e81610c72565b6105ba5760405162461bcd60e51b815260040161027c90611278565b816001600160a01b03811661060f5760405162461bcd60e51b815260206004820152601b60248201527a4d75737420696e707574206e6f6e2d7a65726f206164647265737360281b604482015260640161027c565b6001600160a01b0383166000818152600460208190526040808320805460ff191660011790558051633a747a2b60e21b815290517f1ac09d1079d96f19b763467642c3c3b4e36b56222414f4a4a50f26c7011147bb93859363e9d1e8ac938082019391908290030181865afa15801561068c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526106b4919081019061138a565b6040516106c19190611436565b60405180910390a2505050565b6000817f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561072f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610753919061125f565b81106107715760405162461bcd60e51b815260040161027c90611344565b600061077d8185610d8a565b50949350505050565b60008060606107958285610da8565b8093508194505050816001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b8152600401600060405180830381865afa1580156107db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610803919081019061138a565b929491935050565b60405163a47d29cb60e01b815260048101839052829063faf0d74560e01b907f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b03169063a47d29cb90602401602060405180830381865afa15801561087b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089f91906112f1565b6001600160a01b0316336001600160a01b031614806108c257506108c281610c72565b6108de5760405162461bcd60e51b815260040161027c9061130e565b6001600160a01b038316600090815260046020526040902054839060ff166109525760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920617070726f766564206d696e746572732061726520616c6c6f77656044820152601960fa1b606482015260840161027c565b847f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d5919061125f565b81106109f35760405162461bcd60e51b815260040161027c90611344565b600080610a008189610d8a565b915091508115610a34576001600160a01b0381166000908152600360205260408120805491610a2e83611449565b91905055505b6001600160a01b0387166000908152600360205260408120805491610a58836112d8565b90915550610a6a905060008989610db7565b50866001600160a01b0316887f21fd9bfc68d8bc4b740ebf996aa9c255d1e6bb474f81dc2ad577d5d3c5a5e1e0896001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610ad5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610afd919081019061138a565b604051610b0a9190611436565b60405180910390a35050505050505050565b6001620dafa160e41b0319610b3081610c72565b610b4c5760405162461bcd60e51b815260040161027c90611278565b6001600160a01b03821660009081526004602052604090205460ff16610bac5760405162461bcd60e51b81526020600482015260156024820152744f6e6c7920617070726f766564206d696e7465727360581b604482015260640161027c565b6001600160a01b03821660009081526003602052604090205415610c085760405162461bcd60e51b81526020600482015260136024820152724f6e6c7920756e75736564206d696e7465727360681b604482015260640161027c565b6001600160a01b038216600081815260046020526040808220805460ff19169055517f44f4322f8daa225d5f4877ad0f7d3dfba248a774396f3ca99405ed40a044fe819190a25050565b6000610c5e8383610dcd565b90505b92915050565b6000610c6182610e3d565b60405163230448b160e01b81523360048201523060248201526001600160e01b0319821660448201526000907f000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a6001600160a01b03169063230448b1906064016020604051808303816000875af1158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c619190611460565b60036000610d238184610c52565b6001600160a01b0316815260208101919091526040016000908120805491610d4a83611449565b90915550610d5b9050600082610e48565b5060405181907f15267d34078ead35bc0303f6cdd08f99b837bdfcd7fab97fca4c58f3d85d760590600090a250565b6000808080610d998686610e54565b909450925050505b9250929050565b6000808080610d998686610e8e565b600061058584846001600160a01b038516610eb9565b600081815260028301602052604081205480151580610df15750610df18484610ed6565b610c5e5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161027c565b6000610c6182610ee2565b6000610c5e8383610eec565b6000818152600283016020526040812054819080610e8357610e768585610ed6565b925060009150610da19050565b600192509050610da1565b60008080610e9c8585610f09565b600081815260029690960160205260409095205494959350505050565b600082815260028401602052604081208290556105858484610f15565b6000610c5e8383610f21565b6000610c61825490565b60008181526002830160205260408120819055610c5e8383610f39565b6000610c5e8383610f45565b6000610c5e8383610f6f565b60008181526001830160205260408120541515610c5e565b6000610c5e8383610fbe565b6000826000018281548110610f5c57610f5c6112ac565b9060005260206000200154905092915050565b6000818152600183016020526040812054610fb657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c61565b506000610c61565b600081815260018301602052604081205480156110a7576000610fe2600183611482565b8554909150600090610ff690600190611482565b905081811461105b576000866000018281548110611016576110166112ac565b9060005260206000200154905080876000018481548110611039576110396112ac565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061106c5761106c611495565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c61565b6000915050610c61565b6001600160a01b03811681146110c657600080fd5b50565b6000806000606084860312156110de57600080fd5b83356110e9816110b1565b9250602084013591506040840135611100816110b1565b809150509250925092565b60006020828403121561111d57600080fd5b8135610c5e816110b1565b6000806020838503121561113b57600080fd5b82356001600160401b038082111561115257600080fd5b818501915085601f83011261116657600080fd5b81358181111561117557600080fd5b8660208260051b850101111561118a57600080fd5b60209290920196919550909350505050565b6000602082840312156111ae57600080fd5b5035919050565b60005b838110156111d05781810151838201526020016111b8565b50506000910152565b600081518084526111f18160208601602086016111b5565b601f01601f19169290920160200192915050565b8381526001600160a01b0383166020820152606060408201819052600090610321908301846111d9565b6000806040838503121561124257600080fd5b823591506020830135611254816110b1565b809150509250929050565b60006020828403121561127157600080fd5b5051919050565b6020808252601a908201527913db9b1e4810dbdc994810591b5a5b9050d308185b1b1bddd95960321b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016112ea576112ea6112c2565b5060010190565b60006020828403121561130357600080fd5b8151610c5e816110b1565b6020808252601c908201527b13db9b1e4810dbdc994810591b5a5b9050d3081bdc88105c9d1a5cdd60221b604082015260600190565b6020808252601690820152754f6e6c79206578697374696e672070726f6a6563747360501b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561139c57600080fd5b81516001600160401b03808211156113b357600080fd5b818401915084601f8301126113c757600080fd5b8151818111156113d9576113d9611374565b604051601f8201601f19908116603f0116810190838211818310171561140157611401611374565b8160405282815287602084870101111561141a57600080fd5b61142b8360208301602088016111b5565b979650505050505050565b602081526000610c5e60208301846111d9565b600081611458576114586112c2565b506000190190565b60006020828403121561147257600080fd5b81518015158114610c5e57600080fd5b81810381811115610c6157610c616112c2565b634e487b7160e01b600052603160045260246000fdfea26469706673582212209dd245079755c9ef2724018828d25b025cd1e276cd2c36d0b8114dbcbd2de91764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a
-----Decoded View---------------
Arg [0] : _genArt721Address (address): 0x942BC2d3e7a589FE5bd4A5C6eF9727DFd82F5C8a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000942bc2d3e7a589fe5bd4a5c6ef9727dfd82f5c8a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.