Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,321 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase | 17950146 | 461 days ago | IN | 0.231 ETH | 0.00114642 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.00068356 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.0006894 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.0006894 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.0006894 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00073897 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00073897 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.00103056 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00111803 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.00132215 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.0019928 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.0019928 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.0019928 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.24083333 ETH | 0.00233272 | ||||
Purchase | 17950145 | 461 days ago | IN | 0.25083333 ETH | 0.0029159 | ||||
Purchase | 17950144 | 461 days ago | IN | 0.25083333 ETH | 0.00061416 | ||||
Purchase | 17950144 | 461 days ago | IN | 0.25083333 ETH | 0.00061416 | ||||
Purchase | 17950144 | 461 days ago | IN | 0.25083333 ETH | 0.00061416 | ||||
Purchase | 17950144 | 461 days ago | IN | 0.25083333 ETH | 0.00061416 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17950144 | 461 days ago | 0.062325 ETH | ||||
17950144 | 461 days ago | 0.145425 ETH | ||||
17950144 | 461 days ago | 0.02308333 ETH | ||||
17950144 | 461 days ago | 0.02 ETH | ||||
17950144 | 461 days ago | 0.062325 ETH | ||||
17950144 | 461 days ago | 0.145425 ETH | ||||
17950144 | 461 days ago | 0.02308333 ETH | ||||
17950144 | 461 days ago | 0.03 ETH | ||||
17950144 | 461 days ago | 0.062325 ETH | ||||
17950144 | 461 days ago | 0.145425 ETH | ||||
17950144 | 461 days ago | 0.02308333 ETH | ||||
17950144 | 461 days ago | 0.01 ETH | ||||
17950144 | 461 days ago | 0.062325 ETH | ||||
17950144 | 461 days ago | 0.145425 ETH | ||||
17950144 | 461 days ago | 0.02308333 ETH | ||||
17950144 | 461 days ago | 0.02 ETH | ||||
17950144 | 461 days ago | 0.062325 ETH | ||||
17950144 | 461 days ago | 0.145425 ETH | ||||
17950144 | 461 days ago | 0.02308333 ETH | ||||
17950144 | 461 days ago | 0.03 ETH | ||||
17950144 | 461 days ago | 0.062325 ETH | ||||
17950144 | 461 days ago | 0.145425 ETH | ||||
17950144 | 461 days ago | 0.02308333 ETH | ||||
17950144 | 461 days ago | 0.02 ETH | ||||
17950143 | 461 days ago | 0.065025 ETH |
Loading...
Loading
Contract Name:
MinterDALinV4
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/IGenArt721CoreContractV3_Base.sol"; import "../../interfaces/0.8.x/IMinterFilterV0.sol"; import "../../interfaces/0.8.x/IFilteredMinterDALinV1.sol"; import "./MinterBase_v0_1_1.sol"; import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin-4.5/contracts/utils/math/SafeCast.sol"; pragma solidity 0.8.17; /** * @title Filtered Minter contract that allows tokens to be minted with ETH. * Pricing is achieved using an automated Dutch-auction mechanism. * This is designed to be used with GenArt721CoreContractV3 flagship or * engine 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 minter details. * 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: * - setMinimumAuctionLengthSeconds (note: this is only enforced when creating * new auctions) * - resetAuctionDetails (note: this will prevent minting until a new auction * is created) * ---------------------------------------------------------------------------- * The following functions are restricted to a project's artist: * - setAuctionDetails (note: this may only be called when there is no active * auction) * - setProjectMaxInvocations * - manuallyLimitProjectMaxInvocations * ---------------------------------------------------------------------------- * Additional admin and artist privileged roles may be described on other * contracts that this minter integrates with. * * @dev Note that while this minter makes use of `block.timestamp` and it is * technically possible that this value is manipulated by block producers, such * manipulation will not have material impact on the price values of this minter * given the business practices for how pricing is congfigured for this minter * and that variations on the order of less than a minute should not * meaningfully impact price given the minimum allowable price decay rate that * this minter intends to support. */ contract MinterDALinV4 is ReentrancyGuard, MinterBase, IFilteredMinterDALinV1 { using SafeCast for uint256; /// Core contract address this minter interacts with address public immutable genArt721CoreAddress; /// The core contract integrates with V3 contracts IGenArt721CoreContractV3_Base private immutable genArtCoreContract_Base; /// Minter filter address this minter interacts with address public immutable minterFilterAddress; /// Minter filter this minter may interact with. IMinterFilterV0 private immutable minterFilter; /// minterType for this minter string public constant minterType = "MinterDALinV4"; uint256 constant ONE_MILLION = 1_000_000; struct ProjectConfig { bool maxHasBeenInvoked; uint24 maxInvocations; // max uint64 ~= 1.8e19 sec ~= 570 billion years uint64 timestampStart; uint64 timestampEnd; uint256 startPrice; uint256 basePrice; } mapping(uint256 => ProjectConfig) public projectConfig; /// Minimum auction length in seconds uint256 public minimumAuctionLengthSeconds = 3600; // 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( genArtCoreContract_Base.adminACLAllowed( msg.sender, address(this), _selector ), "Only Core AdminACL allowed" ); _; } modifier onlyArtist(uint256 _projectId) { require( (msg.sender == genArtCoreContract_Base.projectIdToArtistAddress(_projectId)), "Only Artist" ); _; } /** * @notice Initializes contract to be a Filtered Minter for * `_minterFilter`, integrated with Art Blocks core contract * at address `_genArt721Address`. * @param _genArt721Address Art Blocks core contract address for * which this contract will be a minter. * @param _minterFilter Minter filter for which * this will a filtered minter. */ constructor( address _genArt721Address, address _minterFilter ) ReentrancyGuard() MinterBase(_genArt721Address) { genArt721CoreAddress = _genArt721Address; // always populate immutable engine contracts, but only use appropriate // interface based on isEngine in the rest of the contract genArtCoreContract_Base = IGenArt721CoreContractV3_Base( _genArt721Address ); minterFilterAddress = _minterFilter; minterFilter = IMinterFilterV0(_minterFilter); require( minterFilter.genArt721CoreAddress() == _genArt721Address, "Illegal contract pairing" ); } /** * @notice Syncs local maximum invocations of project `_projectId` based on * the value currently defined in the core contract. * @param _projectId Project ID to set the maximum invocations for. * @dev this enables gas reduction after maxInvocations have been reached - * core contracts shall still enforce a maxInvocation check during mint. */ function setProjectMaxInvocations( uint256 _projectId ) external onlyArtist(_projectId) { uint256 maxInvocations; uint256 invocations; (invocations, maxInvocations, , , , ) = genArtCoreContract_Base .projectStateData(_projectId); // update storage with results projectConfig[_projectId].maxInvocations = uint24(maxInvocations); // We need to ensure maxHasBeenInvoked is correctly set after manually syncing the // local maxInvocations value with the core contract's maxInvocations value. // This synced value of maxInvocations from the core contract will always be greater // than or equal to the previous value of maxInvocations stored locally. projectConfig[_projectId].maxHasBeenInvoked = invocations == maxInvocations; emit ProjectMaxInvocationsLimitUpdated(_projectId, maxInvocations); } /** * @notice Manually sets the local maximum invocations of project `_projectId` * with the provided `_maxInvocations`, checking that `_maxInvocations` is less * than or equal to the value of project `_project_id`'s maximum invocations that is * set on the core contract. * @dev Note that a `_maxInvocations` of 0 can only be set if the current `invocations` * value is also 0 and this would also set `maxHasBeenInvoked` to true, correctly short-circuiting * this minter's purchase function, avoiding extra gas costs from the core contract's maxInvocations check. * @param _projectId Project ID to set the maximum invocations for. * @param _maxInvocations Maximum invocations to set for the project. */ function manuallyLimitProjectMaxInvocations( uint256 _projectId, uint256 _maxInvocations ) external onlyArtist(_projectId) { // CHECKS // ensure that the manually set maxInvocations is not greater than what is set on the core contract uint256 maxInvocations; uint256 invocations; (invocations, maxInvocations, , , , ) = genArtCoreContract_Base .projectStateData(_projectId); require( _maxInvocations <= maxInvocations, "Cannot increase project max invocations above core contract set project max invocations" ); require( _maxInvocations >= invocations, "Cannot set project max invocations to less than current invocations" ); // EFFECTS // update storage with results projectConfig[_projectId].maxInvocations = uint24(_maxInvocations); projectConfig[_projectId].maxHasBeenInvoked = invocations == _maxInvocations; emit ProjectMaxInvocationsLimitUpdated(_projectId, _maxInvocations); } /** * @notice Warning: Disabling purchaseTo is not supported on this minter. * This method exists purely for interface-conformance purposes. */ function togglePurchaseToDisabled( uint256 _projectId ) external view onlyArtist(_projectId) { revert("Action not supported"); } /** * @notice projectId => has project reached its maximum number of * invocations? Note that this returns a local cache of the core contract's * state, and may be out of sync with the core contract. This is * intentional, as it only enables gas optimization of mints after a * project's maximum invocations has been reached. A false negative will * only result in a gas cost increase, since the core contract will still * enforce a maxInvocation check during minting. A false positive is not * possible because the V3 core contract only allows maximum invocations * to be reduced, not increased. Based on this rationale, we intentionally * do not do input validation in this method as to whether or not the input * `_projectId` is an existing project ID. */ function projectMaxHasBeenInvoked( uint256 _projectId ) external view returns (bool) { return projectConfig[_projectId].maxHasBeenInvoked; } /** * @notice projectId => project's maximum number of invocations. * Optionally synced with core contract value, for gas optimization. * Note that this returns a local cache of the core contract's * state, and may be out of sync with the core contract. This is * intentional, as it only enables gas optimization of mints after a * project's maximum invocations has been reached. * @dev A number greater than the core contract's project max invocations * will only result in a gas cost increase, since the core contract will * still enforce a maxInvocation check during minting. A number less than * the core contract's project max invocations is only possible when the * project's max invocations have not been synced on this minter, since the * V3 core contract only allows maximum invocations to be reduced, not * increased. When this happens, the minter will enable minting, allowing * the core contract to enforce the max invocations check. Based on this * rationale, we intentionally do not do input validation in this method as * to whether or not the input `_projectId` is an existing project ID. */ function projectMaxInvocations( uint256 _projectId ) external view returns (uint256) { return uint256(projectConfig[_projectId].maxInvocations); } /** * @notice projectId => auction parameters */ function projectAuctionParameters( uint256 _projectId ) external view returns ( uint256 timestampStart, uint256 timestampEnd, uint256 startPrice, uint256 basePrice ) { ProjectConfig storage _projectConfig = projectConfig[_projectId]; return ( _projectConfig.timestampStart, _projectConfig.timestampEnd, _projectConfig.startPrice, _projectConfig.basePrice ); } /** * @notice Sets minimum auction length to `_minimumAuctionLengthSeconds` * for all projects. * @param _minimumAuctionLengthSeconds Minimum auction length in seconds. */ function setMinimumAuctionLengthSeconds( uint256 _minimumAuctionLengthSeconds ) external onlyCoreAdminACL(this.setMinimumAuctionLengthSeconds.selector) { minimumAuctionLengthSeconds = _minimumAuctionLengthSeconds; emit MinimumAuctionLengthSecondsUpdated(_minimumAuctionLengthSeconds); } ////// Auction Functions /** * @notice Sets auction details for project `_projectId`. * @param _projectId Project ID to set auction details for. * @param _auctionTimestampStart Timestamp at which to start the auction. * @param _auctionTimestampEnd Timestamp at which to end the auction. * @param _startPrice Price at which to start the auction, in Wei. * @param _basePrice Resting price of the auction, in Wei. * @dev Note that it is intentionally supported here that the configured * price may be explicitly set to `0`. */ function setAuctionDetails( uint256 _projectId, uint256 _auctionTimestampStart, uint256 _auctionTimestampEnd, uint256 _startPrice, uint256 _basePrice ) external onlyArtist(_projectId) { // CHECKS ProjectConfig storage _projectConfig = projectConfig[_projectId]; require( _projectConfig.timestampStart == 0 || block.timestamp < _projectConfig.timestampStart, "No modifications mid-auction" ); require( block.timestamp < _auctionTimestampStart, "Only future auctions" ); require( _auctionTimestampEnd > _auctionTimestampStart, "Auction end must be greater than auction start" ); require( _auctionTimestampEnd >= _auctionTimestampStart + minimumAuctionLengthSeconds, "Auction length must be at least minimumAuctionLengthSeconds" ); require( _startPrice > _basePrice, "Auction start price must be greater than auction end price" ); // EFFECTS _projectConfig.timestampStart = _auctionTimestampStart.toUint64(); _projectConfig.timestampEnd = _auctionTimestampEnd.toUint64(); _projectConfig.startPrice = _startPrice; _projectConfig.basePrice = _basePrice; emit SetAuctionDetails( _projectId, _auctionTimestampStart, _auctionTimestampEnd, _startPrice, _basePrice ); } /** * @notice Resets auction details for project `_projectId`, zero-ing out all * relevant auction fields. Not intended to be used in normal auction * operation, but rather only in case of the need to halt an auction. * @param _projectId Project ID to set auction details for. */ function resetAuctionDetails( uint256 _projectId ) external onlyCoreAdminACL(this.resetAuctionDetails.selector) { ProjectConfig storage _projectConfig = projectConfig[_projectId]; // reset to initial values _projectConfig.timestampStart = 0; _projectConfig.timestampEnd = 0; _projectConfig.startPrice = 0; _projectConfig.basePrice = 0; emit ResetAuctionDetails(_projectId); } /** * @notice Purchases a token from project `_projectId`. * @param _projectId Project ID to mint a token on. * @return tokenId Token ID of minted token */ function purchase( uint256 _projectId ) external payable returns (uint256 tokenId) { tokenId = purchaseTo_do6(msg.sender, _projectId); return tokenId; } /** * @notice gas-optimized version of purchase(uint256). */ function purchase_H4M( uint256 _projectId ) external payable returns (uint256 tokenId) { tokenId = purchaseTo_do6(msg.sender, _projectId); return tokenId; } /** * @notice Purchases a token from project `_projectId` and sets * the token's owner to `_to`. * @param _to Address to be the new token's owner. * @param _projectId Project ID to mint a token on. * @return tokenId Token ID of minted token */ function purchaseTo( address _to, uint256 _projectId ) external payable returns (uint256 tokenId) { return purchaseTo_do6(_to, _projectId); } /** * @notice gas-optimized version of purchaseTo(address, uint256). */ function purchaseTo_do6( address _to, uint256 _projectId ) public payable nonReentrant returns (uint256 tokenId) { // CHECKS ProjectConfig storage _projectConfig = projectConfig[_projectId]; // Note that `maxHasBeenInvoked` is only checked here to reduce gas // consumption after a project has been fully minted. // `_projectConfig.maxHasBeenInvoked` is locally cached to reduce // gas consumption, but if not in sync with the core contract's value, // the core contract also enforces its own max invocation check during // minting. require( !_projectConfig.maxHasBeenInvoked, "Maximum number of invocations reached" ); // _getPrice reverts if auction is unconfigured or has not started uint256 pricePerTokenInWei = _getPrice(_projectId); require( msg.value >= pricePerTokenInWei, "Must send minimum value to mint!" ); // EFFECTS tokenId = minterFilter.mint(_to, _projectId, msg.sender); // okay if this underflows because if statement will always eval false. // this is only for gas optimization (core enforces maxInvocations). unchecked { if (tokenId % ONE_MILLION == _projectConfig.maxInvocations - 1) { _projectConfig.maxHasBeenInvoked = true; } } // INTERACTIONS splitFundsETH(_projectId, pricePerTokenInWei, genArt721CoreAddress); return tokenId; } /** * @notice Gets price of minting a token on project `_projectId` given * the project's AuctionParameters and current block timestamp. * Reverts if auction has not yet started or auction is unconfigured. * @param _projectId Project ID to get price of token for. * @return current price of token in Wei */ function _getPrice(uint256 _projectId) private view returns (uint256) { ProjectConfig storage _projectConfig = projectConfig[_projectId]; // move parameters to memory if used more than once uint256 _timestampStart = uint256(_projectConfig.timestampStart); uint256 _timestampEnd = uint256(_projectConfig.timestampEnd); uint256 _startPrice = _projectConfig.startPrice; uint256 _basePrice = _projectConfig.basePrice; require(block.timestamp > _timestampStart, "Auction not yet started"); if (block.timestamp >= _timestampEnd) { require(_timestampEnd > 0, "Only configured auctions"); return _basePrice; } uint256 elapsedTime; uint256 duration; uint256 startToEndDiff; unchecked { // already checked that block.timestamp > _timestampStart elapsedTime = block.timestamp - _timestampStart; // _timestampEnd > _timestampStart enforced during assignment duration = _timestampEnd - _timestampStart; // _startPrice > _basePrice enforced during assignment startToEndDiff = _startPrice - _basePrice; } return _startPrice - ((elapsedTime * startToEndDiff) / duration); } /** * @notice Gets if price of token is configured, price of minting a * token on project `_projectId`, and currency symbol and address to be * used as payment. Supersedes any core contract price information. * @param _projectId Project ID to get price information for. * @return isConfigured true only if project's auction parameters have been * configured on this minter * @return tokenPriceInWei current price of token on this minter - invalid * if auction has not yet been configured * @return currencySymbol currency symbol for purchases of project on this * minter. This minter always returns "ETH" * @return currencyAddress currency address for purchases of project on * this minter. This minter always returns null address, reserved for ether */ function getPriceInfo( uint256 _projectId ) external view returns ( bool isConfigured, uint256 tokenPriceInWei, string memory currencySymbol, address currencyAddress ) { ProjectConfig storage _projectConfig = projectConfig[_projectId]; isConfigured = (_projectConfig.startPrice > 0); if (block.timestamp <= _projectConfig.timestampStart) { // Provide a reasonable value for `tokenPriceInWei` when it would // otherwise revert, using the starting price before auction starts. tokenPriceInWei = _projectConfig.startPrice; } else if (_projectConfig.timestampEnd == 0) { // In the case of unconfigured auction, return price of zero when // it would otherwise revert tokenPriceInWei = 0; } else { tokenPriceInWei = _getPrice(_projectId); } currencySymbol = "ETH"; currencyAddress = address(0); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits. * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// 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. import "./IFilteredMinterV0.sol"; pragma solidity ^0.8.0; /** * @title This interface extends the IFilteredMinterV0 interface in order to * add support for linear descending auctions. * @author Art Blocks Inc. */ interface IFilteredMinterDALinV0 is IFilteredMinterV0 { /// Auction details updated for project `projectId`. event SetAuctionDetails( uint256 indexed projectId, uint256 _auctionTimestampStart, uint256 _auctionTimestampEnd, uint256 _startPrice, uint256 _basePrice ); /// Auction details cleared for project `projectId`. event ResetAuctionDetails(uint256 indexed projectId); /// Minimum allowed auction length updated event MinimumAuctionLengthSecondsUpdated( uint256 _minimumAuctionLengthSeconds ); function minimumAuctionLengthSeconds() external view returns (uint256); }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. import "./IFilteredMinterDALinV0.sol"; import "./IFilteredMinterV2.sol"; pragma solidity ^0.8.0; /** * @title This interface extends the IFilteredMinterDALinV0 interface in order to * add support for manually setting project max invocations. * @author Art Blocks Inc. */ interface IFilteredMinterDALinV1 is IFilteredMinterDALinV0, IFilteredMinterV2 { }
// 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. import "./IFilteredMinterV0.sol"; pragma solidity ^0.8.0; /** * @title This interface extends the IFilteredMinterV0 interface in order to * add support for generic project minter configuration updates. * @dev keys represent strings of finite length encoded in bytes32 to minimize * gas. * @author Art Blocks Inc. */ interface IFilteredMinterV1 is IFilteredMinterV0 { /// ANY /** * @notice Generic project minter configuration event. Removes key `_key` * for project `_projectId`. */ event ConfigKeyRemoved(uint256 indexed _projectId, bytes32 _key); /// BOOL /** * @notice Generic project minter configuration event. Sets value of key * `_key` to `_value` for project `_projectId`. */ event ConfigValueSet(uint256 indexed _projectId, bytes32 _key, bool _value); /// UINT256 /** * @notice Generic project minter configuration event. Sets value of key * `_key` to `_value` for project `_projectId`. */ event ConfigValueSet( uint256 indexed _projectId, bytes32 _key, uint256 _value ); /** * @notice Generic project minter configuration event. Adds value `_value` * to the set of uint256 at key `_key` for project `_projectId`. */ event ConfigValueAddedToSet( uint256 indexed _projectId, bytes32 _key, uint256 _value ); /** * @notice Generic project minter configuration event. Removes value * `_value` to the set of uint256 at key `_key` for project `_projectId`. */ event ConfigValueRemovedFromSet( uint256 indexed _projectId, bytes32 _key, uint256 _value ); /// ADDRESS /** * @notice Generic project minter configuration event. Sets value of key * `_key` to `_value` for project `_projectId`. */ event ConfigValueSet( uint256 indexed _projectId, bytes32 _key, address _value ); /** * @notice Generic project minter configuration event. Adds value `_value` * to the set of addresses at key `_key` for project `_projectId`. */ event ConfigValueAddedToSet( uint256 indexed _projectId, bytes32 _key, address _value ); /** * @notice Generic project minter configuration event. Removes value * `_value` to the set of addresses at key `_key` for project `_projectId`. */ event ConfigValueRemovedFromSet( uint256 indexed _projectId, bytes32 _key, address _value ); /// BYTES32 /** * @notice Generic project minter configuration event. Sets value of key * `_key` to `_value` for project `_projectId`. */ event ConfigValueSet( uint256 indexed _projectId, bytes32 _key, bytes32 _value ); /** * @notice Generic project minter configuration event. Adds value `_value` * to the set of bytes32 at key `_key` for project `_projectId`. */ event ConfigValueAddedToSet( uint256 indexed _projectId, bytes32 _key, bytes32 _value ); /** * @notice Generic project minter configuration event. Removes value * `_value` to the set of bytes32 at key `_key` for project `_projectId`. */ event ConfigValueRemovedFromSet( uint256 indexed _projectId, bytes32 _key, bytes32 _value ); /** * @dev Strings not supported. Recommend conversion of (short) strings to * bytes32 to remain gas-efficient. */ }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. import "./IFilteredMinterV1.sol"; pragma solidity ^0.8.0; /** * @title This interface extends the IFilteredMinterV1 interface in order to * add support for manually setting project max invocations. * @author Art Blocks Inc. */ interface IFilteredMinterV2 is IFilteredMinterV1 { /** * @notice Local max invocations for project `_projectId`, tied to core contract `_coreContractAddress`, * updated to `_maxInvocations`. */ event ProjectMaxInvocationsLimitUpdated( uint256 indexed _projectId, uint256 _maxInvocations ); // Sets the local max invocations for a given project, checking that the provided max invocations is // less than or equal to the global max invocations for the project set on the core contract. // This does not impact the max invocations value defined on the core contract. function manuallyLimitProjectMaxInvocations( uint256 _projectId, uint256 _maxInvocations ) external; }
// 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"; /** * @title This interface is intended to house interface items that are common * across all GenArt721CoreContractV3 flagship and derivative implementations. * This interface extends the IManifold royalty interface in order to * add support the Royalty Registry by default. * @author Art Blocks Inc. */ interface IGenArt721CoreContractV3_Base 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 projectStateData( uint256 _projectId ) external view returns ( uint256 invocations, uint256 maxInvocations, bool active, bool paused, uint256 completedTimestamp, bool locked ); // 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); }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; import "./IAdminACLV0.sol"; import "./IGenArt721CoreContractV3_Base.sol"; interface IGenArt721CoreContractV3_Engine is IGenArt721CoreContractV3_Base { // @dev new function in V3 function getPrimaryRevenueSplits( uint256 _projectId, uint256 _price ) external view returns ( uint256 renderProviderRevenue_, address payable renderProviderAddress_, uint256 platformProviderRevenue_, address payable platformProviderAddress_, uint256 artistRevenue_, address payable artistAddress_, uint256 additionalPayeePrimaryRevenue_, address payable additionalPayeePrimaryAddress_ ); // @dev The render provider primary sales payment address function renderProviderPrimarySalesAddress() external view returns (address payable); // @dev The platform provider primary sales payment address function platformProviderPrimarySalesAddress() external view returns (address payable); // @dev Percentage of primary sales allocated to the render provider function renderProviderPrimarySalesPercentage() external view returns (uint256); // @dev Percentage of primary sales allocated to the platform provider function platformProviderPrimarySalesPercentage() external view returns (uint256); // @dev The render provider secondary sales royalties payment address function renderProviderSecondarySalesAddress() external view returns (address payable); // @dev The platform provider secondary sales royalties payment address function platformProviderSecondarySalesAddress() external view returns (address payable); // @dev Basis points of secondary sales allocated to the render provider function renderProviderSecondarySalesBPS() external view returns (uint256); // @dev Basis points of secondary sales allocated to the platform provider function platformProviderSecondarySalesBPS() external view returns (uint256); // function to read the hash for a given tokenId function tokenIdToHash(uint256 _tokenId) external view returns (bytes32); // function to read the hash-seed for a given tokenId function tokenIdToHashSeed( uint256 _tokenId ) external view returns (bytes12); }
// SPDX-License-Identifier: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; import "./IAdminACLV0.sol"; import "./IGenArt721CoreContractV3_Base.sol"; /** * @title This interface extends IGenArt721CoreContractV3_Base with functions * that are part of the Art Blocks Flagship core contract. * @author Art Blocks Inc. */ // This interface extends IGenArt721CoreContractV3_Base with functions that are // in part of the Art Blocks Flagship core contract. interface IGenArt721CoreContractV3 is IGenArt721CoreContractV3_Base { // @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 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); /** * @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 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: LGPL-3.0-only // Created By: Art Blocks Inc. import "./IFilteredMinterV2.sol"; pragma solidity ^0.8.0; /** * @title This interface defines any events or functions required for a minter * to conform to the MinterBase contract. * @dev The MinterBase contract was not implemented from the beginning of the * MinterSuite contract suite, therefore early versions of some minters may not * conform to this interface. * @author Art Blocks Inc. */ interface IMinterBaseV0 { // Function that returns if a minter is configured to integrate with a V3 flagship or V3 engine contract. // Returns true only if the minter is configured to integrate with an engine contract. function isEngine() external returns (bool isEngine); }
// 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. import "../../interfaces/0.8.x/IMinterBaseV0.sol"; import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Base.sol"; import "../../interfaces/0.8.x/IGenArt721CoreContractV3.sol"; import "../../interfaces/0.8.x/IGenArt721CoreContractV3_Engine.sol"; import "@openzeppelin-4.7/contracts/token/ERC20/IERC20.sol"; pragma solidity ^0.8.0; /** * @title Art Blocks Minter Base Class * @notice A base class for Art Blocks minter contracts that provides common * functionality used across minter contracts. * This contract is not intended to be deployed directly, but rather to be * inherited by other minter contracts. * From a design perspective, this contract is intended to remain simple and * easy to understand. It is not intended to cause a complex inheritance tree, * and instead should keep minter contracts as readable as possible for * collectors and developers. * @dev Semantic versioning is used in the solidity file name, and is therefore * controlled by contracts importing the appropriate filename version. * @author Art Blocks Inc. */ abstract contract MinterBase is IMinterBaseV0 { /// state variable that tracks whether this contract's associated core /// contract is an Engine contract, where Engine contracts have an /// additional revenue split for the platform provider bool public immutable isEngine; // @dev we do not track an initialization state, as the only state variable // is immutable, which the compiler enforces to be assigned during // construction. /** * @notice Initializes contract to ensure state variable `isEngine` is set * appropriately based on the minter's associated core contract address. * @param genArt721Address Art Blocks core contract address for * which this contract will be a minter. */ constructor(address genArt721Address) { // set state variable isEngine isEngine = _getV3CoreIsEngine(genArt721Address); } /** * @notice splits ETH funds between sender (if refund), providers, * artist, and artist's additional payee for a token purchased on * project `_projectId`. * WARNING: This function uses msg.value and msg.sender to determine * refund amounts, and therefore may not be applicable to all use cases * (e.g. do not use with Dutch Auctions with on-chain settlement). * @dev possible DoS during splits is acknowledged, and mitigated by * business practices, including end-to-end testing on mainnet, and * admin-accepted artist payment addresses. * @param projectId Project ID for which funds shall be split. * @param pricePerTokenInWei Current price of token, in Wei. */ function splitFundsETH( uint256 projectId, uint256 pricePerTokenInWei, address genArt721CoreAddress ) internal { if (msg.value > 0) { bool success_; // send refund to sender uint256 refund = msg.value - pricePerTokenInWei; if (refund > 0) { (success_, ) = msg.sender.call{value: refund}(""); require(success_, "Refund failed"); } // split revenues splitRevenuesETH( projectId, pricePerTokenInWei, genArt721CoreAddress ); } } /** * @notice splits ETH revenues between providers, artist, and artist's * additional payee for revenue generated by project `_projectId`. * @dev possible DoS during splits is acknowledged, and mitigated by * business practices, including end-to-end testing on mainnet, and * admin-accepted artist payment addresses. * @param projectId Project ID for which funds shall be split. * @param valueInWei Value to be split, in Wei. */ function splitRevenuesETH( uint256 projectId, uint256 valueInWei, address genArtCoreContract ) internal { if (valueInWei <= 0) { return; // return early } bool success; // split funds between platforms, artist, and artist's // additional payee uint256 renderProviderRevenue_; address payable renderProviderAddress_; uint256 artistRevenue_; address payable artistAddress_; uint256 additionalPayeePrimaryRevenue_; address payable additionalPayeePrimaryAddress_; if (isEngine) { // get engine splits uint256 platformProviderRevenue_; address payable platformProviderAddress_; ( renderProviderRevenue_, renderProviderAddress_, platformProviderRevenue_, platformProviderAddress_, artistRevenue_, artistAddress_, additionalPayeePrimaryRevenue_, additionalPayeePrimaryAddress_ ) = IGenArt721CoreContractV3_Engine(genArtCoreContract) .getPrimaryRevenueSplits(projectId, valueInWei); // Platform Provider payment (only possible if engine) if (platformProviderRevenue_ > 0) { (success, ) = platformProviderAddress_.call{ value: platformProviderRevenue_ }(""); require(success, "Platform Provider payment failed"); } } else { // get flagship splits ( renderProviderRevenue_, // artblocks revenue renderProviderAddress_, // artblocks address artistRevenue_, artistAddress_, additionalPayeePrimaryRevenue_, additionalPayeePrimaryAddress_ ) = IGenArt721CoreContractV3(genArtCoreContract) .getPrimaryRevenueSplits(projectId, valueInWei); } // Render Provider / Art Blocks payment if (renderProviderRevenue_ > 0) { (success, ) = renderProviderAddress_.call{ value: renderProviderRevenue_ }(""); require(success, "Render Provider payment failed"); } // artist payment if (artistRevenue_ > 0) { (success, ) = artistAddress_.call{value: artistRevenue_}(""); require(success, "Artist payment failed"); } // additional payee payment if (additionalPayeePrimaryRevenue_ > 0) { (success, ) = additionalPayeePrimaryAddress_.call{ value: additionalPayeePrimaryRevenue_ }(""); require(success, "Additional Payee payment failed"); } } /** * @notice splits ERC-20 funds between providers, artist, and artist's * additional payee, for a token purchased on project `_projectId`. * @dev possible DoS during splits is acknowledged, and mitigated by * business practices, including end-to-end testing on mainnet, and * admin-accepted artist payment addresses. */ function splitFundsERC20( uint256 projectId, uint256 pricePerTokenInWei, address currencyAddress, address genArtCoreContract ) internal { IERC20 _projectCurrency = IERC20(currencyAddress); // split remaining funds between foundation, artist, and artist's // additional payee uint256 renderProviderRevenue_; address payable renderProviderAddress_; uint256 artistRevenue_; address payable artistAddress_; uint256 additionalPayeePrimaryRevenue_; address payable additionalPayeePrimaryAddress_; if (isEngine) { // get engine splits uint256 platformProviderRevenue_; address payable platformProviderAddress_; ( renderProviderRevenue_, renderProviderAddress_, platformProviderRevenue_, platformProviderAddress_, artistRevenue_, artistAddress_, additionalPayeePrimaryRevenue_, additionalPayeePrimaryAddress_ ) = IGenArt721CoreContractV3_Engine(genArtCoreContract) .getPrimaryRevenueSplits(projectId, pricePerTokenInWei); // Platform Provider payment (only possible if engine) if (platformProviderRevenue_ > 0) { _projectCurrency.transferFrom( msg.sender, platformProviderAddress_, platformProviderRevenue_ ); } } else { // get flagship splits ( renderProviderRevenue_, // artblocks revenue renderProviderAddress_, // artblocks address artistRevenue_, artistAddress_, additionalPayeePrimaryRevenue_, additionalPayeePrimaryAddress_ ) = IGenArt721CoreContractV3(genArtCoreContract) .getPrimaryRevenueSplits(projectId, pricePerTokenInWei); } // Art Blocks payment if (renderProviderRevenue_ > 0) { _projectCurrency.transferFrom( msg.sender, renderProviderAddress_, renderProviderRevenue_ ); } // artist payment if (artistRevenue_ > 0) { _projectCurrency.transferFrom( msg.sender, artistAddress_, artistRevenue_ ); } // additional payee payment if (additionalPayeePrimaryRevenue_ > 0) { _projectCurrency.transferFrom( msg.sender, additionalPayeePrimaryAddress_, additionalPayeePrimaryRevenue_ ); } } /** * @notice Returns whether a V3 core contract is an Art Blocks Engine * contract or not. Return value of false indicates that the core is a * flagship contract. * @dev this function reverts if a core contract does not return the * expected number of return values from getPrimaryRevenueSplits() for * either a flagship or engine core contract. * @dev this function uses the length of the return data (in bytes) to * determine whether the core is an engine or not. * @param genArt721CoreV3 The address of the deployed core contract. */ function _getV3CoreIsEngine( address genArt721CoreV3 ) private returns (bool) { // call getPrimaryRevenueSplits() on core contract bytes memory payload = abi.encodeWithSignature( "getPrimaryRevenueSplits(uint256,uint256)", 0, 0 ); (bool success, bytes memory returnData) = genArt721CoreV3.call(payload); require(success, "getPrimaryRevenueSplits() call failed"); // determine whether core is engine or not, based on return data length uint256 returnDataLength = returnData.length; if (returnDataLength == 6 * 32) { // 6 32-byte words returned if flagship (not engine) // @dev 6 32-byte words are expected because the non-engine core // contracts return a payout address and uint256 payment value for // the artist, and artist's additional payee, and Art Blocks. // also note that per Solidity ABI encoding, the address return // values are padded to 32 bytes. return false; } else if (returnDataLength == 8 * 32) { // 8 32-byte words returned if engine // @dev 8 32-byte words are expected because the engine core // contracts return a payout address and uint256 payment value for // the artist, artist's additional payee, render provider // typically Art Blocks, and platform provider (partner). // also note that per Solidity ABI encoding, the address return // values are padded to 32 bytes. return true; } else { // unexpected return value length revert("Unexpected revenue split bytes"); } } }
{ "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"},{"internalType":"address","name":"_minterFilter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"}],"name":"ConfigKeyRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"ConfigValueAddedToSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_value","type":"address"}],"name":"ConfigValueAddedToSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_value","type":"bytes32"}],"name":"ConfigValueAddedToSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"ConfigValueRemovedFromSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_value","type":"address"}],"name":"ConfigValueRemovedFromSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_value","type":"bytes32"}],"name":"ConfigValueRemovedFromSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"_value","type":"bool"}],"name":"ConfigValueSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"ConfigValueSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"address","name":"_value","type":"address"}],"name":"ConfigValueSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"_key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"_value","type":"bytes32"}],"name":"ConfigValueSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_minimumAuctionLengthSeconds","type":"uint256"}],"name":"MinimumAuctionLengthSecondsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_pricePerTokenInWei","type":"uint256"}],"name":"PricePerTokenInWeiUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_currencyAddress","type":"address"},{"indexed":false,"internalType":"string","name":"_currencySymbol","type":"string"}],"name":"ProjectCurrencyInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"ProjectMaxInvocationsLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_projectId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"_purchaseToDisabled","type":"bool"}],"name":"PurchaseToDisabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"}],"name":"ResetAuctionDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"projectId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_auctionTimestampStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_auctionTimestampEnd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_startPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"SetAuctionDetails","type":"event"},{"inputs":[],"name":"genArt721CoreAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"getPriceInfo","outputs":[{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"uint256","name":"tokenPriceInWei","type":"uint256"},{"internalType":"string","name":"currencySymbol","type":"string"},{"internalType":"address","name":"currencyAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEngine","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_maxInvocations","type":"uint256"}],"name":"manuallyLimitProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minimumAuctionLengthSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterFilterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minterType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectAuctionParameters","outputs":[{"internalType":"uint256","name":"timestampStart","type":"uint256"},{"internalType":"uint256","name":"timestampEnd","type":"uint256"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"basePrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"projectConfig","outputs":[{"internalType":"bool","name":"maxHasBeenInvoked","type":"bool"},{"internalType":"uint24","name":"maxInvocations","type":"uint24"},{"internalType":"uint64","name":"timestampStart","type":"uint64"},{"internalType":"uint64","name":"timestampEnd","type":"uint64"},{"internalType":"uint256","name":"startPrice","type":"uint256"},{"internalType":"uint256","name":"basePrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectMaxHasBeenInvoked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectMaxInvocations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchase","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchaseTo","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchaseTo_do6","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"purchase_H4M","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"resetAuctionDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_auctionTimestampStart","type":"uint256"},{"internalType":"uint256","name":"_auctionTimestampEnd","type":"uint256"},{"internalType":"uint256","name":"_startPrice","type":"uint256"},{"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"setAuctionDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumAuctionLengthSeconds","type":"uint256"}],"name":"setMinimumAuctionLengthSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"setProjectMaxInvocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"togglePurchaseToDisabled","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
610120604052610e106002553480156200001857600080fd5b5060405162002147380380620021478339810160408190526200003b91620002db565b6001600055816200004c816200013d565b1515608052506001600160a01b0380831660a081905260c081905290821660e0819052610100819052604080516392a10f8360e01b815290516392a10f839160048082019260209290919082900301816000875af1158015620000b3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d9919062000313565b6001600160a01b031614620001355760405162461bcd60e51b815260206004820152601860248201527f496c6c6567616c20636f6e74726163742070616972696e67000000000000000060448201526064015b60405180910390fd5b505062000369565b6040516000602482018190526044820181905290819060640160408051601f198184030181529181526020820180516001600160e01b0316638639415b60e01b1790525190915060009081906001600160a01b03861690620001a190859062000338565b6000604051808303816000865af19150503d8060008114620001e0576040519150601f19603f3d011682016040523d82523d6000602084013e620001e5565b606091505b509150915081620002475760405162461bcd60e51b815260206004820152602560248201527f6765745072696d617279526576656e756553706c69747328292063616c6c2066604482015264185a5b195960da1b60648201526084016200012c565b805160c08190036200025f5750600095945050505050565b8061010003620002755750600195945050505050565b60405162461bcd60e51b815260206004820152601e60248201527f556e657870656374656420726576656e75652073706c6974206279746573000060448201526064016200012c565b80516001600160a01b0381168114620002d657600080fd5b919050565b60008060408385031215620002ef57600080fd5b620002fa83620002be565b91506200030a60208401620002be565b90509250929050565b6000602082840312156200032657600080fd5b6200033182620002be565b9392505050565b6000825160005b818110156200035b57602081860181015185830152016200033f565b506000920191825250919050565b60805160a05160c05160e05161010051611d5a620003ed60003960006106170152600061043a015260008181610713015281816107d9015281816109f701528181610b0c01528181610bf801528181610da00152818161113701526111fd0152600081816102dd01526106b801526000818161040601526115340152611d5a6000f3fe6080604052600436106100eb5760003560e01c80619987146100f0578061b460146101165780631607c995146101295780632aedc28e1461014b5780632f077ee61461016b5780632fc37ef1146101d157806340d1397e146101f1578063462add461461021157806356690aaf14610251578063774159c614610288578063891407c0146102b857806392a10f83146102cb578063b2d30ac714610317578063c71b1b711461032d578063cd379f6e146103d4578063db6921b2146103f4578063dd85582f14610428578063e9d1e8ac1461045c578063efef39a114610116578063f7bd4b88146104a2575b600080fd5b6101036100fe366004611923565b6104c2565b6040519081526020015b60405180910390f35b61010361012436600461194f565b6106e9565b34801561013557600080fd5b50610149610144366004611968565b6106fb565b005b34801561015757600080fd5b5061014961016636600461194f565b6109d7565b34801561017757600080fd5b506101c161018636600461194f565b60009081526001602081905260409091208054918101546002909101546001600160401b03600160201b8404811694600160601b9094041692565b60405161010d949392919061198a565b3480156101dd57600080fd5b506101496101ec36600461194f565b610aec565b3480156101fd57600080fd5b5061014961020c36600461194f565b610be0565b34801561021d57600080fd5b5061024161022c36600461194f565b60009081526001602052604090205460ff1690565b604051901515815260200161010d565b34801561025d57600080fd5b5061010361026c36600461194f565b600090815260016020526040902054610100900462ffffff1690565b34801561029457600080fd5b506102a86102a336600461194f565b610cda565b60405161010d94939291906119eb565b6101036102c6366004611923565b610d75565b3480156102d757600080fd5b506102ff7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161010d565b34801561032357600080fd5b5061010360025481565b34801561033957600080fd5b5061039461034836600461194f565b600160208190526000918252604090912080549181015460029091015460ff83169262ffffff610100820416926001600160401b03600160201b8304811693600160601b909304169186565b60408051961515875262ffffff90951660208701526001600160401b039384169486019490945291166060840152608083015260a082015260c00161010d565b3480156103e057600080fd5b506101496103ef366004611a25565b610d88565b34801561040057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561043457600080fd5b506102ff7f000000000000000000000000000000000000000000000000000000000000000081565b34801561046857600080fd5b506104956040518060400160405280600d81526020016c135a5b9d195c9110531a5b958d609a1b81525081565b60405161010d9190611a60565b3480156104ae57600080fd5b506101496104bd36600461194f565b61111f565b600060026000540361051b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600160205260409020805460ff161561058e5760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b6064820152608401610512565b6000610599846112e2565b9050803410156105eb5760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e74216044820152606401610512565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f00000000000000000000000000000000000000000000000000000000000000001690630d4d1513906064016020604051808303816000875af1158015610660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106849190611a73565b825490935060001962ffffff61010090920482160116620f42408406036106b157815460ff191660011782555b6106dc84827f00000000000000000000000000000000000000000000000000000000000000006113f8565b5050600160005592915050565b60006106f533836104c2565b92915050565b60405163a47d29cb60e01b81526004810183905282907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107869190611a8c565b6001600160a01b0316336001600160a01b0316146107b65760405162461bcd60e51b815260040161051290611aa9565b604051630ea5613f60e01b81526004810184905260009081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630ea5613f9060240160c060405180830381865afa158015610820573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108449190611ae3565b50929550929350505050818411156108e45760405162461bcd60e51b815260206004820152605760248201527f43616e6e6f7420696e6372656173652070726f6a656374206d617820696e766f60448201527f636174696f6e732061626f766520636f726520636f6e7472616374207365742060648201527670726f6a656374206d617820696e766f636174696f6e7360481b608482015260a401610512565b808410156109665760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207365742070726f6a656374206d617820696e766f636174696f60448201527f6e7320746f206c657373207468616e2063757272656e7420696e766f636174696064820152626f6e7360e81b608482015260a401610512565b60008581526001602052604090819020805460ff1962ffffff8816610100021663ffffffff19909116178387141790555185907f8445d32a2ee05956c6c842357ca16ee41e92657b1cbcbf1c94f500672e48c3b1906109c89087815260200190565b60405180910390a25050505050565b60405163230448b160e01b8152631576e14760e11b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063230448b190610a3090339030908690600401611b42565b6020604051808303816000875af1158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a739190611b6f565b610a8f5760405162461bcd60e51b815260040161051290611b8a565b60008281526001602081905260408083208054600160201b600160a01b03191681559182018390556002820183905551909184917f2de6b284414d2e6b72bcc8d8d4de934e3f6410660a8f677c5c978f17f9cc2a929190a2505050565b60405163230448b160e01b8152632fc37ef160e01b906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063230448b190610b4590339030908690600401611b42565b6020604051808303816000875af1158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190611b6f565b610ba45760405162461bcd60e51b815260040161051290611b8a565b60028290556040518281527f03c81e81b0ed0ca5444a9d70c9f3d1c78d79d6a31419f77736e886d092ed1a9e9060200160405180910390a15050565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611a8c565b6001600160a01b0316336001600160a01b031614610c9b5760405162461bcd60e51b815260040161051290611aa9565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b6044820152606401610512565b600081815260016020819052604082209081015481549015159291606091839190600160201b90046001600160401b03164211610d1d5780600101549350610d4b565b8054600160601b90046001600160401b0316600003610d3f5760009350610d4b565b610d48866112e2565b93505b6040518060400160405280600381526020016208aa8960eb1b815250925060009150509193509193565b6000610d8183836104c2565b9392505050565b60405163a47d29cb60e01b81526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190611a8c565b6001600160a01b0316336001600160a01b031614610e435760405162461bcd60e51b815260040161051290611aa9565b60008681526001602052604090208054600160201b90046001600160401b03161580610e7f57508054600160201b90046001600160401b031642105b610eca5760405162461bcd60e51b815260206004820152601c60248201527b27379036b7b234b334b1b0ba34b7b7399036b4b216b0bab1ba34b7b760211b6044820152606401610512565b854210610f105760405162461bcd60e51b81526020600482015260146024820152734f6e6c79206675747572652061756374696f6e7360601b6044820152606401610512565b858511610f765760405162461bcd60e51b815260206004820152602e60248201527f41756374696f6e20656e64206d7573742062652067726561746572207468616e60448201526d08185d58dd1a5bdb881cdd185c9d60921b6064820152608401610512565b600254610f839087611bd4565b851015610ff65760405162461bcd60e51b815260206004820152603b60248201527f41756374696f6e206c656e677468206d757374206265206174206c656173742060448201527a6d696e696d756d41756374696f6e4c656e6774685365636f6e647360281b6064820152608401610512565b8284116110685760405162461bcd60e51b815260206004820152603a60248201527f41756374696f6e207374617274207072696365206d7573742062652067726561604482015279746572207468616e2061756374696f6e20656e6420707269636560301b6064820152608401610512565b611071866114ae565b81546001600160401b0391909116600160201b0267ffffffffffffffff60201b199091161781556110a1856114ae565b81546001600160401b0391909116600160601b0267ffffffffffffffff60601b19909116178155600181018490556002810183905560405187907f38b3058b75696f9e45bffa9c4b237adcde13d74c7bc1bea63e13c712d0776c749061110e90899089908990899061198a565b60405180910390a250505050505050565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111aa9190611a8c565b6001600160a01b0316336001600160a01b0316146111da5760405162461bcd60e51b815260040161051290611aa9565b604051630ea5613f60e01b81526004810183905260009081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630ea5613f9060240160c060405180830381865afa158015611244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112689190611ae3565b50505060008781526001602052604090819020805460ff1962ffffff8616610100021663ffffffff1990911617858514179055519194509192508591507f8445d32a2ee05956c6c842357ca16ee41e92657b1cbcbf1c94f500672e48c3b1906112d49085815260200190565b60405180910390a250505050565b60008181526001602081905260408220805491810154600282015491926001600160401b03600160201b8204811693600160601b9092041691904284106113655760405162461bcd60e51b8152602060048201526017602482015276105d58dd1a5bdb881b9bdd081e595d081cdd185c9d1959604a1b6044820152606401610512565b8242106113c157600083116113b75760405162461bcd60e51b81526020600482015260186024820152774f6e6c7920636f6e666967757265642061756374696f6e7360401b6044820152606401610512565b9695505050505050565b42849003848403828403816113d68285611be7565b6113e09190611bfe565b6113ea9086611c20565b9a9950505050505050505050565b34156114a95760008061140b8434611c20565b9050801561149b5760405133908290600081818185875af1925050503d8060008114611453576040519150601f19603f3d011682016040523d82523d6000602084013e611458565b606091505b5050809250508161149b5760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b6044820152606401610512565b6114a685858561151a565b50505b505050565b60006001600160401b038211156115165760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401610512565b5090565b6000821161152757505050565b60008060008060008060007f00000000000000000000000000000000000000000000000000000000000000001561169257604051638639415b60e01b8152600481018b9052602481018a905260009081906001600160a01b038b1690638639415b9060440161010060405180830381865afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce9190611c33565b969e50949c50909a5098509196509194509092509050811561168b576040516001600160a01b038216908390600081818185875af1925050503d8060008114611633576040519150601f19603f3d011682016040523d82523d6000602084013e611638565b606091505b5050809950508861168b5760405162461bcd60e51b815260206004820181905260248201527f506c6174666f726d2050726f7669646572207061796d656e74206661696c65646044820152606401610512565b5050611712565b604051638639415b60e01b8152600481018b9052602481018a90526001600160a01b03891690638639415b9060440160c060405180830381865afa1580156116de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117029190611cbb565b949a509298509096509450925090505b85156117b9576040516001600160a01b038616908790600081818185875af1925050503d8060008114611761576040519150601f19603f3d011682016040523d82523d6000602084013e611766565b606091505b505080975050866117b95760405162461bcd60e51b815260206004820152601e60248201527f52656e6465722050726f7669646572207061796d656e74206661696c656400006044820152606401610512565b8315611858576040516001600160a01b038416908590600081818185875af1925050503d8060008114611808576040519150601f19603f3d011682016040523d82523d6000602084013e61180d565b606091505b505080975050866118585760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b6044820152606401610512565b81156118ff576040516001600160a01b038216908390600081818185875af1925050503d80600081146118a7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ac565b606091505b505080975050866118ff5760405162461bcd60e51b815260206004820152601f60248201527f4164646974696f6e616c205061796565207061796d656e74206661696c6564006044820152606401610512565b50505050505050505050565b6001600160a01b038116811461192057600080fd5b50565b6000806040838503121561193657600080fd5b82356119418161190b565b946020939093013593505050565b60006020828403121561196157600080fd5b5035919050565b6000806040838503121561197b57600080fd5b50508035926020909101359150565b93845260208401929092526040830152606082015260800190565b6000815180845260005b818110156119cb576020818501810151868301820152016119af565b506000602082860101526020601f19601f83011685010191505092915050565b8415158152836020820152608060408201526000611a0c60808301856119a5565b905060018060a01b038316606083015295945050505050565b600080600080600060a08688031215611a3d57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602081526000610d8160208301846119a5565b600060208284031215611a8557600080fd5b5051919050565b600060208284031215611a9e57600080fd5b8151610d818161190b565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b80518015158114611ade57600080fd5b919050565b60008060008060008060c08789031215611afc57600080fd5b8651955060208701519450611b1360408801611ace565b9350611b2160608801611ace565b925060808701519150611b3660a08801611ace565b90509295509295509295565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b600060208284031215611b8157600080fd5b610d8182611ace565b6020808252601a908201527913db9b1e4810dbdc994810591b5a5b9050d308185b1b1bddd95960321b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156106f5576106f5611bbe565b80820281158282048414176106f5576106f5611bbe565b600082611c1b57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156106f5576106f5611bbe565b600080600080600080600080610100898b031215611c5057600080fd5b885197506020890151611c628161190b565b60408a015160608b01519198509650611c7a8161190b565b60808a015160a08b01519196509450611c928161190b565b60c08a015160e08b01519194509250611caa8161190b565b809150509295985092959890939650565b60008060008060008060c08789031215611cd457600080fd5b865195506020870151611ce68161190b565b604088015160608901519196509450611cfe8161190b565b608088015160a08901519194509250611d168161190b565b80915050929550929550929556fea26469706673582212204c7f8b2e3beac8414f67b0e335e37b1c9e651c6d03e16ffefdb60a42c818d34564736f6c63430008110033000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7070000000000000000000000006e522449c1642e7cb0b12a2889ccbf79b51c69f8
Deployed Bytecode
0x6080604052600436106100eb5760003560e01c80619987146100f0578061b460146101165780631607c995146101295780632aedc28e1461014b5780632f077ee61461016b5780632fc37ef1146101d157806340d1397e146101f1578063462add461461021157806356690aaf14610251578063774159c614610288578063891407c0146102b857806392a10f83146102cb578063b2d30ac714610317578063c71b1b711461032d578063cd379f6e146103d4578063db6921b2146103f4578063dd85582f14610428578063e9d1e8ac1461045c578063efef39a114610116578063f7bd4b88146104a2575b600080fd5b6101036100fe366004611923565b6104c2565b6040519081526020015b60405180910390f35b61010361012436600461194f565b6106e9565b34801561013557600080fd5b50610149610144366004611968565b6106fb565b005b34801561015757600080fd5b5061014961016636600461194f565b6109d7565b34801561017757600080fd5b506101c161018636600461194f565b60009081526001602081905260409091208054918101546002909101546001600160401b03600160201b8404811694600160601b9094041692565b60405161010d949392919061198a565b3480156101dd57600080fd5b506101496101ec36600461194f565b610aec565b3480156101fd57600080fd5b5061014961020c36600461194f565b610be0565b34801561021d57600080fd5b5061024161022c36600461194f565b60009081526001602052604090205460ff1690565b604051901515815260200161010d565b34801561025d57600080fd5b5061010361026c36600461194f565b600090815260016020526040902054610100900462ffffff1690565b34801561029457600080fd5b506102a86102a336600461194f565b610cda565b60405161010d94939291906119eb565b6101036102c6366004611923565b610d75565b3480156102d757600080fd5b506102ff7f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb70781565b6040516001600160a01b03909116815260200161010d565b34801561032357600080fd5b5061010360025481565b34801561033957600080fd5b5061039461034836600461194f565b600160208190526000918252604090912080549181015460029091015460ff83169262ffffff610100820416926001600160401b03600160201b8304811693600160601b909304169186565b60408051961515875262ffffff90951660208701526001600160401b039384169486019490945291166060840152608083015260a082015260c00161010d565b3480156103e057600080fd5b506101496103ef366004611a25565b610d88565b34801561040057600080fd5b506102417f000000000000000000000000000000000000000000000000000000000000000181565b34801561043457600080fd5b506102ff7f0000000000000000000000006e522449c1642e7cb0b12a2889ccbf79b51c69f881565b34801561046857600080fd5b506104956040518060400160405280600d81526020016c135a5b9d195c9110531a5b958d609a1b81525081565b60405161010d9190611a60565b3480156104ae57600080fd5b506101496104bd36600461194f565b61111f565b600060026000540361051b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600160205260409020805460ff161561058e5760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b6064820152608401610512565b6000610599846112e2565b9050803410156105eb5760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e74216044820152606401610512565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f0000000000000000000000006e522449c1642e7cb0b12a2889ccbf79b51c69f81690630d4d1513906064016020604051808303816000875af1158015610660573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106849190611a73565b825490935060001962ffffff61010090920482160116620f42408406036106b157815460ff191660011782555b6106dc84827f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7076113f8565b5050600160005592915050565b60006106f533836104c2565b92915050565b60405163a47d29cb60e01b81526004810183905282907f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7076001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610762573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107869190611a8c565b6001600160a01b0316336001600160a01b0316146107b65760405162461bcd60e51b815260040161051290611aa9565b604051630ea5613f60e01b81526004810184905260009081906001600160a01b037f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7071690630ea5613f9060240160c060405180830381865afa158015610820573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108449190611ae3565b50929550929350505050818411156108e45760405162461bcd60e51b815260206004820152605760248201527f43616e6e6f7420696e6372656173652070726f6a656374206d617820696e766f60448201527f636174696f6e732061626f766520636f726520636f6e7472616374207365742060648201527670726f6a656374206d617820696e766f636174696f6e7360481b608482015260a401610512565b808410156109665760405162461bcd60e51b815260206004820152604360248201527f43616e6e6f74207365742070726f6a656374206d617820696e766f636174696f60448201527f6e7320746f206c657373207468616e2063757272656e7420696e766f636174696064820152626f6e7360e81b608482015260a401610512565b60008581526001602052604090819020805460ff1962ffffff8816610100021663ffffffff19909116178387141790555185907f8445d32a2ee05956c6c842357ca16ee41e92657b1cbcbf1c94f500672e48c3b1906109c89087815260200190565b60405180910390a25050505050565b60405163230448b160e01b8152631576e14760e11b906001600160a01b037f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb707169063230448b190610a3090339030908690600401611b42565b6020604051808303816000875af1158015610a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a739190611b6f565b610a8f5760405162461bcd60e51b815260040161051290611b8a565b60008281526001602081905260408083208054600160201b600160a01b03191681559182018390556002820183905551909184917f2de6b284414d2e6b72bcc8d8d4de934e3f6410660a8f677c5c978f17f9cc2a929190a2505050565b60405163230448b160e01b8152632fc37ef160e01b906001600160a01b037f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb707169063230448b190610b4590339030908690600401611b42565b6020604051808303816000875af1158015610b64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b889190611b6f565b610ba45760405162461bcd60e51b815260040161051290611b8a565b60028290556040518281527f03c81e81b0ed0ca5444a9d70c9f3d1c78d79d6a31419f77736e886d092ed1a9e9060200160405180910390a15050565b60405163a47d29cb60e01b81526004810182905281907f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7076001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611a8c565b6001600160a01b0316336001600160a01b031614610c9b5760405162461bcd60e51b815260040161051290611aa9565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b6044820152606401610512565b600081815260016020819052604082209081015481549015159291606091839190600160201b90046001600160401b03164211610d1d5780600101549350610d4b565b8054600160601b90046001600160401b0316600003610d3f5760009350610d4b565b610d48866112e2565b93505b6040518060400160405280600381526020016208aa8960eb1b815250925060009150509193509193565b6000610d8183836104c2565b9392505050565b60405163a47d29cb60e01b81526004810186905285907f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7076001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610def573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e139190611a8c565b6001600160a01b0316336001600160a01b031614610e435760405162461bcd60e51b815260040161051290611aa9565b60008681526001602052604090208054600160201b90046001600160401b03161580610e7f57508054600160201b90046001600160401b031642105b610eca5760405162461bcd60e51b815260206004820152601c60248201527b27379036b7b234b334b1b0ba34b7b7399036b4b216b0bab1ba34b7b760211b6044820152606401610512565b854210610f105760405162461bcd60e51b81526020600482015260146024820152734f6e6c79206675747572652061756374696f6e7360601b6044820152606401610512565b858511610f765760405162461bcd60e51b815260206004820152602e60248201527f41756374696f6e20656e64206d7573742062652067726561746572207468616e60448201526d08185d58dd1a5bdb881cdd185c9d60921b6064820152608401610512565b600254610f839087611bd4565b851015610ff65760405162461bcd60e51b815260206004820152603b60248201527f41756374696f6e206c656e677468206d757374206265206174206c656173742060448201527a6d696e696d756d41756374696f6e4c656e6774685365636f6e647360281b6064820152608401610512565b8284116110685760405162461bcd60e51b815260206004820152603a60248201527f41756374696f6e207374617274207072696365206d7573742062652067726561604482015279746572207468616e2061756374696f6e20656e6420707269636560301b6064820152608401610512565b611071866114ae565b81546001600160401b0391909116600160201b0267ffffffffffffffff60201b199091161781556110a1856114ae565b81546001600160401b0391909116600160601b0267ffffffffffffffff60601b19909116178155600181018490556002810183905560405187907f38b3058b75696f9e45bffa9c4b237adcde13d74c7bc1bea63e13c712d0776c749061110e90899089908990899061198a565b60405180910390a250505050505050565b60405163a47d29cb60e01b81526004810182905281907f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7076001600160a01b03169063a47d29cb90602401602060405180830381865afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111aa9190611a8c565b6001600160a01b0316336001600160a01b0316146111da5760405162461bcd60e51b815260040161051290611aa9565b604051630ea5613f60e01b81526004810183905260009081906001600160a01b037f000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7071690630ea5613f9060240160c060405180830381865afa158015611244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112689190611ae3565b50505060008781526001602052604090819020805460ff1962ffffff8616610100021663ffffffff1990911617858514179055519194509192508591507f8445d32a2ee05956c6c842357ca16ee41e92657b1cbcbf1c94f500672e48c3b1906112d49085815260200190565b60405180910390a250505050565b60008181526001602081905260408220805491810154600282015491926001600160401b03600160201b8204811693600160601b9092041691904284106113655760405162461bcd60e51b8152602060048201526017602482015276105d58dd1a5bdb881b9bdd081e595d081cdd185c9d1959604a1b6044820152606401610512565b8242106113c157600083116113b75760405162461bcd60e51b81526020600482015260186024820152774f6e6c7920636f6e666967757265642061756374696f6e7360401b6044820152606401610512565b9695505050505050565b42849003848403828403816113d68285611be7565b6113e09190611bfe565b6113ea9086611c20565b9a9950505050505050505050565b34156114a95760008061140b8434611c20565b9050801561149b5760405133908290600081818185875af1925050503d8060008114611453576040519150601f19603f3d011682016040523d82523d6000602084013e611458565b606091505b5050809250508161149b5760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b6044820152606401610512565b6114a685858561151a565b50505b505050565b60006001600160401b038211156115165760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401610512565b5090565b6000821161152757505050565b60008060008060008060007f00000000000000000000000000000000000000000000000000000000000000011561169257604051638639415b60e01b8152600481018b9052602481018a905260009081906001600160a01b038b1690638639415b9060440161010060405180830381865afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce9190611c33565b969e50949c50909a5098509196509194509092509050811561168b576040516001600160a01b038216908390600081818185875af1925050503d8060008114611633576040519150601f19603f3d011682016040523d82523d6000602084013e611638565b606091505b5050809950508861168b5760405162461bcd60e51b815260206004820181905260248201527f506c6174666f726d2050726f7669646572207061796d656e74206661696c65646044820152606401610512565b5050611712565b604051638639415b60e01b8152600481018b9052602481018a90526001600160a01b03891690638639415b9060440160c060405180830381865afa1580156116de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117029190611cbb565b949a509298509096509450925090505b85156117b9576040516001600160a01b038616908790600081818185875af1925050503d8060008114611761576040519150601f19603f3d011682016040523d82523d6000602084013e611766565b606091505b505080975050866117b95760405162461bcd60e51b815260206004820152601e60248201527f52656e6465722050726f7669646572207061796d656e74206661696c656400006044820152606401610512565b8315611858576040516001600160a01b038416908590600081818185875af1925050503d8060008114611808576040519150601f19603f3d011682016040523d82523d6000602084013e61180d565b606091505b505080975050866118585760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b6044820152606401610512565b81156118ff576040516001600160a01b038216908390600081818185875af1925050503d80600081146118a7576040519150601f19603f3d011682016040523d82523d6000602084013e6118ac565b606091505b505080975050866118ff5760405162461bcd60e51b815260206004820152601f60248201527f4164646974696f6e616c205061796565207061796d656e74206661696c6564006044820152606401610512565b50505050505050505050565b6001600160a01b038116811461192057600080fd5b50565b6000806040838503121561193657600080fd5b82356119418161190b565b946020939093013593505050565b60006020828403121561196157600080fd5b5035919050565b6000806040838503121561197b57600080fd5b50508035926020909101359150565b93845260208401929092526040830152606082015260800190565b6000815180845260005b818110156119cb576020818501810151868301820152016119af565b506000602082860101526020601f19601f83011685010191505092915050565b8415158152836020820152608060408201526000611a0c60808301856119a5565b905060018060a01b038316606083015295945050505050565b600080600080600060a08688031215611a3d57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b602081526000610d8160208301846119a5565b600060208284031215611a8557600080fd5b5051919050565b600060208284031215611a9e57600080fd5b8151610d818161190b565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b80518015158114611ade57600080fd5b919050565b60008060008060008060c08789031215611afc57600080fd5b8651955060208701519450611b1360408801611ace565b9350611b2160608801611ace565b925060808701519150611b3660a08801611ace565b90509295509295509295565b6001600160a01b0393841681529190921660208201526001600160e01b0319909116604082015260600190565b600060208284031215611b8157600080fd5b610d8182611ace565b6020808252601a908201527913db9b1e4810dbdc994810591b5a5b9050d308185b1b1bddd95960321b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808201808211156106f5576106f5611bbe565b80820281158282048414176106f5576106f5611bbe565b600082611c1b57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156106f5576106f5611bbe565b600080600080600080600080610100898b031215611c5057600080fd5b885197506020890151611c628161190b565b60408a015160608b01519198509650611c7a8161190b565b60808a015160a08b01519196509450611c928161190b565b60c08a015160e08b01519194509250611caa8161190b565b809150509295985092959890939650565b60008060008060008060c08789031215611cd457600080fd5b865195506020870151611ce68161190b565b604088015160608901519196509450611cfe8161190b565b608088015160a08901519194509250611d168161190b565b80915050929550929550929556fea26469706673582212204c7f8b2e3beac8414f67b0e335e37b1c9e651c6d03e16ffefdb60a42c818d34564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb7070000000000000000000000006e522449c1642e7cb0b12a2889ccbf79b51c69f8
-----Decoded View---------------
Arg [0] : _genArt721Address (address): 0x145789247973C5D612bF121e9E4Eef84b63Eb707
Arg [1] : _minterFilter (address): 0x6E522449C1642E7cB0B12a2889CcBf79b51C69f8
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000145789247973c5d612bf121e9e4eef84b63eb707
Arg [1] : 0000000000000000000000006e522449c1642e7cb0b12a2889ccbf79b51c69f8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.