Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,258 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase | 19379772 | 361 days ago | IN | 0.06 ETH | 0.01432947 | ||||
Purchase | 19379771 | 361 days ago | IN | 0.06 ETH | 0.01570258 | ||||
Purchase | 19379549 | 361 days ago | IN | 0.06 ETH | 0.01472019 | ||||
Purchase | 19379339 | 361 days ago | IN | 0.06 ETH | 0.01548967 | ||||
Purchase | 19379336 | 361 days ago | IN | 0.06 ETH | 0.01622803 | ||||
Purchase | 19379200 | 361 days ago | IN | 0.06 ETH | 0.0142846 | ||||
Purchase | 19379198 | 361 days ago | IN | 0.06 ETH | 0.01527522 | ||||
Purchase | 19379189 | 361 days ago | IN | 0.06 ETH | 0.01530777 | ||||
Purchase | 19375914 | 361 days ago | IN | 0.06 ETH | 0.01496866 | ||||
Purchase | 19375622 | 362 days ago | IN | 0.06 ETH | 0.01303934 | ||||
Purchase | 19370642 | 362 days ago | IN | 0.06 ETH | 0.02308976 | ||||
Purchase | 19370637 | 362 days ago | IN | 0.06 ETH | 0.02098229 | ||||
Purchase | 19370632 | 362 days ago | IN | 0.06 ETH | 0.01871237 | ||||
Purchase | 19370589 | 362 days ago | IN | 0.06 ETH | 0.01972299 | ||||
Purchase | 19370576 | 362 days ago | IN | 0.06 ETH | 0.02155071 | ||||
Purchase | 19370568 | 362 days ago | IN | 0.06 ETH | 0.02122464 | ||||
Purchase | 19366168 | 363 days ago | IN | 0.06 ETH | 0.01605801 | ||||
Purchase | 19364349 | 363 days ago | IN | 0.06 ETH | 0.02036231 | ||||
Purchase | 19364199 | 363 days ago | IN | 0.06 ETH | 0.02134308 | ||||
Purchase | 19364136 | 363 days ago | IN | 0.06 ETH | 0.02215221 | ||||
Purchase | 18643484 | 464 days ago | IN | 0.25 ETH | 0.00647454 | ||||
Set Auction Deta... | 18643450 | 464 days ago | IN | 0 ETH | 0.00296348 | ||||
Set Project Max ... | 18643344 | 464 days ago | IN | 0 ETH | 0.00168203 | ||||
Reset Auction De... | 18643227 | 464 days ago | IN | 0 ETH | 0.00142001 | ||||
Purchase | 18643065 | 464 days ago | IN | 0.25 ETH | 0.00633436 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19379772 | 361 days ago | 0.04158 ETH | ||||
19379772 | 361 days ago | 0.01242 ETH | ||||
19379772 | 361 days ago | 0.006 ETH | ||||
19379771 | 361 days ago | 0.04158 ETH | ||||
19379771 | 361 days ago | 0.01242 ETH | ||||
19379771 | 361 days ago | 0.006 ETH | ||||
19379549 | 361 days ago | 0.04158 ETH | ||||
19379549 | 361 days ago | 0.01242 ETH | ||||
19379549 | 361 days ago | 0.006 ETH | ||||
19379339 | 361 days ago | 0.04158 ETH | ||||
19379339 | 361 days ago | 0.01242 ETH | ||||
19379339 | 361 days ago | 0.006 ETH | ||||
19379336 | 361 days ago | 0.04158 ETH | ||||
19379336 | 361 days ago | 0.01242 ETH | ||||
19379336 | 361 days ago | 0.006 ETH | ||||
19379200 | 361 days ago | 0.04158 ETH | ||||
19379200 | 361 days ago | 0.01242 ETH | ||||
19379200 | 361 days ago | 0.006 ETH | ||||
19379198 | 361 days ago | 0.04158 ETH | ||||
19379198 | 361 days ago | 0.01242 ETH | ||||
19379198 | 361 days ago | 0.006 ETH | ||||
19379189 | 361 days ago | 0.04158 ETH | ||||
19379189 | 361 days ago | 0.01242 ETH | ||||
19379189 | 361 days ago | 0.006 ETH | ||||
19375914 | 361 days ago | 0.04158 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GenArt721MinterDAExp_PBAB
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/IGenArt721CoreV2_PBAB.sol"; import "@openzeppelin-4.5/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin-4.5/contracts/utils/math/SafeCast.sol"; pragma solidity 0.8.17; /** * @title A minter contract that allows tokens to be minted with ETH. * Pricing is achieved using an automated Dutch-auction mechanism. * This is a fork of MinterDAExpV2, which is intended to be used directly * with IGenArt721CoreV2_PBAB contracts rather than with IGenArt721CoreContractV3 * and as such does not conform to IFilteredMinterV0 nor assume presence * of a IMinterFilterV0 conforming minter filter. * @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 allowlisted * (`isWhitelisted` conforming) addresses 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 core contract permissions and artist * addresses are secure behind a multi-sig or other access control mechanism. * ---------------------------------------------------------------------------- * The following functions are restricted to the core contract's allowlisted * (`isWhitelisted` conforming) address(es): * - setAllowablePriceDecayHalfLifeRangeSeconds (note: this range 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) * ---------------------------------------------------------------------------- * 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 GenArt721MinterDAExp_PBAB is ReentrancyGuard { using SafeCast for uint256; /// Auction details updated for project `projectId`. event SetAuctionDetails( uint256 indexed projectId, uint256 _auctionTimestampStart, uint256 _priceDecayHalfLifeSeconds, uint256 _startPrice, uint256 _basePrice ); /// Auction details cleared for project `projectId`. event ResetAuctionDetails(uint256 indexed projectId); /// Maximum and minimum allowed price decay half lifes updated. event AuctionHalfLifeRangeSecondsUpdated( uint256 _minimumPriceDecayHalfLifeSeconds, uint256 _maximumPriceDecayHalfLifeSeconds ); /// Core contract address this minter interacts with address public immutable genArt721CoreAddress; /// This contract handles cores with interface IGenArt721CoreV2_PBAB IGenArt721CoreV2_PBAB private immutable genArtCoreContract; uint256 constant ONE_MILLION = 1_000_000; address payable public ownerAddress; uint256 public ownerPercentage; struct ProjectConfig { bool maxHasBeenInvoked; uint24 maxInvocations; // max uint64 ~= 1.8e19 sec ~= 570 billion years uint64 timestampStart; uint64 priceDecayHalfLifeSeconds; uint256 startPrice; uint256 basePrice; } mapping(uint256 => ProjectConfig) public projectConfig; /// Minimum price decay half life: price must decay with a half life of at /// least this amount (must cut in half at least every N seconds). uint256 public minimumPriceDecayHalfLifeSeconds = 300; // 5 minutes /// Maximum price decay half life: price may decay with a half life of no /// more than this amount (may cut in half at no more than every N seconds). uint256 public maximumPriceDecayHalfLifeSeconds = 3600; // 60 minutes // modifier to restrict access to only addresses specified by the // `onlyWhitelisted()` method on the associated core contract modifier onlyCoreAllowlisted() { require( genArtCoreContract.isWhitelisted(msg.sender), "Only Core allowlisted" ); _; } // modifier to restrict access to only the artist for a given project modifier onlyArtist(uint256 _projectId) { require( (msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId)), "Only Artist" ); _; } // modifier to restrict access to calls only involving a valid projectId // (an existing project) modifier onlyValidProjectId(uint256 _projectId) { require( _projectId < genArtCoreContract.nextProjectId(), "Only existing projects" ); _; } /** * @notice Initializes contract to be integrated with * Art Blocks core contract at address `_genArt721Address`. * @param _genArt721Address Art Blocks core contract address for * which this contract will be a minter. */ constructor(address _genArt721Address) ReentrancyGuard() { genArt721CoreAddress = _genArt721Address; genArtCoreContract = IGenArt721CoreV2_PBAB(_genArt721Address); } /** * @notice Sets the minter owner (the platform provider) address to `_ownerAddress`. * @param _ownerAddress New owner address. */ function setOwnerAddress( address payable _ownerAddress ) public onlyCoreAllowlisted { ownerAddress = _ownerAddress; } /** * @notice Sets the minter owner (the platform provider) revenue % to `_ownerPercentage` percent. * @param _ownerPercentage New owner percentage. */ function setOwnerPercentage( uint256 _ownerPercentage ) public onlyCoreAllowlisted { ownerPercentage = _ownerPercentage; } /** * @notice Syncs local maximum invocations of project `_projectId` based on * the value currently defined in the core contract. Only used for gas * optimization of mints after maxInvocations has been reached. * @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. * @dev function is intentionally not gated to any specific access control; * it only syncs a local state variable to the core contract's state. */ function setProjectMaxInvocations(uint256 _projectId) external { uint256 maxInvocations; uint256 invocations; (, , invocations, maxInvocations, , , , , ) = genArtCoreContract .projectTokenInfo(_projectId); // update storage with results projectConfig[_projectId].maxInvocations = uint24(maxInvocations); if (invocations < maxInvocations) { projectConfig[_projectId].maxHasBeenInvoked = false; } } /** * @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 V2 engine 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 * V2 engine 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 priceDecayHalfLifeSeconds, uint256 startPrice, uint256 basePrice ) { ProjectConfig storage _projectConfig = projectConfig[_projectId]; return ( _projectConfig.timestampStart, _projectConfig.priceDecayHalfLifeSeconds, _projectConfig.startPrice, _projectConfig.basePrice ); } /** * @notice Sets the minimum and maximum values that are settable for * `_priceDecayHalfLifeSeconds` across all projects. * @param _minimumPriceDecayHalfLifeSeconds Minimum price decay half life * (in seconds). * @param _maximumPriceDecayHalfLifeSeconds Maximum price decay half life * (in seconds). */ function setAllowablePriceDecayHalfLifeRangeSeconds( uint256 _minimumPriceDecayHalfLifeSeconds, uint256 _maximumPriceDecayHalfLifeSeconds ) external onlyCoreAllowlisted { require( _maximumPriceDecayHalfLifeSeconds > _minimumPriceDecayHalfLifeSeconds, "Maximum half life must be greater than minimum" ); require( _minimumPriceDecayHalfLifeSeconds > 0, "Half life of zero not allowed" ); minimumPriceDecayHalfLifeSeconds = _minimumPriceDecayHalfLifeSeconds; maximumPriceDecayHalfLifeSeconds = _maximumPriceDecayHalfLifeSeconds; emit AuctionHalfLifeRangeSecondsUpdated( _minimumPriceDecayHalfLifeSeconds, _maximumPriceDecayHalfLifeSeconds ); } ////// 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 _priceDecayHalfLifeSeconds The half life with which to decay the * price (in seconds). * @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 _priceDecayHalfLifeSeconds, uint256 _startPrice, uint256 _basePrice ) external onlyValidProjectId(_projectId) 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( _startPrice >= _basePrice, "Auction start price must be greater than or equal to auction end price" ); require( (_priceDecayHalfLifeSeconds >= minimumPriceDecayHalfLifeSeconds) && (_priceDecayHalfLifeSeconds <= maximumPriceDecayHalfLifeSeconds), "Price decay half life must fall between min and max allowable values" ); // EFFECTS _projectConfig.timestampStart = _auctionTimestampStart.toUint64(); _projectConfig.priceDecayHalfLifeSeconds = _priceDecayHalfLifeSeconds .toUint64(); _projectConfig.startPrice = _startPrice; _projectConfig.basePrice = _basePrice; emit SetAuctionDetails( _projectId, _auctionTimestampStart, _priceDecayHalfLifeSeconds, _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 onlyCoreAllowlisted onlyValidProjectId(_projectId) { ProjectConfig storage _projectConfig = projectConfig[_projectId]; // reset to initial values _projectConfig.timestampStart = 0; _projectConfig.priceDecayHalfLifeSeconds = 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 currentPriceInWei = _getPrice(_projectId); require( msg.value >= currentPriceInWei, "Must send minimum value to mint!" ); // EFFECTS tokenId = genArtCoreContract.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 _splitFundsETHAuction(_projectId, currentPriceInWei); return tokenId; } /** * @dev splits ETH funds between sender (if refund), foundation, * 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. * @param _projectId Project ID for which funds shall be split. * @param _currentPriceInWei Current price of token, in Wei. */ function _splitFundsETHAuction( uint256 _projectId, uint256 _currentPriceInWei ) internal { if (msg.value > 0) { bool success_; // send refund to sender uint256 refund = msg.value - _currentPriceInWei; if (refund > 0) { (success_, ) = msg.sender.call{value: refund}(""); require(success_, "Refund failed"); } // split remaining funds between render provider, platform provider, // artist, and artist's additional payee uint256 remainingFunds = _currentPriceInWei; // Render provider payment uint256 renderProviderAmount = (remainingFunds * genArtCoreContract.renderProviderPercentage()) / 100; if (renderProviderAmount > 0) { (success_, ) = genArtCoreContract.renderProviderAddress().call{ value: renderProviderAmount }(""); require(success_, "Renderer payment failed"); remainingFunds -= renderProviderAmount; } // Owner (platform provider) payment uint256 ownerFunds = (remainingFunds * ownerPercentage) / 100; if (ownerFunds > 0) { (success_, ) = ownerAddress.call{value: ownerFunds}(""); require(success_, "Owner payment failed"); remainingFunds -= ownerFunds; } // Artist additional payee payment uint256 additionalPayeePercentage = genArtCoreContract .projectIdToAdditionalPayeePercentage(_projectId); if (additionalPayeePercentage > 0) { uint256 additionalPayeeAmount = (remainingFunds * additionalPayeePercentage) / 100; if (additionalPayeeAmount > 0) { (success_, ) = genArtCoreContract .projectIdToAdditionalPayee(_projectId) .call{value: additionalPayeeAmount}(""); require(success_, "Additional payment failed"); remainingFunds -= additionalPayeeAmount; } } // Artist payment if (remainingFunds > 0) { (success_, ) = genArtCoreContract .projectIdToArtistAddress(_projectId) .call{value: remainingFunds}(""); require(success_, "Artist payment failed"); } } } /** * @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 * @dev This method calculates price decay using a linear interpolation * of exponential decay based on the artist-provided half-life for price * decay, `_priceDecayHalfLifeSeconds`. */ 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 _priceDecayHalfLifeSeconds = uint256( _projectConfig.priceDecayHalfLifeSeconds ); uint256 _basePrice = _projectConfig.basePrice; require(block.timestamp > _timestampStart, "Auction not yet started"); require(_priceDecayHalfLifeSeconds > 0, "Only configured auctions"); uint256 decayedPrice = _projectConfig.startPrice; uint256 elapsedTimeSeconds; // Return early if configured in "fixed price mode" for gas efficiency if (decayedPrice /* startPrice */ == _basePrice) { return _basePrice; } unchecked { // already checked that block.timestamp > _timestampStart above elapsedTimeSeconds = block.timestamp - _timestampStart; } // Divide by two (via bit-shifting) for the number of entirely completed // half-lives that have elapsed since auction start time. unchecked { // already required _priceDecayHalfLifeSeconds > 0 decayedPrice >>= elapsedTimeSeconds / _priceDecayHalfLifeSeconds; } // Perform a linear interpolation between partial half-life points, to // approximate the current place on a perfect exponential decay curve. unchecked { // value of expression is provably always less than decayedPrice, // so no underflow is possible when the subtraction assignment // operator is used on decayedPrice. decayedPrice -= (decayedPrice * (elapsedTimeSeconds % _priceDecayHalfLifeSeconds)) / _priceDecayHalfLifeSeconds / 2; } if (decayedPrice < _basePrice) { // Price may not decay below stay `basePrice`. return _basePrice; } return decayedPrice; } /** * @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.startPrice == 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: LGPL-3.0-only // Created By: Art Blocks Inc. pragma solidity ^0.8.0; interface IGenArt721CoreV2_PBAB { /** * @notice Token ID `_tokenId` minted on project ID `_projectId` to `_to`. */ event Mint( address indexed _to, uint256 indexed _tokenId, uint256 indexed _projectId ); // getter function of public variable function admin() external view returns (address); // getter function of public variable function nextProjectId() external view returns (uint256); // getter function of public mapping function tokenIdToProjectId( uint256 tokenId ) external view returns (uint256 projectId); function isWhitelisted(address sender) external view returns (bool); function projectIdToCurrencySymbol( uint256 _projectId ) external view returns (string memory); function projectIdToCurrencyAddress( uint256 _projectId ) external view returns (address); function projectIdToArtistAddress( uint256 _projectId ) external view returns (address payable); function projectIdToPricePerTokenInWei( uint256 _projectId ) external view returns (uint256); function projectIdToAdditionalPayee( uint256 _projectId ) external view returns (address payable); function projectIdToAdditionalPayeePercentage( uint256 _projectId ) external view returns (uint256); function projectTokenInfo( uint256 _projectId ) external view returns ( address, uint256, uint256, uint256, bool, address, uint256, string memory, address ); function renderProviderAddress() external view returns (address payable); function renderProviderPercentage() external view returns (uint256); function mint( address _to, uint256 _projectId, address _by ) external returns (uint256 tokenId); function getRoyaltyData( uint256 _tokenId ) external view returns ( address artistAddress, address additionalPayee, uint256 additionalPayeePercentage, uint256 royaltyFeeByID ); }
{ "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
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_genArt721Address","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_minimumPriceDecayHalfLifeSeconds","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maximumPriceDecayHalfLifeSeconds","type":"uint256"}],"name":"AuctionHalfLifeRangeSecondsUpdated","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":"_priceDecayHalfLifeSeconds","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":"maximumPriceDecayHalfLifeSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumPriceDecayHalfLifeSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"}],"name":"projectAuctionParameters","outputs":[{"internalType":"uint256","name":"timestampStart","type":"uint256"},{"internalType":"uint256","name":"priceDecayHalfLifeSeconds","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":"priceDecayHalfLifeSeconds","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":"_minimumPriceDecayHalfLifeSeconds","type":"uint256"},{"internalType":"uint256","name":"_maximumPriceDecayHalfLifeSeconds","type":"uint256"}],"name":"setAllowablePriceDecayHalfLifeRangeSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_projectId","type":"uint256"},{"internalType":"uint256","name":"_auctionTimestampStart","type":"uint256"},{"internalType":"uint256","name":"_priceDecayHalfLifeSeconds","type":"uint256"},{"internalType":"uint256","name":"_startPrice","type":"uint256"},{"internalType":"uint256","name":"_basePrice","type":"uint256"}],"name":"setAuctionDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_ownerAddress","type":"address"}],"name":"setOwnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ownerPercentage","type":"uint256"}],"name":"setOwnerPercentage","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
60c060405261012c600455610e1060055534801561001c57600080fd5b50604051611f52380380611f5283398101604081905261003b91610056565b60016000556001600160a01b0316608081905260a052610086565b60006020828403121561006857600080fd5b81516001600160a01b038116811461007f57600080fd5b9392505050565b60805160a051611e4561010d600039600081816105d3015281816106ad01528181610742015281816108540152818161091f015281816109ce01528181610b6701528181610cf901528181610daf01528181611113015281816113d10152818161146f0152818161167e0152818161172f015261186b015260006103400152611e456000f3fe6080604052600436106100f65760003560e01c80619987146100fb578061b460146101215780632aedc28e146101345780632f077ee614610156578063331a6bf5146101bb578063393b011c146101db57806340d1397e146101fb57806341da75551461021b578063462add461461023157806356690aaf146102715780635bc1470f146102a8578063774159c6146102be578063891407c0146102ee5780638f84aa091461030157806392a10f831461032e578063c0ad212e14610362578063c71b1b7114610382578063cd379f6e14610428578063cf6681ea14610448578063efef39a114610121578063f7bd4b881461045e575b600080fd5b61010e610109366004611a07565b61047e565b6040519081526020015b60405180910390f35b61010e61012f366004611a33565b610684565b34801561014057600080fd5b5061015461014f366004611a33565b610696565b005b34801561016257600080fd5b506101ab610171366004611a33565b6000908152600360205260409020805460018201546002909201546001600160401b03600160201b8304811694600160601b909304169291565b6040516101189493929190611a4c565b3480156101c757600080fd5b506101546101d6366004611a67565b61083d565b3480156101e757600080fd5b506101546101f6366004611a33565b610908565b34801561020757600080fd5b50610154610216366004611a33565b6109b6565b34801561022757600080fd5b5061010e60025481565b34801561023d57600080fd5b5061026161024c366004611a33565b60009081526003602052604090205460ff1690565b6040519015158152602001610118565b34801561027d57600080fd5b5061010e61028c366004611a33565b600090815260036020526040902054610100900462ffffff1690565b3480156102b457600080fd5b5061010e60055481565b3480156102ca57600080fd5b506102de6102d9366004611a33565b610ab0565b6040516101189493929190611aa8565b61010e6102fc366004611a07565b610b3d565b34801561030d57600080fd5b50600154610321906001600160a01b031681565b6040516101189190611afc565b34801561033a57600080fd5b506103217f000000000000000000000000000000000000000000000000000000000000000081565b34801561036e57600080fd5b5061015461037d366004611b10565b610b50565b34801561038e57600080fd5b506103e861039d366004611a33565b60036020526000908152604090208054600182015460029092015460ff82169262ffffff610100840416926001600160401b03600160201b8204811693600160601b90920416919086565b60408051961515875262ffffff90951660208701526001600160401b039384169486019490945291166060840152608083015260a082015260c001610118565b34801561043457600080fd5b50610154610443366004611b32565b610cf6565b34801561045457600080fd5b5061010e60045481565b34801561046a57600080fd5b50610154610479366004611a33565b6110f0565b60006002600054036104d75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600360205260409020805460ff161561054a5760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b60648201526084016104ce565b6000610555846111d7565b9050803410156105a75760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016104ce565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f00000000000000000000000000000000000000000000000000000000000000001690630d4d1513906064016020604051808303816000875af115801561061c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106409190611b6d565b825490935060001962ffffff61010090920482160116620f424084060361066d57815460ff191660011782555b6106778482611323565b5050600160005592915050565b6000610690338361047e565b92915050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf906106e2903390600401611afc565b602060405180830381865afa1580156106ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107239190611bb1565b61073f5760405162461bcd60e51b81526004016104ce90611bcc565b807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c29190611b6d565b81106107e05760405162461bcd60e51b81526004016104ce90611bfb565b6000828152600360205260408082208054600160201b600160a01b031916815560018101839055600281018390559051909184917f2de6b284414d2e6b72bcc8d8d4de934e3f6410660a8f677c5c978f17f9cc2a929190a2505050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf90610889903390600401611afc565b602060405180830381865afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190611bb1565b6108e65760405162461bcd60e51b81526004016104ce90611bcc565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf90610954903390600401611afc565b602060405180830381865afa158015610971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109959190611bb1565b6109b15760405162461bcd60e51b81526004016104ce90611bcc565b600255565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190611c2b565b6001600160a01b0316336001600160a01b031614610a715760405162461bcd60e51b81526004016104ce90611c48565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016104ce565b6000818152600360205260408120600181015481549015159291606091839190600160201b90046001600160401b03164211610af25780600101549350610b13565b8060010154600003610b075760009350610b13565b610b10866111d7565b93505b6040518060400160405280600381526020016208aa8960eb1b815250925060009150509193509193565b6000610b49838361047e565b9392505050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633af32abf90610b9c903390600401611afc565b602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190611bb1565b610bf95760405162461bcd60e51b81526004016104ce90611bcc565b818111610c5f5760405162461bcd60e51b815260206004820152602e60248201527f4d6178696d756d2068616c66206c696665206d7573742062652067726561746560448201526d72207468616e206d696e696d756d60901b60648201526084016104ce565b60008211610caf5760405162461bcd60e51b815260206004820152601d60248201527f48616c66206c696665206f66207a65726f206e6f7420616c6c6f77656400000060448201526064016104ce565b6004829055600581905560408051838152602081018390527f1d5d9c9b660aace5432c6c7412456d0ad1b5ff4c6ea156a8c551ba93555ed73f910160405180910390a15050565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611b6d565b8110610d975760405162461bcd60e51b81526004016104ce90611bfb565b60405163a47d29cb60e01b81526004810187905286907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190611c2b565b6001600160a01b0316336001600160a01b031614610e525760405162461bcd60e51b81526004016104ce90611c48565b60008781526003602052604090208054600160201b90046001600160401b03161580610e8e57508054600160201b90046001600160401b031642105b610ed95760405162461bcd60e51b815260206004820152601c60248201527b27379036b7b234b334b1b0ba34b7b7399036b4b216b0bab1ba34b7b760211b60448201526064016104ce565b864210610f1f5760405162461bcd60e51b81526020600482015260146024820152734f6e6c79206675747572652061756374696f6e7360601b60448201526064016104ce565b83851015610fa45760405162461bcd60e51b815260206004820152604660248201527f41756374696f6e207374617274207072696365206d757374206265206772656160448201527f746572207468616e206f7220657175616c20746f2061756374696f6e20656e6460648201526520707269636560d01b608482015260a4016104ce565b6004548610158015610fb857506005548611155b6110385760405162461bcd60e51b8152602060048201526044602482018190527f50726963652064656361792068616c66206c696665206d7573742066616c6c20908201527f6265747765656e206d696e20616e64206d617820616c6c6f7761626c652076616064820152636c75657360e01b608482015260a4016104ce565b61104187611983565b81546001600160401b0391909116600160201b0267ffffffffffffffff60201b1990911617815561107186611983565b81546001600160401b0391909116600160601b0267ffffffffffffffff60601b19909116178155600181018590556002810184905560405188907f38b3058b75696f9e45bffa9c4b237adcde13d74c7bc1bea63e13c712d0776c74906110de908a908a908a908a90611a4c565b60405180910390a25050505050505050565b6040516346161b1160e11b81526004810182905260009081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638c2c362290602401600060405180830381865afa15801561115a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111829190810190611c8e565b5050506000898152600360205260409020805463ffffff00191661010062ffffff86160217905550909550909350505050818110156111d2576000838152600360205260409020805460ff191690555b505050565b6000818152600360205260408120805460028201546001600160401b03600160201b8304811692600160601b900416904283106112505760405162461bcd60e51b8152602060048201526017602482015276105d58dd1a5bdb881b9bdd081e595d081cdd185c9d1959604a1b60448201526064016104ce565b6000821161129b5760405162461bcd60e51b81526020600482015260186024820152774f6e6c7920636f6e666967757265642061756374696f6e7360401b60448201526064016104ce565b600184015460008282036112b55750909695505050505050565b84420390508381816112c9576112c9611b86565b0482901c91506002848583816112e1576112e1611b86565b068402816112f1576112f1611b86565b04816112ff576112ff611b86565b0482039150828210156113185750909695505050505050565b509695505050505050565b341561197f576000806113368334611dc3565b905080156113c65760405133908290600081818185875af1925050503d806000811461137e576040519150601f19603f3d011682016040523d82523d6000602084013e611383565b606091505b505080925050816113c65760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016104ce565b6000839050600060647f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e9eb74f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561142d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114519190611b6d565b61145b9084611dd6565b6114659190611ded565b90508015611598577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cfbf4d976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef9190611c2b565b6001600160a01b03168160405160006040518083038185875af1925050503d8060008114611539576040519150601f19603f3d011682016040523d82523d6000602084013e61153e565b606091505b5050809450508361158b5760405162461bcd60e51b815260206004820152601760248201527614995b99195c995c881c185e5b595b9d0819985a5b1959604a1b60448201526064016104ce565b6115958183611dc3565b91505b60006064600254846115aa9190611dd6565b6115b49190611ded565b90508015611665576001546040516001600160a01b03909116908290600081818185875af1925050503d8060008114611609576040519150601f19603f3d011682016040523d82523d6000602084013e61160e565b606091505b505080955050846116585760405162461bcd60e51b815260206004820152601460248201527313dddb995c881c185e5b595b9d0819985a5b195960621b60448201526064016104ce565b6116628184611dc3565b92505b60405163cc74234b60e01b8152600481018890526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cc74234b90602401602060405180830381865afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f19190611b6d565b9050801561184f57600060646117078387611dd6565b6117119190611ded565b9050801561184d57604051636bd8225b60e11b8152600481018a90527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d7b044b690602401602060405180830381865afa15801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190611c2b565b6001600160a01b03168160405160006040518083038185875af1925050503d80600081146117ec576040519150601f19603f3d011682016040523d82523d6000602084013e6117f1565b606091505b505080975050866118405760405162461bcd60e51b81526020600482015260196024820152781059191a5d1a5bdb985b081c185e5b595b9d0819985a5b1959603a1b60448201526064016104ce565b61184a8186611dc3565b94505b505b83156119785760405163a47d29cb60e01b8152600481018990527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d29cb90602401602060405180830381865afa1580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de9190611c2b565b6001600160a01b03168460405160006040518083038185875af1925050503d8060008114611928576040519150601f19603f3d011682016040523d82523d6000602084013e61192d565b606091505b505080965050856119785760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b60448201526064016104ce565b5050505050505b5050565b60006001600160401b038211156119eb5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016104ce565b5090565b6001600160a01b0381168114611a0457600080fd5b50565b60008060408385031215611a1a57600080fd5b8235611a25816119ef565b946020939093013593505050565b600060208284031215611a4557600080fd5b5035919050565b93845260208401929092526040830152606082015260800190565b600060208284031215611a7957600080fd5b8135610b49816119ef565b60005b83811015611a9f578181015183820152602001611a87565b50506000910152565b84151581528360208201526080604082015260008351806080840152611ad58160a0850160208801611a84565b6001600160a01b0393909316606083015250601f91909101601f19160160a0019392505050565b6001600160a01b0391909116815260200190565b60008060408385031215611b2357600080fd5b50508035926020909101359150565b600080600080600060a08688031215611b4a57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208284031215611b7f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b80518015158114611bac57600080fd5b919050565b600060208284031215611bc357600080fd5b610b4982611b9c565b60208082526015908201527413db9b1e4810dbdc9948185b1b1bdddb1a5cdd1959605a1b604082015260600190565b6020808252601690820152754f6e6c79206578697374696e672070726f6a6563747360501b604082015260600190565b600060208284031215611c3d57600080fd5b8151610b49816119ef565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b8051611bac816119ef565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060008060006101208a8c031215611cad57600080fd5b8951611cb8816119ef565b8099505060208a0151975060408a0151965060608a01519550611cdd60808b01611b9c565b945060a08a0151611ced816119ef565b60c08b015160e08c015191955093506001600160401b0380821115611d1157600080fd5b818c0191508c601f830112611d2557600080fd5b815181811115611d3757611d37611c78565b604051601f8201601f19908116603f01168101908382118183101715611d5f57611d5f611c78565b816040528281528f6020848701011115611d7857600080fd5b611d89836020830160208801611a84565b8096505050505050611d9e6101008b01611c6d565b90509295985092959850929598565b634e487b7160e01b600052601160045260246000fd5b8181038181111561069057610690611dad565b808202811582820484141761069057610690611dad565b600082611e0a57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122027bd2dfd22f642f84e4d6d906ea5daa3b536958105d4b2355c9d2f77423ae49264736f6c6343000811003300000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f436
Deployed Bytecode
0x6080604052600436106100f65760003560e01c80619987146100fb578061b460146101215780632aedc28e146101345780632f077ee614610156578063331a6bf5146101bb578063393b011c146101db57806340d1397e146101fb57806341da75551461021b578063462add461461023157806356690aaf146102715780635bc1470f146102a8578063774159c6146102be578063891407c0146102ee5780638f84aa091461030157806392a10f831461032e578063c0ad212e14610362578063c71b1b7114610382578063cd379f6e14610428578063cf6681ea14610448578063efef39a114610121578063f7bd4b881461045e575b600080fd5b61010e610109366004611a07565b61047e565b6040519081526020015b60405180910390f35b61010e61012f366004611a33565b610684565b34801561014057600080fd5b5061015461014f366004611a33565b610696565b005b34801561016257600080fd5b506101ab610171366004611a33565b6000908152600360205260409020805460018201546002909201546001600160401b03600160201b8304811694600160601b909304169291565b6040516101189493929190611a4c565b3480156101c757600080fd5b506101546101d6366004611a67565b61083d565b3480156101e757600080fd5b506101546101f6366004611a33565b610908565b34801561020757600080fd5b50610154610216366004611a33565b6109b6565b34801561022757600080fd5b5061010e60025481565b34801561023d57600080fd5b5061026161024c366004611a33565b60009081526003602052604090205460ff1690565b6040519015158152602001610118565b34801561027d57600080fd5b5061010e61028c366004611a33565b600090815260036020526040902054610100900462ffffff1690565b3480156102b457600080fd5b5061010e60055481565b3480156102ca57600080fd5b506102de6102d9366004611a33565b610ab0565b6040516101189493929190611aa8565b61010e6102fc366004611a07565b610b3d565b34801561030d57600080fd5b50600154610321906001600160a01b031681565b6040516101189190611afc565b34801561033a57600080fd5b506103217f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f43681565b34801561036e57600080fd5b5061015461037d366004611b10565b610b50565b34801561038e57600080fd5b506103e861039d366004611a33565b60036020526000908152604090208054600182015460029092015460ff82169262ffffff610100840416926001600160401b03600160201b8204811693600160601b90920416919086565b60408051961515875262ffffff90951660208701526001600160401b039384169486019490945291166060840152608083015260a082015260c001610118565b34801561043457600080fd5b50610154610443366004611b32565b610cf6565b34801561045457600080fd5b5061010e60045481565b34801561046a57600080fd5b50610154610479366004611a33565b6110f0565b60006002600054036104d75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b60026000908155828152600360205260409020805460ff161561054a5760405162461bcd60e51b815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e732072656044820152641858da195960da1b60648201526084016104ce565b6000610555846111d7565b9050803410156105a75760405162461bcd60e51b815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e742160448201526064016104ce565b604051630d4d151360e01b81526001600160a01b038681166004830152602482018690523360448301527f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4361690630d4d1513906064016020604051808303816000875af115801561061c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106409190611b6d565b825490935060001962ffffff61010090920482160116620f424084060361066d57815460ff191660011782555b6106778482611323565b5050600160005592915050565b6000610690338361047e565b92915050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4361690633af32abf906106e2903390600401611afc565b602060405180830381865afa1580156106ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107239190611bb1565b61073f5760405162461bcd60e51b81526004016104ce90611bcc565b807f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa15801561079e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c29190611b6d565b81106107e05760405162461bcd60e51b81526004016104ce90611bfb565b6000828152600360205260408082208054600160201b600160a01b031916815560018101839055600281018390559051909184917f2de6b284414d2e6b72bcc8d8d4de934e3f6410660a8f677c5c978f17f9cc2a929190a2505050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4361690633af32abf90610889903390600401611afc565b602060405180830381865afa1580156108a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ca9190611bb1565b6108e65760405162461bcd60e51b81526004016104ce90611bcc565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4361690633af32abf90610954903390600401611afc565b602060405180830381865afa158015610971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109959190611bb1565b6109b15760405162461bcd60e51b81526004016104ce90611bcc565b600255565b60405163a47d29cb60e01b81526004810182905281907f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a419190611c2b565b6001600160a01b0316336001600160a01b031614610a715760405162461bcd60e51b81526004016104ce90611c48565b60405162461bcd60e51b81526020600482015260146024820152731058dd1a5bdb881b9bdd081cdd5c1c1bdc9d195960621b60448201526064016104ce565b6000818152600360205260408120600181015481549015159291606091839190600160201b90046001600160401b03164211610af25780600101549350610b13565b8060010154600003610b075760009350610b13565b610b10866111d7565b93505b6040518060400160405280600381526020016208aa8960eb1b815250925060009150509193509193565b6000610b49838361047e565b9392505050565b604051633af32abf60e01b81526001600160a01b037f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4361690633af32abf90610b9c903390600401611afc565b602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190611bb1565b610bf95760405162461bcd60e51b81526004016104ce90611bcc565b818111610c5f5760405162461bcd60e51b815260206004820152602e60248201527f4d6178696d756d2068616c66206c696665206d7573742062652067726561746560448201526d72207468616e206d696e696d756d60901b60648201526084016104ce565b60008211610caf5760405162461bcd60e51b815260206004820152601d60248201527f48616c66206c696665206f66207a65726f206e6f7420616c6c6f77656400000060448201526064016104ce565b6004829055600581905560408051838152602081018390527f1d5d9c9b660aace5432c6c7412456d0ad1b5ff4c6ea156a8c551ba93555ed73f910160405180910390a15050565b847f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b031663e935b7b16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d799190611b6d565b8110610d975760405162461bcd60e51b81526004016104ce90611bfb565b60405163a47d29cb60e01b81526004810187905286907f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b03169063a47d29cb90602401602060405180830381865afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e229190611c2b565b6001600160a01b0316336001600160a01b031614610e525760405162461bcd60e51b81526004016104ce90611c48565b60008781526003602052604090208054600160201b90046001600160401b03161580610e8e57508054600160201b90046001600160401b031642105b610ed95760405162461bcd60e51b815260206004820152601c60248201527b27379036b7b234b334b1b0ba34b7b7399036b4b216b0bab1ba34b7b760211b60448201526064016104ce565b864210610f1f5760405162461bcd60e51b81526020600482015260146024820152734f6e6c79206675747572652061756374696f6e7360601b60448201526064016104ce565b83851015610fa45760405162461bcd60e51b815260206004820152604660248201527f41756374696f6e207374617274207072696365206d757374206265206772656160448201527f746572207468616e206f7220657175616c20746f2061756374696f6e20656e6460648201526520707269636560d01b608482015260a4016104ce565b6004548610158015610fb857506005548611155b6110385760405162461bcd60e51b8152602060048201526044602482018190527f50726963652064656361792068616c66206c696665206d7573742066616c6c20908201527f6265747765656e206d696e20616e64206d617820616c6c6f7761626c652076616064820152636c75657360e01b608482015260a4016104ce565b61104187611983565b81546001600160401b0391909116600160201b0267ffffffffffffffff60201b1990911617815561107186611983565b81546001600160401b0391909116600160601b0267ffffffffffffffff60601b19909116178155600181018590556002810184905560405188907f38b3058b75696f9e45bffa9c4b237adcde13d74c7bc1bea63e13c712d0776c74906110de908a908a908a908a90611a4c565b60405180910390a25050505050505050565b6040516346161b1160e11b81526004810182905260009081906001600160a01b037f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4361690638c2c362290602401600060405180830381865afa15801561115a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111829190810190611c8e565b5050506000898152600360205260409020805463ffffff00191661010062ffffff86160217905550909550909350505050818110156111d2576000838152600360205260409020805460ff191690555b505050565b6000818152600360205260408120805460028201546001600160401b03600160201b8304811692600160601b900416904283106112505760405162461bcd60e51b8152602060048201526017602482015276105d58dd1a5bdb881b9bdd081e595d081cdd185c9d1959604a1b60448201526064016104ce565b6000821161129b5760405162461bcd60e51b81526020600482015260186024820152774f6e6c7920636f6e666967757265642061756374696f6e7360401b60448201526064016104ce565b600184015460008282036112b55750909695505050505050565b84420390508381816112c9576112c9611b86565b0482901c91506002848583816112e1576112e1611b86565b068402816112f1576112f1611b86565b04816112ff576112ff611b86565b0482039150828210156113185750909695505050505050565b509695505050505050565b341561197f576000806113368334611dc3565b905080156113c65760405133908290600081818185875af1925050503d806000811461137e576040519150601f19603f3d011682016040523d82523d6000602084013e611383565b606091505b505080925050816113c65760405162461bcd60e51b815260206004820152600d60248201526c1499599d5b990819985a5b1959609a1b60448201526064016104ce565b6000839050600060647f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b0316632e9eb74f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561142d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114519190611b6d565b61145b9084611dd6565b6114659190611ded565b90508015611598577f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b031663cfbf4d976040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ef9190611c2b565b6001600160a01b03168160405160006040518083038185875af1925050503d8060008114611539576040519150601f19603f3d011682016040523d82523d6000602084013e61153e565b606091505b5050809450508361158b5760405162461bcd60e51b815260206004820152601760248201527614995b99195c995c881c185e5b595b9d0819985a5b1959604a1b60448201526064016104ce565b6115958183611dc3565b91505b60006064600254846115aa9190611dd6565b6115b49190611ded565b90508015611665576001546040516001600160a01b03909116908290600081818185875af1925050503d8060008114611609576040519150601f19603f3d011682016040523d82523d6000602084013e61160e565b606091505b505080955050846116585760405162461bcd60e51b815260206004820152601460248201527313dddb995c881c185e5b595b9d0819985a5b195960621b60448201526064016104ce565b6116628184611dc3565b92505b60405163cc74234b60e01b8152600481018890526000907f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b03169063cc74234b90602401602060405180830381865afa1580156116cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f19190611b6d565b9050801561184f57600060646117078387611dd6565b6117119190611ded565b9050801561184d57604051636bd8225b60e11b8152600481018a90527f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b03169063d7b044b690602401602060405180830381865afa15801561177e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a29190611c2b565b6001600160a01b03168160405160006040518083038185875af1925050503d80600081146117ec576040519150601f19603f3d011682016040523d82523d6000602084013e6117f1565b606091505b505080975050866118405760405162461bcd60e51b81526020600482015260196024820152781059191a5d1a5bdb985b081c185e5b595b9d0819985a5b1959603a1b60448201526064016104ce565b61184a8186611dc3565b94505b505b83156119785760405163a47d29cb60e01b8152600481018990527f00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f4366001600160a01b03169063a47d29cb90602401602060405180830381865afa1580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de9190611c2b565b6001600160a01b03168460405160006040518083038185875af1925050503d8060008114611928576040519150601f19603f3d011682016040523d82523d6000602084013e61192d565b606091505b505080965050856119785760405162461bcd60e51b8152602060048201526015602482015274105c9d1a5cdd081c185e5b595b9d0819985a5b1959605a1b60448201526064016104ce565b5050505050505b5050565b60006001600160401b038211156119eb5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016104ce565b5090565b6001600160a01b0381168114611a0457600080fd5b50565b60008060408385031215611a1a57600080fd5b8235611a25816119ef565b946020939093013593505050565b600060208284031215611a4557600080fd5b5035919050565b93845260208401929092526040830152606082015260800190565b600060208284031215611a7957600080fd5b8135610b49816119ef565b60005b83811015611a9f578181015183820152602001611a87565b50506000910152565b84151581528360208201526080604082015260008351806080840152611ad58160a0850160208801611a84565b6001600160a01b0393909316606083015250601f91909101601f19160160a0019392505050565b6001600160a01b0391909116815260200190565b60008060408385031215611b2357600080fd5b50508035926020909101359150565b600080600080600060a08688031215611b4a57600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208284031215611b7f57600080fd5b5051919050565b634e487b7160e01b600052601260045260246000fd5b80518015158114611bac57600080fd5b919050565b600060208284031215611bc357600080fd5b610b4982611b9c565b60208082526015908201527413db9b1e4810dbdc9948185b1b1bdddb1a5cdd1959605a1b604082015260600190565b6020808252601690820152754f6e6c79206578697374696e672070726f6a6563747360501b604082015260600190565b600060208284031215611c3d57600080fd5b8151610b49816119ef565b6020808252600b908201526a13db9b1e48105c9d1a5cdd60aa1b604082015260600190565b8051611bac816119ef565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060008060006101208a8c031215611cad57600080fd5b8951611cb8816119ef565b8099505060208a0151975060408a0151965060608a01519550611cdd60808b01611b9c565b945060a08a0151611ced816119ef565b60c08b015160e08c015191955093506001600160401b0380821115611d1157600080fd5b818c0191508c601f830112611d2557600080fd5b815181811115611d3757611d37611c78565b604051601f8201601f19908116603f01168101908382118183101715611d5f57611d5f611c78565b816040528281528f6020848701011115611d7857600080fd5b611d89836020830160208801611a84565b8096505050505050611d9e6101008b01611c6d565b90509295985092959850929598565b634e487b7160e01b600052601160045260246000fd5b8181038181111561069057610690611dad565b808202811582820484141761069057610690611dad565b600082611e0a57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122027bd2dfd22f642f84e4d6d906ea5daa3b536958105d4b2355c9d2f77423ae49264736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f436
-----Decoded View---------------
Arg [0] : _genArt721Address (address): 0x32D4BE5eE74376e08038d652d4dc26E62C67F436
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000032d4be5ee74376e08038d652d4dc26e62c67f436
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.282637 | 0.238 | $0.067268 |
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.