Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 227 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Minter For P... | 19141616 | 356 days ago | IN | 0 ETH | 0.00164913 | ||||
Set Minter For P... | 19139477 | 356 days ago | IN | 0 ETH | 0.00138752 | ||||
Set Minter For P... | 18163834 | 493 days ago | IN | 0 ETH | 0.00265122 | ||||
Set Minter For P... | 15877440 | 814 days ago | IN | 0 ETH | 0.00152041 | ||||
Set Minter For P... | 15748272 | 832 days ago | IN | 0 ETH | 0.0010758 | ||||
Set Minter For P... | 15739491 | 833 days ago | IN | 0 ETH | 0.00120002 | ||||
Set Minter For P... | 15697749 | 839 days ago | IN | 0 ETH | 0.00179427 | ||||
Set Minter For P... | 15688679 | 840 days ago | IN | 0 ETH | 0.0003943 | ||||
Set Minter For P... | 15626750 | 849 days ago | IN | 0 ETH | 0.00074239 | ||||
Set Minter For P... | 15626728 | 849 days ago | IN | 0 ETH | 0.00087626 | ||||
Set Minter For P... | 15626682 | 849 days ago | IN | 0 ETH | 0.0010604 | ||||
Set Minter For P... | 15626213 | 849 days ago | IN | 0 ETH | 0.00137726 | ||||
Set Minter For P... | 15626193 | 849 days ago | IN | 0 ETH | 0.00177664 | ||||
Set Minter For P... | 15599353 | 853 days ago | IN | 0 ETH | 0.00038441 | ||||
Set Minter For P... | 15571743 | 856 days ago | IN | 0 ETH | 0.00063573 | ||||
Set Minter For P... | 15569199 | 857 days ago | IN | 0 ETH | 0.00086181 | ||||
Set Minter For P... | 15568304 | 857 days ago | IN | 0 ETH | 0.00081225 | ||||
Set Minter For P... | 15545876 | 860 days ago | IN | 0 ETH | 0.00080922 | ||||
Set Minter For P... | 15540768 | 861 days ago | IN | 0 ETH | 0.0015268 | ||||
Set Minter For P... | 15538598 | 861 days ago | IN | 0 ETH | 0.00117632 | ||||
Set Minter For P... | 15538230 | 861 days ago | IN | 0 ETH | 0.00148489 | ||||
Set Minter For P... | 15535718 | 862 days ago | IN | 0 ETH | 0.00122291 | ||||
Set Minter For P... | 15530215 | 862 days ago | IN | 0 ETH | 0.00037656 | ||||
Set Minter For P... | 15529272 | 863 days ago | IN | 0 ETH | 0.00202453 | ||||
Set Minter For P... | 15522997 | 864 days ago | IN | 0 ETH | 0.00429031 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MinterFilterV0
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 100 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/IGenArt721CoreContractV1.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; pragma solidity 0.8.9; /** * @title Minter filter contract that allows filtered minters to be set * on a per-project basis. * @author Art Blocks Inc. */ contract MinterFilterV0 is IMinterFilterV0 { /** * @notice This minter is to be considered `_coreContractAddress`'s * canonical minter. * @dev may be vestigial after migrating to V3 core contracts */ event IsCanonicalMinterFilter(address indexed _coreContractAddress); // add Enumerable Map methods using EnumerableMap for EnumerableMap.UintToAddressMap; /// Core contract address this minter interacts with address public immutable genArt721CoreAddress; /// This contract only uses the portion of V3 interface also on V1 core IGenArt721CoreContractV1 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 onlyCoreWhitelisted() { require( genArtCoreContract.isWhitelisted(msg.sender), "Only Core whitelisted" ); _; } modifier onlyCoreWhitelistedOrArtist(uint256 _projectId) { require( (genArtCoreContract.isWhitelisted(msg.sender) || msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId)), "Only Core whitelisted or Artist" ); _; } modifier projectExists(uint256 _projectId) { require( _projectId < genArtCoreContract.nextProjectId(), "Only existing projects" ); _; } modifier usingApprovedMinter(address _minterAddress) { require( isApprovedMinter[_minterAddress], "Only approved minters are allowed" ); _; } modifier onlyMintWhitelisted() { require( genArtCoreContract.isMintWhitelisted(address(this)), "Only mint allowlisted" ); _; } /** * @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) { genArt721CoreAddress = _genArt721Address; genArtCoreContract = IGenArt721CoreContractV1(_genArt721Address); } /** * @notice Emits event notifying indexers that this is core contract's * canonical minter filter. * @dev may be vestigial after migrating to V3 core contracts */ function alertAsCanonicalMinterFilter() external onlyCoreWhitelisted onlyMintWhitelisted { emit IsCanonicalMinterFilter(genArt721CoreAddress); } /** * @notice Approves minter `_minterAddress`. * @param _minterAddress Minter to be added as an approved minter. */ function addApprovedMinter(address _minterAddress) external onlyCoreWhitelisted { 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 onlyCoreWhitelisted { 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 onlyCoreWhitelistedOrArtist(_projectId) usingApprovedMinter(_minterAddress) projectExists(_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 onlyCoreWhitelistedOrArtist(_projectId) { _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 onlyCoreWhitelisted { 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(_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 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 * @dev requires project to have an assigned minter */ function projectHasMinter(uint256 _projectId) external view 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 IGenArt721CoreContractV1 { event Mint( address indexed _to, uint256 indexed _tokenId, uint256 indexed _projectId ); // getter function of public variable function admin() external view returns (address); // 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); function isWhitelisted(address sender) external view returns (bool); // @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 projectIdToAdditionalPayee(uint256 _projectId) external view returns (address payable); function projectIdToAdditionalPayeePercentage(uint256 _projectId) external view returns (uint256); function projectTokenInfo(uint256 _projectId) external view returns ( address, uint256, uint256, uint256, bool, address, uint256, string memory, address ); function artblocksAddress() external view returns (address payable); function artblocksPercentage() external view returns (uint256); function mint( address _to, uint256 _projectId, address _by ) external returns (uint256 tokenId); 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 // 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": 100 }, "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":"_coreContractAddress","type":"address"}],"name":"IsCanonicalMinterFilter","type":"event"},{"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":"alertAsCanonicalMinterFilter","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
60c060405234801561001057600080fd5b5060405161186c38038061186c83398101604081905261002f91610045565b6001600160a01b0316608081905260a052610075565b60006020828403121561005757600080fd5b81516001600160a01b038116811461006e57600080fd5b9392505050565b60805160a0516117856100e7600039600081816102ce0152818161037d015281816104350152818161056b0152818161066a0152818161070b0152818161083d01528181610a6c01528181610b0d01528181610c370152610e5b015260008181610155015261050b01526117856000f3fe608060405234801561001057600080fd5b50600436106100ca5760003560e01c8063b34c5c841161007c578063b34c5c84146101a1578063bcc0fdf1146101b4578063bee4d106146101c7578063c47d50f5146101da578063e7300db9146101ed578063faf0d7451461020f578063ff2505f01461022257600080fd5b80630d4d1513146100cf57806326df17b5146100f55780633a3d146f14610115578063718284221461014857806392a10f831461015057806393cb6ef014610184578063a409177e1461018e575b600080fd5b6100e26100dd36600461137d565b610235565b6040519081526020015b60405180910390f35b6100e26101033660046113bf565b60036020526000908152604090205481565b6101386101233660046113bf565b60046020526000908152604090205460ff1681565b60405190151581526020016100ec565b6100e2610355565b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6040516100ec91906113dc565b61018c610366565b005b61018c61019c3660046113f0565b610554565b61018c6101af366004611465565b610651565b6101776101c2366004611465565b6107cb565b61018c6101d53660046113bf565b610826565b6101386101e8366004611465565b6109aa565b6102006101fb366004611465565b6109bf565b6040516100ec939291906114d6565b61018c61021d366004611500565b610a53565b61018c6102303660046113bf565b610e44565b60006102418184610fa1565b6001600160a01b0316336001600160a01b03161461029d5760405162461bcd60e51b815260206004820152601460248201527327b7363c9030b9b9b4b3b732b21036b4b73a32b960611b60448201526064015b60405180910390fd5b604051630d4d151360e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f000000000000000000000000000000000000000000000000000000000000000090911690630d4d151390606401602060405180830381600087803b15801561031457600080fd5b505af1158015610328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034c9190611530565b95945050505050565b60006103616000610fb6565b905090565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf906103b29033906004016113dc565b60206040518083038186803b1580156103ca57600080fd5b505afa1580156103de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104029190611549565b61041e5760405162461bcd60e51b81526004016102949061156b565b60405163568182e760e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ad0305ce9061046a9030906004016113dc565b60206040518083038186803b15801561048257600080fd5b505afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba9190611549565b6104fe5760405162461bcd60e51b815260206004820152601560248201527413db9b1e481b5a5b9d08185b1b1bdddb1a5cdd1959605a1b6044820152606401610294565b6040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016907f93962c490513b829a454280256dc873e04e932b196e23a5d5099b88a2a1cab0190600090a2565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf906105a09033906004016113dc565b60206040518083038186803b1580156105b857600080fd5b505afa1580156105cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f09190611549565b61060c5760405162461bcd60e51b81526004016102949061156b565b8060005b8181101561064b5761063984848381811061062d5761062d61159a565b90506020020135610fc1565b80610643816115c6565b915050610610565b50505050565b604051633af32abf60e01b815281906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf9061069f9033906004016113dc565b60206040518083038186803b1580156106b757600080fd5b505afa1580156106cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ef9190611549565b806107a2575060405163a47d29cb60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb9060240160206040518083038186803b15801561075557600080fd5b505afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d91906115e1565b6001600160a01b0316336001600160a01b0316145b6107be5760405162461bcd60e51b8152600401610294906115fe565b6107c782610fc1565b5050565b600080806107d98185611036565b915091508161081f5760405162461bcd60e51b8152602060048201526012602482015271139bc81b5a5b9d195c88185cdcda59db995960721b6044820152606401610294565b9392505050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf906108729033906004016113dc565b60206040518083038186803b15801561088a57600080fd5b505afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190611549565b6108de5760405162461bcd60e51b81526004016102949061156b565b6001600160a01b0381166000818152600460208190526040808320805460ff191660011790558051633a747a2b60e21b815290517f1ac09d1079d96f19b763467642c3c3b4e36b56222414f4a4a50f26c7011147bb93859363e9d1e8ac93808201939190829003018186803b15801561095657600080fd5b505afa15801561096a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610992919081019061164b565b60405161099f91906116f8565b60405180910390a250565b6000806109b78184611036565b509392505050565b60008060606109ce8285611054565b8093508194505050816001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b815260040160006040518083038186803b158015610a0f57600080fd5b505afa158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a4b919081019061164b565b929491935050565b604051633af32abf60e01b815282906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf90610aa19033906004016113dc565b60206040518083038186803b158015610ab957600080fd5b505afa158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af19190611549565b80610ba4575060405163a47d29cb60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb9060240160206040518083038186803b158015610b5757600080fd5b505afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906115e1565b6001600160a01b0316336001600160a01b0316145b610bc05760405162461bcd60e51b8152600401610294906115fe565b6001600160a01b038216600090815260046020526040902054829060ff16610c345760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920617070726f766564206d696e746572732061726520616c6c6f77656044820152601960fa1b6064820152608401610294565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e935b7b16040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8e57600080fd5b505afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190611530565b8110610d0d5760405162461bcd60e51b81526020600482015260166024820152754f6e6c79206578697374696e672070726f6a6563747360501b6044820152606401610294565b600080610d1a8188611036565b915091508115610d4e576001600160a01b0381166000908152600360205260408120805491610d488361170b565b91905055505b6001600160a01b0386166000908152600360205260408120805491610d72836115c6565b90915550610d84905060008888611063565b50856001600160a01b0316877f21fd9bfc68d8bc4b740ebf996aa9c255d1e6bb474f81dc2ad577d5d3c5a5e1e0886001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b815260040160006040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e26919081019061164b565b604051610e3391906116f8565b60405180910390a350505050505050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf90610e909033906004016113dc565b60206040518083038186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190611549565b610efc5760405162461bcd60e51b81526004016102949061156b565b6001600160a01b03811660009081526003602052604090205415610f585760405162461bcd60e51b81526020600482015260136024820152724f6e6c7920756e75736564206d696e7465727360681b6044820152606401610294565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f44f4322f8daa225d5f4877ad0f7d3dfba248a774396f3ca99405ed40a044fe819190a250565b6000610fad8383611081565b90505b92915050565b6000610fb0826110f1565b60036000610fcf8184610fa1565b6001600160a01b0316815260208101919091526040016000908120805491610ff68361170b565b9091555061100790506000826110fc565b5060405181907f15267d34078ead35bc0303f6cdd08f99b837bdfcd7fab97fca4c58f3d85d760590600090a250565b60008080806110458686611108565b909450925050505b9250929050565b60008080806110458686611142565b600061107984846001600160a01b03851661116d565b949350505050565b6000818152600283016020526040812054801515806110a557506110a5848461118a565b610fad5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610294565b6000610fb082611196565b6000610fad83836111a0565b60008181526002830160205260408120548190806111375761112a858561118a565b92506000915061104d9050565b60019250905061104d565b6000808061115085856111bd565b600081815260029690960160205260409095205494959350505050565b6000828152600284016020526040812082905561107984846111c9565b6000610fad83836111d5565b6000610fb0825490565b60008181526002830160205260408120819055610fad83836111ed565b6000610fad83836111f9565b6000610fad8383611223565b60008181526001830160205260408120541515610fad565b6000610fad8383611272565b60008260000182815481106112105761121061159a565b9060005260206000200154905092915050565b600081815260018301602052604081205461126a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610fb0565b506000610fb0565b6000818152600183016020526040812054801561135b576000611296600183611722565b85549091506000906112aa90600190611722565b905081811461130f5760008660000182815481106112ca576112ca61159a565b90600052602060002001549050808760000184815481106112ed576112ed61159a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061132057611320611739565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610fb0565b6000915050610fb0565b6001600160a01b038116811461137a57600080fd5b50565b60008060006060848603121561139257600080fd5b833561139d81611365565b92506020840135915060408401356113b481611365565b809150509250925092565b6000602082840312156113d157600080fd5b8135610fad81611365565b6001600160a01b0391909116815260200190565b6000806020838503121561140357600080fd5b823567ffffffffffffffff8082111561141b57600080fd5b818501915085601f83011261142f57600080fd5b81358181111561143e57600080fd5b8660208260051b850101111561145357600080fd5b60209290920196919550909350505050565b60006020828403121561147757600080fd5b5035919050565b60005b83811015611499578181015183820152602001611481565b8381111561064b5750506000910152565b600081518084526114c281602086016020860161147e565b601f01601f19169290920160200192915050565b8381526001600160a01b038316602082015260606040820181905260009061034c908301846114aa565b6000806040838503121561151357600080fd5b82359150602083013561152581611365565b809150509250929050565b60006020828403121561154257600080fd5b5051919050565b60006020828403121561155b57600080fd5b81518015158114610fad57600080fd5b60208082526015908201527413db9b1e4810dbdc99481dda1a5d195b1a5cdd1959605a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156115da576115da6115b0565b5060010190565b6000602082840312156115f357600080fd5b8151610fad81611365565b6020808252601f908201527f4f6e6c7920436f72652077686974656c6973746564206f722041727469737400604082015260600190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561165d57600080fd5b815167ffffffffffffffff8082111561167557600080fd5b818401915084601f83011261168957600080fd5b81518181111561169b5761169b611635565b604051601f8201601f19908116603f011681019083821181831017156116c3576116c3611635565b816040528281528760208487010111156116dc57600080fd5b6116ed83602083016020880161147e565b979650505050505050565b602081526000610fad60208301846114aa565b60008161171a5761171a6115b0565b506000190190565b600082821015611734576117346115b0565b500390565b634e487b7160e01b600052603160045260246000fdfea264697066735822122093a51c0445e7a9fb546366c1e7dc4278941d9d9166ad688fd5c3bd74d202a83464736f6c63430008090033000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ca5760003560e01c8063b34c5c841161007c578063b34c5c84146101a1578063bcc0fdf1146101b4578063bee4d106146101c7578063c47d50f5146101da578063e7300db9146101ed578063faf0d7451461020f578063ff2505f01461022257600080fd5b80630d4d1513146100cf57806326df17b5146100f55780633a3d146f14610115578063718284221461014857806392a10f831461015057806393cb6ef014610184578063a409177e1461018e575b600080fd5b6100e26100dd36600461137d565b610235565b6040519081526020015b60405180910390f35b6100e26101033660046113bf565b60036020526000908152604090205481565b6101386101233660046113bf565b60046020526000908152604090205460ff1681565b60405190151581526020016100ec565b6100e2610355565b6101777f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd27081565b6040516100ec91906113dc565b61018c610366565b005b61018c61019c3660046113f0565b610554565b61018c6101af366004611465565b610651565b6101776101c2366004611465565b6107cb565b61018c6101d53660046113bf565b610826565b6101386101e8366004611465565b6109aa565b6102006101fb366004611465565b6109bf565b6040516100ec939291906114d6565b61018c61021d366004611500565b610a53565b61018c6102303660046113bf565b610e44565b60006102418184610fa1565b6001600160a01b0316336001600160a01b03161461029d5760405162461bcd60e51b815260206004820152601460248201527327b7363c9030b9b9b4b3b732b21036b4b73a32b960611b60448201526064015b60405180910390fd5b604051630d4d151360e01b81526001600160a01b0385811660048301526024820185905283811660448301526000917f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd27090911690630d4d151390606401602060405180830381600087803b15801561031457600080fd5b505af1158015610328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061034c9190611530565b95945050505050565b60006103616000610fb6565b905090565b604051633af32abf60e01b81526001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2701690633af32abf906103b29033906004016113dc565b60206040518083038186803b1580156103ca57600080fd5b505afa1580156103de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104029190611549565b61041e5760405162461bcd60e51b81526004016102949061156b565b60405163568182e760e11b81526001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270169063ad0305ce9061046a9030906004016113dc565b60206040518083038186803b15801561048257600080fd5b505afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba9190611549565b6104fe5760405162461bcd60e51b815260206004820152601560248201527413db9b1e481b5a5b9d08185b1b1bdddb1a5cdd1959605a1b6044820152606401610294565b6040516001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd27016907f93962c490513b829a454280256dc873e04e932b196e23a5d5099b88a2a1cab0190600090a2565b604051633af32abf60e01b81526001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2701690633af32abf906105a09033906004016113dc565b60206040518083038186803b1580156105b857600080fd5b505afa1580156105cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f09190611549565b61060c5760405162461bcd60e51b81526004016102949061156b565b8060005b8181101561064b5761063984848381811061062d5761062d61159a565b90506020020135610fc1565b80610643816115c6565b915050610610565b50505050565b604051633af32abf60e01b815281906001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2701690633af32abf9061069f9033906004016113dc565b60206040518083038186803b1580156106b757600080fd5b505afa1580156106cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ef9190611549565b806107a2575060405163a47d29cb60e01b8152600481018290527f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2706001600160a01b03169063a47d29cb9060240160206040518083038186803b15801561075557600080fd5b505afa158015610769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061078d91906115e1565b6001600160a01b0316336001600160a01b0316145b6107be5760405162461bcd60e51b8152600401610294906115fe565b6107c782610fc1565b5050565b600080806107d98185611036565b915091508161081f5760405162461bcd60e51b8152602060048201526012602482015271139bc81b5a5b9d195c88185cdcda59db995960721b6044820152606401610294565b9392505050565b604051633af32abf60e01b81526001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2701690633af32abf906108729033906004016113dc565b60206040518083038186803b15801561088a57600080fd5b505afa15801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190611549565b6108de5760405162461bcd60e51b81526004016102949061156b565b6001600160a01b0381166000818152600460208190526040808320805460ff191660011790558051633a747a2b60e21b815290517f1ac09d1079d96f19b763467642c3c3b4e36b56222414f4a4a50f26c7011147bb93859363e9d1e8ac93808201939190829003018186803b15801561095657600080fd5b505afa15801561096a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610992919081019061164b565b60405161099f91906116f8565b60405180910390a250565b6000806109b78184611036565b509392505050565b60008060606109ce8285611054565b8093508194505050816001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b815260040160006040518083038186803b158015610a0f57600080fd5b505afa158015610a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a4b919081019061164b565b929491935050565b604051633af32abf60e01b815282906001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2701690633af32abf90610aa19033906004016113dc565b60206040518083038186803b158015610ab957600080fd5b505afa158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af19190611549565b80610ba4575060405163a47d29cb60e01b8152600481018290527f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2706001600160a01b03169063a47d29cb9060240160206040518083038186803b158015610b5757600080fd5b505afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906115e1565b6001600160a01b0316336001600160a01b0316145b610bc05760405162461bcd60e51b8152600401610294906115fe565b6001600160a01b038216600090815260046020526040902054829060ff16610c345760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920617070726f766564206d696e746572732061726520616c6c6f77656044820152601960fa1b6064820152608401610294565b837f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2706001600160a01b031663e935b7b16040518163ffffffff1660e01b815260040160206040518083038186803b158015610c8e57600080fd5b505afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc69190611530565b8110610d0d5760405162461bcd60e51b81526020600482015260166024820152754f6e6c79206578697374696e672070726f6a6563747360501b6044820152606401610294565b600080610d1a8188611036565b915091508115610d4e576001600160a01b0381166000908152600360205260408120805491610d488361170b565b91905055505b6001600160a01b0386166000908152600360205260408120805491610d72836115c6565b90915550610d84905060008888611063565b50856001600160a01b0316877f21fd9bfc68d8bc4b740ebf996aa9c255d1e6bb474f81dc2ad577d5d3c5a5e1e0886001600160a01b031663e9d1e8ac6040518163ffffffff1660e01b815260040160006040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e26919081019061164b565b604051610e3391906116f8565b60405180910390a350505050505050565b604051633af32abf60e01b81526001600160a01b037f000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd2701690633af32abf90610e909033906004016113dc565b60206040518083038186803b158015610ea857600080fd5b505afa158015610ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee09190611549565b610efc5760405162461bcd60e51b81526004016102949061156b565b6001600160a01b03811660009081526003602052604090205415610f585760405162461bcd60e51b81526020600482015260136024820152724f6e6c7920756e75736564206d696e7465727360681b6044820152606401610294565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f44f4322f8daa225d5f4877ad0f7d3dfba248a774396f3ca99405ed40a044fe819190a250565b6000610fad8383611081565b90505b92915050565b6000610fb0826110f1565b60036000610fcf8184610fa1565b6001600160a01b0316815260208101919091526040016000908120805491610ff68361170b565b9091555061100790506000826110fc565b5060405181907f15267d34078ead35bc0303f6cdd08f99b837bdfcd7fab97fca4c58f3d85d760590600090a250565b60008080806110458686611108565b909450925050505b9250929050565b60008080806110458686611142565b600061107984846001600160a01b03851661116d565b949350505050565b6000818152600283016020526040812054801515806110a557506110a5848461118a565b610fad5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610294565b6000610fb082611196565b6000610fad83836111a0565b60008181526002830160205260408120548190806111375761112a858561118a565b92506000915061104d9050565b60019250905061104d565b6000808061115085856111bd565b600081815260029690960160205260409095205494959350505050565b6000828152600284016020526040812082905561107984846111c9565b6000610fad83836111d5565b6000610fb0825490565b60008181526002830160205260408120819055610fad83836111ed565b6000610fad83836111f9565b6000610fad8383611223565b60008181526001830160205260408120541515610fad565b6000610fad8383611272565b60008260000182815481106112105761121061159a565b9060005260206000200154905092915050565b600081815260018301602052604081205461126a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610fb0565b506000610fb0565b6000818152600183016020526040812054801561135b576000611296600183611722565b85549091506000906112aa90600190611722565b905081811461130f5760008660000182815481106112ca576112ca61159a565b90600052602060002001549050808760000184815481106112ed576112ed61159a565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061132057611320611739565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610fb0565b6000915050610fb0565b6001600160a01b038116811461137a57600080fd5b50565b60008060006060848603121561139257600080fd5b833561139d81611365565b92506020840135915060408401356113b481611365565b809150509250925092565b6000602082840312156113d157600080fd5b8135610fad81611365565b6001600160a01b0391909116815260200190565b6000806020838503121561140357600080fd5b823567ffffffffffffffff8082111561141b57600080fd5b818501915085601f83011261142f57600080fd5b81358181111561143e57600080fd5b8660208260051b850101111561145357600080fd5b60209290920196919550909350505050565b60006020828403121561147757600080fd5b5035919050565b60005b83811015611499578181015183820152602001611481565b8381111561064b5750506000910152565b600081518084526114c281602086016020860161147e565b601f01601f19169290920160200192915050565b8381526001600160a01b038316602082015260606040820181905260009061034c908301846114aa565b6000806040838503121561151357600080fd5b82359150602083013561152581611365565b809150509250929050565b60006020828403121561154257600080fd5b5051919050565b60006020828403121561155b57600080fd5b81518015158114610fad57600080fd5b60208082526015908201527413db9b1e4810dbdc99481dda1a5d195b1a5cdd1959605a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156115da576115da6115b0565b5060010190565b6000602082840312156115f357600080fd5b8151610fad81611365565b6020808252601f908201527f4f6e6c7920436f72652077686974656c6973746564206f722041727469737400604082015260600190565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561165d57600080fd5b815167ffffffffffffffff8082111561167557600080fd5b818401915084601f83011261168957600080fd5b81518181111561169b5761169b611635565b604051601f8201601f19908116603f011681019083821181831017156116c3576116c3611635565b816040528281528760208487010111156116dc57600080fd5b6116ed83602083016020880161147e565b979650505050505050565b602081526000610fad60208301846114aa565b60008161171a5761171a6115b0565b506000190190565b600082821015611734576117346115b0565b500390565b634e487b7160e01b600052603160045260246000fdfea264697066735822122093a51c0445e7a9fb546366c1e7dc4278941d9d9166ad688fd5c3bd74d202a83464736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270
-----Decoded View---------------
Arg [0] : _genArt721Address (address): 0xa7d8d9ef8D8Ce8992Df33D8b8CF4Aebabd5bD270
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a7d8d9ef8d8ce8992df33d8b8cf4aebabd5bd270
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.