Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 342 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase | 16829187 | 663 days ago | IN | 2.24639855 ETH | 0.0012223 | ||||
__Initiate Refun... | 16829184 | 663 days ago | IN | 0 ETH | 0.02719701 | ||||
Purchase | 16829181 | 663 days ago | IN | 22.5315126 ETH | 0.02712776 | ||||
Purchase | 16829179 | 663 days ago | IN | 22.92767106 ETH | 0.02566671 | ||||
Purchase | 16829179 | 663 days ago | IN | 22.5315126 ETH | 0.05277503 | ||||
Purchase | 16829179 | 663 days ago | IN | 22.92767106 ETH | 0.19694567 | ||||
Purchase | 16829178 | 663 days ago | IN | 22.92767106 ETH | 0.02312752 | ||||
Purchase | 16829178 | 663 days ago | IN | 22.92767106 ETH | 0.02268417 | ||||
__Initiate Refun... | 16829178 | 663 days ago | IN | 0 ETH | 0.23834852 | ||||
Purchase | 16829178 | 663 days ago | IN | 23.52190876 ETH | 0.02582513 | ||||
Purchase | 16829177 | 663 days ago | IN | 23.52190876 ETH | 0.02362987 | ||||
Purchase | 16829177 | 663 days ago | IN | 23.32382953 ETH | 0.02317397 | ||||
Purchase | 16829177 | 663 days ago | IN | 46.64765906 ETH | 0.03808184 | ||||
Purchase | 16829175 | 663 days ago | IN | 23.71998799 ETH | 0.02322592 | ||||
Purchase | 16829175 | 663 days ago | IN | 23.91806722 ETH | 0.04698928 | ||||
Purchase | 16829174 | 663 days ago | IN | 23.91806722 ETH | 0.02444788 | ||||
Purchase | 16829172 | 663 days ago | IN | 24.31422569 ETH | 0.02514331 | ||||
Purchase | 16829172 | 663 days ago | IN | 2.21038415 ETH | 0.00153525 | ||||
Purchase | 16829172 | 663 days ago | IN | 4.03961584 ETH | 0.00198603 | ||||
Purchase | 16829172 | 663 days ago | IN | 13.04621848 ETH | 0.00198559 | ||||
Purchase | 16829172 | 663 days ago | IN | 2.22839135 ETH | 0.00179953 | ||||
Purchase | 16829172 | 663 days ago | IN | 2.21038415 ETH | 0.00153525 | ||||
Purchase | 16829172 | 663 days ago | IN | 2.22839135 ETH | 0.00153525 | ||||
Purchase | 16829172 | 663 days ago | IN | 2.19237695 ETH | 0.00153525 | ||||
Purchase | 16829172 | 663 days ago | IN | 2.22839135 ETH | 0.00198471 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16829184 | 663 days ago | 438.74549819 ETH | ||||
16829184 | 663 days ago | 0.39615846 ETH | ||||
16829184 | 663 days ago | 0.39615846 ETH | ||||
16829184 | 663 days ago | 0.39615846 ETH | ||||
16829184 | 663 days ago | 0.59423769 ETH | ||||
16829184 | 663 days ago | 0.59423769 ETH | ||||
16829184 | 663 days ago | 0.59423769 ETH | ||||
16829184 | 663 days ago | 0.99039615 ETH | ||||
16829184 | 663 days ago | 0.99039615 ETH | ||||
16829184 | 663 days ago | 1.98079231 ETH | ||||
16829184 | 663 days ago | 1.38655462 ETH | ||||
16829184 | 663 days ago | 1.38655462 ETH | ||||
16829184 | 663 days ago | 1.58463385 ETH | ||||
16829184 | 663 days ago | 1.38655462 ETH | ||||
16829184 | 663 days ago | 1.98079231 ETH | ||||
16829184 | 663 days ago | 2.17887154 ETH | ||||
16829184 | 663 days ago | 2.17887154 ETH | ||||
16829184 | 663 days ago | 3.56542617 ETH | ||||
16829184 | 663 days ago | 5.15006002 ETH | ||||
16829181 | 663 days ago | 0.59423769 ETH | ||||
16829179 | 663 days ago | 0.59423769 ETH | ||||
16829179 | 663 days ago | 0.19807923 ETH | ||||
16829179 | 663 days ago | 0.59423769 ETH | ||||
16829178 | 663 days ago | 0.39615846 ETH | ||||
16829178 | 663 days ago | 0.39615846 ETH |
Loading...
Loading
Contract Name:
MarketplaceDutch
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ /** * @dev: @brougkr */ pragma solidity 0.8.17; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import { IMP } from "./IMP.sol"; import { LaunchpadEnabled } from "./LaunchpadEnabled.sol"; contract MarketplaceDutch is Ownable, ReentrancyGuard, LaunchpadEnabled { struct Sale { string _Name; // [0] -> _Name uint _ProjectIDMintPass; // [1] -> _ProjectIDMintPass uint _ProjectIDArtBlocks; // [2] -> _ProjectIDArtBlocks uint _PriceStart; // [3] -> _PriceStart uint _PriceEnd; // [4] -> _PriceEnd uint _WalletLimiter; // [5] -> _WalletLimiter uint _MaximumAvailableForSale; // [6] -> _MaximumAvailableForSale uint _StartingBlockUnixTimestamp; // [7] -> _StartingBlockUnixTimestamp uint _SecondsBetweenPriceDecay; // [8] -> _SecondsBetweenPriceDecay uint _SaleStrip; // [9] -> _SaleStrip note: For MintPack Sales, This Is The Default Amount Of Tokens To Mint Per Purchase Per Amount } struct InternalSale { address _NFT; // [0] -> _NFT address _Operator; // [1] _Operator (Wallet That NFT Is Pulling From) uint _CurrentIndex; // [2] _CurrentIndex (If Simple Sale Type, This Is The Next Token Index To Iterate Upon) uint _Type; // [3] _SaleType (0 = Factory MintPass, 1 = Bespoke MintPass, 2 = transferFrom(), 3 = purchaseTo(), 4 = MintPack transferFrom()) bool _ActivePublic; // [4] -> _ActivePublic bool _ActiveBrightList; // [5] -> _ActiveBrightList bool _Discount; // [6] -> _Discount bool _ActiveRespend; // [7] -> _ActiveRespend } struct SaleParam { bytes32[] _Roots; // [0] -> _Roots (Merkle Roots For BrightList) bytes32[] _RootsAmounts; // [1] -> _RootsAmounts (Merkle Roots For BrightList Amounts) uint[] _DiscountAmounts; // [2] -> _DiscountAmounts (Discount Amounts For Each Discount Priority Tier) } struct MiscSale { uint _AmountSold; // [0] -> _AmountSold uint _UniqueSales; // [1] -> _UniqueSales uint _FinalClearingPrice; // [2] -> _FinalClearingPrice uint _CurrentRefundIndex; // [3] -> _CurrentRefundIndex } struct Order { address _Purchaser; // [0] _Purchaser uint _PurchaseValue; // [1] _PurchaseValue uint _PurchaseAmount; // [2] _PurchaseAmount uint _Priority; // [3] _BrightList Priority Status note: (0 Is Highest Priority) bool _BrightListPurchase; // [4] _BrightListPurchase bool _Claimed; // [5] _Claimed } struct _UserSaleInformation { uint[] _UserOrderIndexes; // [0] -> _UserOrderIndexes | The Indexes Of The User's Orders uint _PurchasedAmount; // [1] -> _PurchaseAmount | The Amount Of Tokens Purchased By The User uint _RemainingPurchaseAmount; // [2] -> _RemainingPurchaseAmount | The Amount Of Tokens Remaining To Be Purchased Specifically For The User uint _ClaimIndex; // [3] -> _ClaimIndex | If ETH-Claims Are Enabled, This Is The User's Current Claim Index uint _AmountRemaining; // [4] -> _AmountRemaining | The Amount Of Tokens Remaining To Be Sold uint _CurrentPrice; // [5] -> _MintPassCurrentPrice | The Current Price Of The Token To Be Sold uint _Priority; // [6] -> _Priority For BrightList | The User's Priority For The BrightList | note: (0 Is Highest Priority) uint _AmountPurchasedPriority; // [7] -> _AmountPurchasedPriority | The Amount Of Tokens Purchased By The User For The Provided Priority uint _Credit; // [8] -> _Credit | The Amount Of Credit / Rebate Owed To The User (Without Discount) bool _BrightListEligible; // [9] -> _BrightListEligible | If The User Is Eligible For The BrightList bool _MaxAmountVerified; // [10] -> _MaxAmountVerified | If The User Passed MaxAmount Correctly bool _ActiveRespend; // [11] -> _ActiveRespend | If Purchase Credit Is Able To Be Used bool _Active; // [12] -> _Active | If The Sale Is Active } struct Info { uint _CurrentPrice; // [0] -> _CurrentPrice uint _MaximumAvailableForSale; // [1] -> _MaximumAvailableForSale uint _AmountRemaining; // [2] -> _AmountRemaining bool _Active; // [3] -> _Active } /*------------------ * STATE VARIABLES * -------------------*/ uint public _TOTAL_UNIQUE_SALES_DUTCH; // Total Unique Dutch Sales uint private constant _DEFAULT_PRIORITY = 69420; // Default Priority Value 😉 address private constant _DR = 0x00000000000076A84feF008CDAbe6409d2FE638B; // Delegation Registry address private constant _BRT_MULTISIG = 0x0BC56e3c1397e4570069e89C07936A5c6020e3BE; // `sales.brightmoments.eth` /*----------- * MAPPINGS * ------------*/ mapping(uint=>Sale) public Sales; // [SaleIndex] => Sale mapping(uint=>MiscSale) public SaleState; // [SaleIndex] => MiscSale mapping(uint=>InternalSale) public SalesInternal; // [SaleIndex] => InternalSale mapping(uint=>Order[]) public Orders; // [SaleIndex][UniqueSaleIndex] => Order mapping(uint=>mapping(address=>_UserSaleInformation)) public UserInfo; // [SaleIndex][Wallet] => UserInfo mapping(uint=>SaleParam) private SaleParams; // [SaleIndex] => SaleParam mapping(address=>bool) public Admin; // [Wallet] => IsAdmin mapping(address=>uint) public NFTAddressToSaleIndex; // [NFT Address] => SaleIndex mapping(uint=>mapping(address=>mapping(uint=>uint))) public PriorityPurchaseAmount; // [SaleIndex][Wallet][Priority] => Purchased Amount For Priority Level event Purchased(address Purchaser, uint Amount, uint PurchaseValue, uint NewAmountSold, bool BrightList, uint Priority, uint AppliedCredit); event Refunded(uint Value); event OrderRefundFailed(uint SaleIndex, uint OrderIndex); event SaleStarted(uint SaleIndex); event RefundClaimed(uint SaleIndex, uint OrderIndex); constructor() { Admin[msg.sender] = true; // `deployer.brightmoments.eth` Admin[0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700] = true; // `operator.brightmoments.eth` } /*--------------------- * EXTERNAL FUNCTIONS * ----------------------*/ /** * @dev Purchases NFTs * note: IF YOU PURCHASE THROUGH THE CONTRACT WITHOUT THE FRONTEND YOU WILL NOT BE ELIGIBLE FOR A DISCOUNT REBATE, REQUIRES A MERKLE PROOF * note: `msg.value` Must Be Sufficient To Purchase NFTs @ The Current Price Of The Dutch Auction * @param SaleIndex | The Sale Index * @param Amount | Amount The Amount Of NFTs To Purchase * @param MaxAmount | Optional Maximum Brightlist Purchase Per Wallet Limiter * @param Vault | Vault (optional delegate.cash) (if opt-out, use address(0) or `` for this value) * @param ProofEligibility | Merkle Proof For Priority Discount Eligibility * @param ProofAmount | Merkle Proof For Maximum Purchase Amount * note: @param ProofEligibility Input --> [0x0] <-- For Empty Proof * note: @param ProofAmount - Input --> [0x0] <-- For Empty Proof */ function Purchase ( uint SaleIndex, uint Amount, uint MaxAmount, address Vault, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount ) external payable nonReentrant { InternalSale memory _IS = SalesInternal[SaleIndex]; require(block.timestamp >= Sales[SaleIndex]._StartingBlockUnixTimestamp, "DutchMarketplace: Sale Not Started"); require(_IS._ActivePublic || _IS._ActiveBrightList, "DutchMarketplace: Sale Not Active"); address Recipient = msg.sender; uint OrderIndex = SaleState[SaleIndex]._UniqueSales; if(Vault != address(0)) { if(IDelegationRegistry(_DR).checkDelegateForAll(msg.sender, Vault)) { Recipient = Vault; } } require(Recipient != address(0), "DutchMarketplace: Invalid Recipient"); if(SaleState[SaleIndex]._AmountSold + Amount > Sales[SaleIndex]._MaximumAvailableForSale) { Amount = Sales[SaleIndex]._MaximumAvailableForSale - SaleState[SaleIndex]._AmountSold; } uint NewAmountSold = SaleState[SaleIndex]._AmountSold + Amount; require(NewAmountSold <= Sales[SaleIndex]._MaximumAvailableForSale, "DutchMarketplace: Sold Out"); uint Priority = _DEFAULT_PRIORITY; uint NewUserPurchasedAmount = UserInfo[SaleIndex][Recipient]._PurchasedAmount + Amount; bool BrightListEligible; if(_IS._ActiveBrightList) { (BrightListEligible, Priority) = ViewBrightListStatus(SaleIndex, Recipient, ProofEligibility); if(BrightListEligible) { uint UserPriorityPurchasedAmount = PriorityPurchaseAmount[SaleIndex][Recipient][Priority]; bytes32 _RootHash = SaleParams[SaleIndex]._RootsAmounts[Priority]; require(VerifyAmount(Recipient, MaxAmount, _RootHash, ProofAmount), "DutchMarketplace: Invalid Max Amount Merkle Proof For Provided Merkle Priority"); require(UserPriorityPurchasedAmount + Amount <= MaxAmount, "DutchMarketplace: User Has Purchased All Allocation For Provided Merkle Priority"); PriorityPurchaseAmount[SaleIndex][Recipient][Priority] += Amount; } } require(Amount > 0 && Amount <= Sales[SaleIndex]._WalletLimiter, "DutchMarketplace: Incorrect Desired Purchase Amount"); uint CurrentPrice = ViewCurrentPrice(SaleIndex); uint PurchaseValue = CurrentPrice * Amount; uint AppliedCredit; if(_IS._ActiveRespend) { AppliedCredit = __ActiveRespend(SaleIndex, CurrentPrice, PurchaseValue, msg.sender); } // AppliedCredit Is Capped @ Purchase Value uint TotalETHContributed = msg.value + AppliedCredit; require(TotalETHContributed >= PurchaseValue, "DutchMarketplace: Incorrect ETH Amount Sent"); if(TotalETHContributed > PurchaseValue && msg.value > 0) { __Refund(Recipient, TotalETHContributed - PurchaseValue); } Orders[SaleIndex].push(Order(msg.sender, PurchaseValue, Amount, Priority, BrightListEligible, false)); UserInfo[SaleIndex][Recipient]._UserOrderIndexes.push(OrderIndex); UserInfo[SaleIndex][Recipient]._PurchasedAmount = NewUserPurchasedAmount; SaleState[SaleIndex]._UniqueSales = OrderIndex + 1; SaleState[SaleIndex]._AmountSold = NewAmountSold; require(SaleState[SaleIndex]._AmountSold <= Sales[SaleIndex]._MaximumAvailableForSale, "DutchMarketplace: Overflow"); if(SaleState[SaleIndex]._AmountSold == Sales[SaleIndex]._MaximumAvailableForSale) { SaleState[SaleIndex]._FinalClearingPrice = CurrentPrice; ___EndSale(SaleIndex); } if(_IS._Type == 0) { IERC721(_IS._NFT)._MintToFactory(Sales[SaleIndex]._ProjectIDMintPass, msg.sender, Amount); } // Factory MintPass Direct Mint else if (_IS._Type == 1) { IERC721(_IS._NFT)._MintToBespoke(msg.sender, Amount); } else if (_IS._Type == 2) { IERC721(_IS._NFT)._MintToFactoryPack(Sales[SaleIndex]._ProjectIDMintPass, msg.sender, Amount); } // Factory MintPack Direct Mint else if (_IS._Type == 3) // transferFrom() Sale Implementation (NFTs Already Minted) { for(uint x; x < Amount; x++) { IERC721(_IS._NFT).transferFrom( _IS._Operator, // `from` msg.sender, // `to` _IS._CurrentIndex + x // `tokenID` ); } SalesInternal[SaleIndex]._CurrentIndex = _IS._CurrentIndex + Amount; } else if (_IS._Type == 4) // purchaseTo() Sale Implementation { uint ProjectID = Sales[SaleIndex]._ProjectIDArtBlocks; for(uint x; x < Amount; x++) { IERC721(_IS._NFT).purchaseTo( msg.sender, // `to` ProjectID // `projectID` ); } } else if (_IS._Type == 5) { uint _SaleStrip = Sales[SaleIndex]._SaleStrip; uint _Start = _IS._CurrentIndex; for(uint x; x < Amount; x++) { for(uint y; y < _SaleStrip; y++) { IERC721(_IS._NFT).transferFrom( _IS._Operator, // `from` msg.sender, // `to` _Start + y // `tokenID` ); } _Start += _SaleStrip; } SalesInternal[SaleIndex]._CurrentIndex = _IS._CurrentIndex + (_SaleStrip * Amount); } else { revert("DutchMarketplace: Incorrect Sale Configuration"); } emit Purchased(Recipient, Amount, PurchaseValue, NewAmountSold, BrightListEligible, Priority, AppliedCredit); } /*------------------ * ADMIN FUNCTIONS * -------------------*/ /** * @dev Starts A Sale * note: The True Discount Amount Is 100 - _Sale._DiscountAmount * note: Ex. _DiscountAmount = 75 = 25% Discount * note: Simple = True = IERC721(NFT).transferFrom() Sale * note: Simple = False = Custom purchaseTo Logic (ArtBlocks Or Custom Mint Pass) */ function __StartSale( Sale memory _Sale, InternalSale memory _InternalSale, bytes32[] calldata RootsPriority, bytes32[] calldata RootsAmounts, uint[] calldata DiscountAmounts ) external onlyAdmin { NFTAddressToSaleIndex[_InternalSale._NFT] = _TOTAL_UNIQUE_SALES_DUTCH; Sales[_TOTAL_UNIQUE_SALES_DUTCH] = _Sale; SalesInternal[_TOTAL_UNIQUE_SALES_DUTCH] = _InternalSale; SaleParams[_TOTAL_UNIQUE_SALES_DUTCH] = SaleParam(RootsPriority, RootsAmounts, DiscountAmounts); require( _InternalSale._Type == 0 // Factory MintPass Direct Mint || _InternalSale._Type == 1 // Bespoke MintPass Direct Mint || _InternalSale._Type == 2 // Factory MintPack Direct Mint || _InternalSale._Type == 3 // transferFrom() Sale (NFTs Already Minted) || _InternalSale._Type == 4 // purchaseTo() Sale (ArtBlocks Or Custom Mint Pass) || _InternalSale._Type == 5 // transferFrom() MintPack Sale (NFTs Already Minted) , "DutchMarketplace: Invalid Sale Type" ); require(RootsPriority.length == DiscountAmounts.length, "DutchMarketplace: Invalid Merkle Root Length"); for(uint x; x < SaleParams[_TOTAL_UNIQUE_SALES_DUTCH]._DiscountAmounts.length; x++) { require(DiscountAmounts[x] <= 100, "DutchMarketplace: Invalid Discount Amount"); } require(Sales[_TOTAL_UNIQUE_SALES_DUTCH]._PriceStart >= Sales[_TOTAL_UNIQUE_SALES_DUTCH]._PriceEnd, "DutchMarketplace: Invalid Start And End Prices"); emit SaleStarted(_TOTAL_UNIQUE_SALES_DUTCH); _TOTAL_UNIQUE_SALES_DUTCH++; } /** * @dev Initiates Withdraw Of Refunds & Sale Proceeds * note: This Is Only After The Sale Has Completed */ function __InitiateRefundsAndProceeds(uint SaleIndex) external nonReentrant onlyAdmin { bool _TxConfirmed; uint _Proceeds; uint _Refund; require(SaleState[SaleIndex]._FinalClearingPrice > 0, "DutchMarketplace: Final Clearing Price Not Seeded"); uint[] memory DiscountAmounts = SaleParams[SaleIndex]._DiscountAmounts; for(uint OrderIndex = SaleState[SaleIndex]._CurrentRefundIndex; OrderIndex < SaleState[SaleIndex]._UniqueSales; OrderIndex++) { Order memory _Order = Orders[SaleIndex][OrderIndex]; if(!_Order._Claimed) { if(!_Order._BrightListPurchase) // No BrightList { _Refund = _Order._PurchaseValue - (SaleState[SaleIndex]._FinalClearingPrice * _Order._PurchaseAmount); _Proceeds += _Order._PurchaseValue - _Refund; if(_Refund > 0) { (_TxConfirmed,) = _Order._Purchaser.call{ value: _Refund }(""); } } else // BrightList { _Refund = _Order._PurchaseValue - ( ((SaleState[SaleIndex]._FinalClearingPrice * DiscountAmounts[_Order._Priority]) / 100) * _Order._PurchaseAmount ); _Proceeds += _Order._PurchaseValue - _Refund; if(_Refund > 0) { (_TxConfirmed,) = _Order._Purchaser.call{ value: _Refund }(""); } } if(!_TxConfirmed) { emit OrderRefundFailed(SaleIndex, OrderIndex); } Orders[SaleIndex][OrderIndex]._Claimed = true; } } (_TxConfirmed,) = _BRT_MULTISIG.call{ value: _Proceeds }(""); require(_TxConfirmed, "DutchMarketplace: Multisig Refund Failed, Use Failsafe Withdraw And Manually Process"); SaleState[SaleIndex]._CurrentRefundIndex = SaleState[SaleIndex]._UniqueSales; // Resets Refund Index } /*--------------*/ /* ONLY OWNER */ /*--------------*/ /** * @dev Modifies The Sale Starting Token Index * note: If `Simple` Sale, Then This Is The Current TokenID Being Transferred In The Sale */ function ___ModifySaleStartingTokenIndex(uint SaleIndex, uint StartingTokenID) external onlyOwner { SalesInternal[SaleIndex]._CurrentIndex = StartingTokenID; } /** * @dev Modifies The Sale Name */ function ___ModifySaleName(uint SaleIndex, string calldata Name) external onlyOwner { Sales[SaleIndex]._Name = Name; } /** * @dev Modifies The ArtBlocks Sale ProjectID (if applicable) */ function ___ModifySaleProjectID(uint SaleIndex, uint ProjectID) external onlyOwner { Sales[SaleIndex]._ProjectIDMintPass = ProjectID; } /** * @dev Modifies The Starting Price */ function ___ModifyPriceStart(uint SaleIndex, uint PriceStart) external onlyOwner { Sales[SaleIndex]._PriceStart = PriceStart; } /** * @dev Modifies The Ending Price */ function ___ModifyPriceEnd(uint SaleIndex, uint PriceEnd) external onlyOwner { Sales[SaleIndex]._PriceEnd = PriceEnd; } /** * @dev Modifies The Per-Wallet-Limiter */ function ___ModifyWalletLimiter(uint SaleIndex, uint WalletLimiter) external onlyOwner { Sales[SaleIndex]._WalletLimiter = WalletLimiter; } /** * @dev Modifies The Maximum NFTs For Sale */ function ___ModifyMaxForSale(uint SaleIndex, uint AmountForSale) external onlyOwner { Sales[SaleIndex]._MaximumAvailableForSale = AmountForSale; } /** * @dev Modifies The Starting Unix Timestamp */ function ___ModifyTimestampStart(uint SaleIndex, uint Timestamp) external onlyOwner { Sales[SaleIndex]._StartingBlockUnixTimestamp = Timestamp; } /** * @dev Modifies The Price Decay (Input In Seconds) */ function ___ModifyPriceDecay(uint SaleIndex, uint PriceDecayInSeconds) external onlyOwner { Sales[SaleIndex]._SecondsBetweenPriceDecay = PriceDecayInSeconds; } /** * @dev Modifies The Sale Discount Amount * note: Ex. The True Discount Amount = 100 - `DiscountAmount` * note: Ex. `DiscountAmount` = 75 | 100 - `DiscountAmount` = 25% Discount */ function ___ModifySaleDiscountAmount(uint SaleIndex, uint[] calldata DiscountAmounts) external onlyOwner { for(uint x; x < DiscountAmounts.length; x++) { require(DiscountAmounts[x] <= 100, "DutchMarketplace: Invalid Discount Amount"); SaleParams[SaleIndex]._DiscountAmounts[x] = DiscountAmounts[x]; } } /** * @dev Modifies The NFT Address Of A Sale */ function ___ModifySaleNFTAddress(uint SaleIndex, address NFT) external onlyOwner { SalesInternal[SaleIndex]._NFT = NFT; } /** * @dev Modifies The Final Clearing Price Of A Sale */ function ___ModifySaleClearingPrice(uint SaleIndex, uint ClearingPrice) external onlyOwner { SaleState[SaleIndex]._FinalClearingPrice = ClearingPrice; } /** * @dev Modifies The Public Active Sale State */ function ___ModifySaleStatePublic(uint SaleIndex, bool State) external onlyOwner { SalesInternal[SaleIndex]._ActivePublic = State; } /** * @dev Modifies The BrightList Active Sale State */ function ___ModifySaleStateBrightList(uint SaleIndex, bool State) external onlyOwner { SalesInternal[SaleIndex]._ActiveBrightList = State; } /** * @dev Modifies The State Of ETH Claims * note: onlyOwner: This Enables Users To Claim ETH Rebate Pending In The Contract Before The Sale Concludes */ function ___ModifySaleETHClaimsEnabled(uint SaleIndex, bool State) external onlyOwner { SalesInternal[SaleIndex]._ActiveRespend = State; } /** * @dev onlyOwner: Modifies The Merkle Root(s) For Amounts */ function ___ModifySaleRootAmounts(uint SaleIndex, bytes32[] calldata RootsAmounts) external onlyOwner { SaleParams[SaleIndex]._RootsAmounts = RootsAmounts; } /** * @dev onlyOwner: Modifies The Merkle Root(s) For Eligibility */ function ___ModifySaleRootEligibility(uint SaleIndex, bytes32[] calldata Roots) external onlyOwner { SaleParams[SaleIndex]._Roots = Roots; } /** * @dev Modifies The Sale Root(s) For Merkle Eligibility & Amounts */ function ___ModifySaleRoots(uint SaleIndex, bytes32[] calldata RootsEligibility, bytes32[] calldata RootsAmounts) external onlyOwner { SaleParams[SaleIndex]._Roots = RootsEligibility; SaleParams[SaleIndex]._RootsAmounts = RootsAmounts; } /** * @dev onlyOwner: Modifies Sale */ function ___ModifySale(uint SaleIndex, Sale memory _Sale) external onlyOwner { Sales[SaleIndex] = _Sale; } /** * @dev Modifies The Sale Operator */ function ___ModifySaleOperator(uint SaleIndex, address Operator) external onlyOwner { SalesInternal[SaleIndex]._Operator = Operator; } /** * @dev onlyOwner: Grants Admin Role */ function ___AdminGrant(address _Admin) external onlyOwner { Admin[_Admin] = true; } /** * @dev onlyOwner: Removes Admin Role */ function ___AdminRemove(address _Admin) external onlyOwner { Admin[_Admin] = false; } /** * @dev onlyOwner: Withdraws All Ether From The Contract */ function ___WithdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } /** * @dev onlyOwner: Withdraws Ether From Contract To Address With An Amount */ function ___WithdrawEtherToAddress(address payable Recipient, uint Amount) external onlyOwner { require(Amount > 0 && Amount <= address(this).balance, "Invalid Amount"); (bool Success, ) = Recipient.call{value: Amount}(""); require(Success, "Unable to Withdraw, Recipient May Have Reverted"); } /** * @dev Withdraws ERC721s From Contract */ function ___WithdrawERC721(address Contract, address Recipient, uint[] calldata TokenIDs) external onlyOwner { for(uint TokenID; TokenID < TokenIDs.length;) { IERC721(Contract).transferFrom(address(this), Recipient, TokenIDs[TokenID]); unchecked { TokenID++; } } } /** * @dev Changes The Launchpad Address */ function ___ModifyLaunchpadAddress(address Launchpad) external onlyOwner { _____OverrideLaunchpadAddress(Launchpad); } /*----------------- * VIEW FUNCTIONS * ------------------*/ /** * @dev Returns Sale Information For A Given Wallet At `SaleIndex` * @param SaleIndex | The Sale Index * @param Wallet | The Currently Connected Wallet * @param MaxAmount | The Max Amount Of Tokens The User Can Purchase * @param Vault | The Vault Address * @param ProofEligibility | The Proof For The BrightList * @param ProofAmount | The Proof For The MaxAmount */ function ViewWalletSaleInformation( uint SaleIndex, address Wallet, uint MaxAmount, address Vault, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount ) public view returns (_UserSaleInformation memory) { uint CurrentPrice = ViewCurrentPrice(SaleIndex); uint PurchasableAmount; uint Priority; bool Verified; bool VerifiedAmount; bool Active = SalesInternal[SaleIndex]._ActiveBrightList || SalesInternal[SaleIndex]._ActivePublic; bool ActiveRespend = SalesInternal[SaleIndex]._ActiveRespend; uint Credit = ViewPendingCredit(SaleIndex, Wallet); if(Vault != address(0)) { if(IDelegationRegistry(_DR).checkDelegateForAll(Wallet, Vault)) { Wallet = Vault; } } uint UserPurchasedAmount = UserInfo[SaleIndex][Wallet]._PurchasedAmount; if(MaxAmount < UserPurchasedAmount) { MaxAmount = UserPurchasedAmount; } PurchasableAmount = MaxAmount - UserPurchasedAmount; (Verified, Priority) = ViewBrightListStatus(SaleIndex, Wallet, ProofEligibility); uint PriorityPurchasedAmount = PriorityPurchaseAmount[SaleIndex][Wallet][Priority]; if(Verified) { VerifiedAmount = VerifyAmount(Wallet, MaxAmount, SaleParams[SaleIndex]._RootsAmounts[Priority], ProofAmount); } return( _UserSaleInformation( UserInfo[SaleIndex][Wallet]._UserOrderIndexes, // The User's Order Indexes UserPurchasedAmount, // The User's Total Purchase Amount For `SaleIndex` PurchasableAmount, // The User's Purchasable Amount UserInfo[SaleIndex][Wallet]._ClaimIndex, // The User's Claim Index Sales[SaleIndex]._MaximumAvailableForSale - SaleState[SaleIndex]._AmountSold, // The Remaining Amount Available For Sale CurrentPrice, // The Current Price Of A Sale Priority, // The Priority The User Is Eligible For PriorityPurchasedAmount, // The Amount The User Has Purchased At The Priority Credit, // The User's Pending Credit Available To Use Towards Next Purchase Verified, // If The User Is Eligible For BrightList VerifiedAmount, // If The User Is Eligible For The MaxAmount ActiveRespend, Active // If The Sale Is Active ) ); } /** * @dev Batch Returns Multiple Sale Informations For A User */ function ViewWalletSaleInformations( uint[] calldata SaleIndexes, address Wallet, uint[] calldata MaxAmounts, address Vault, bytes32[][] calldata ProofEligibilities, bytes32[][] calldata ProofAmounts ) public view returns(_UserSaleInformation[] memory) { require( SaleIndexes.length == MaxAmounts.length && MaxAmounts.length == ProofEligibilities.length && ProofEligibilities.length == ProofAmounts.length, "DutchMarketplace: Array Lengths Must Match" ); _UserSaleInformation[] memory _UserSaleInformations = new _UserSaleInformation[](SaleIndexes.length); for(uint x; x < SaleIndexes.length; x++) { _UserSaleInformations[x] = ViewWalletSaleInformation( SaleIndexes[x], Wallet, MaxAmounts[x], Vault, ProofEligibilities[x], ProofAmounts[x] ); } return _UserSaleInformations; } /** * @dev Returns All Orders Of `SaleIndex` Within A Range `StartingIndex` & `EndingIndex` Inclusive */ function ViewOrders(uint SaleIndex) external view returns (Order[] memory) { return Orders[SaleIndex]; } /** * @dev Returns All Orders Of `SaleIndex` Within A Range `StartingIndex` & `EndingIndex` Inclusive */ function ViewOrdersInRange(uint SaleIndex, uint StartingIndex, uint EndingIndex) external view returns (Order[] memory) { uint Range = EndingIndex - StartingIndex; Order[] memory _Orders = new Order[](Range); for(uint x; x < Range; x++) { _Orders[x] = Orders[SaleIndex][StartingIndex+x]; } return _Orders; } /** * @dev Returns A [][] Of All Orders On Multiple SaleIndexes Within A Range `StartingIndex` & `EndingIndex` Inclusive */ function ViewAllOrders(uint[] calldata SaleIndexes, uint StartingIndex, uint EndingIndex) external view returns (Order[][] memory) { Order[][] memory __Orders = new Order[][](EndingIndex-StartingIndex); for(uint SaleIndex; SaleIndex <= SaleIndexes.length; SaleIndex++) { __Orders[SaleIndex] = Orders[SaleIndex]; } return __Orders; } /** * @dev Returns Sale Index By NFT Contract Address */ function ViewSaleIndexByNFTAddress(address NFT) public view returns (uint) { uint SaleIndex = NFTAddressToSaleIndex[NFT]; if(SaleIndex != 0) { return SaleIndex; } return 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; // type(uint).max } /** * @dev Returns an [] Of Sale States */ function ViewSaleStates(uint[] calldata SaleIndexes) public view returns (Sale[] memory, Info[] memory) { Sale[] memory _Sales = new Sale[](SaleIndexes.length); Info[] memory _Infos = new Info[](SaleIndexes.length); bool Active; for(uint x; x < SaleIndexes.length; x++) { Active = SalesInternal[SaleIndexes[x]]._ActivePublic || SalesInternal[SaleIndexes[x]]._ActiveBrightList; _Sales[x] = Sales[SaleIndexes[x]]; _Infos[x] = Info( ViewCurrentPrice(SaleIndexes[x]), Sales[SaleIndexes[x]]._MaximumAvailableForSale, Sales[SaleIndexes[x]]._MaximumAvailableForSale - SaleState[SaleIndexes[x]]._AmountSold, Active ); } return (_Sales, _Infos); } /** * @dev Returns The Current Pending Credit / Rebate Of A User (With No Discount) Until The Sale Has Concluded. * note: When The Final Clearing Price Is Seeded, This Function Switches To Show The User's Final Rebate (With Discounts If Eligible) */ function ViewPendingCredit(uint SaleIndex, address Wallet) public view returns (uint) { uint CurrentPrice = ViewCurrentPrice(SaleIndex); uint TotalCredit; uint FinalClearingPrice = SaleState[SaleIndex]._FinalClearingPrice; uint[] memory _UserOrderIndexes = UserInfo[SaleIndex][Wallet]._UserOrderIndexes; uint[] memory _DiscountAmounts = SaleParams[SaleIndex]._DiscountAmounts; for(uint ClaimIndex; ClaimIndex < _UserOrderIndexes.length; ClaimIndex++) { Order memory _Order = Orders[SaleIndex][_UserOrderIndexes[ClaimIndex]]; if(FinalClearingPrice > 0 && _Order._BrightListPurchase) { TotalCredit += _Order._PurchaseValue - ( ((SaleState[SaleIndex]._FinalClearingPrice * _DiscountAmounts[_Order._Priority]) / 100) * _Order._PurchaseAmount ); } else { TotalCredit += (_Order._PurchaseValue - (_Order._PurchaseAmount * CurrentPrice)); } } return TotalCredit; } /** * @dev Returns An [] Of Internal Sale States */ function ViewInternalSaleStates(uint[] calldata SaleIndexes) public view returns (InternalSale[] memory) { InternalSale[] memory _InternalSales = new InternalSale[](SaleIndexes.length); for(uint x; x < SaleIndexes.length; x++) { _InternalSales[x] = SalesInternal[SaleIndexes[x]]; } return _InternalSales; } /** * @dev Returns Current Dutch Price For Sale Index */ function ViewCurrentPrice(uint SaleIndex) public view returns (uint Price) { if(block.timestamp <= Sales[SaleIndex]._StartingBlockUnixTimestamp) { return Sales[SaleIndex]._PriceStart; } // Sale Not Started if(SaleState[SaleIndex]._FinalClearingPrice > 0) { return SaleState[SaleIndex]._FinalClearingPrice; } // Sale Finished uint CurrentPrice = Sales[SaleIndex]._PriceStart; // Initiates Current Price uint SecondsElapsed = block.timestamp - Sales[SaleIndex]._StartingBlockUnixTimestamp; // Unix Seconds Elapsed At Current Query Timestamp CurrentPrice >>= SecondsElapsed / Sales[SaleIndex]._SecondsBetweenPriceDecay; // Div/2 For Each Half Life Iterated Upon CurrentPrice -= (CurrentPrice * (SecondsElapsed % Sales[SaleIndex]._SecondsBetweenPriceDecay)) / Sales[SaleIndex]._SecondsBetweenPriceDecay / 2; if(CurrentPrice <= Sales[SaleIndex]._PriceEnd) { return Sales[SaleIndex]._PriceEnd; } // Sale Ended At Resting Band return CurrentPrice; // Sale Currently Active } /** * @dev Returns All Order Information Including Addresses And Corresponding Refund Amounts */ function ViewAllOrderRefunds(uint SaleIndex) public view returns (address[] memory, uint[] memory) { address[] memory Addresses = new address[](SaleState[SaleIndex]._UniqueSales); uint[] memory Refunds = new uint[](SaleState[SaleIndex]._UniqueSales); uint[] memory DiscountAmounts = SaleParams[SaleIndex]._DiscountAmounts; uint CurrentPrice = ViewCurrentPrice(SaleIndex); Order memory _Order; for(uint OrderIndex; OrderIndex < SaleState[SaleIndex]._UniqueSales; OrderIndex++) { _Order = Orders[SaleIndex][OrderIndex]; if(_Order._BrightListPurchase) { Refunds[OrderIndex] = _Order._PurchaseValue - ( ((SaleState[SaleIndex]._FinalClearingPrice * DiscountAmounts[_Order._Priority]) / 100) * _Order._PurchaseAmount ); } else { Refunds[OrderIndex] = _Order._PurchaseValue - (CurrentPrice * _Order._PurchaseAmount); } Addresses[OrderIndex] = _Order._Purchaser; } return(Addresses, Refunds); } /** * @dev Returns A User's Sale Stats Including Total Amount Purchased, Total Amount Spent, And Total Amount Rebated * note: This Function Will Only Return Wallet Stats For A Sale That Has Concluded * note: `NUM_ORDERS` Is The Final Cumulative Order Count Of `Wallet` * note: `NUM_PURCHASED` Is The Total Number Of NFTs Purchased At `SaleIndex` By `Wallet` * note: `FINAL_ETH_SPENT` Is The Cumulative Expended ETH Value From `Wallet` At The Conclusion Of The Sale Based On The Final Clearing Price Of The Dutch Auction * note: `FINAL_ETH_REBATE` Is The Cumulative Unspent ETH That Is Rebated To `Wallet` At The Conclusion Of The Sale Based On The Final Clearing Price Of The Dutch Auction * note: ETH Values Are Returned In WEI * note: This Function Was A Request From The Keith Who Loves Vapes */ function ViewSaleStats(uint SaleIndex, address Wallet) public view returns (uint NUM_ORDERS, uint NUM_PURCHASED, uint FINAL_ETH_SPENT, uint FINAL_ETH_REBATE) { require(SaleState[SaleIndex]._FinalClearingPrice > 0, "Sale Not Concluded"); uint CurrentPrice = ViewCurrentPrice(SaleIndex); uint FinalRebate; uint Spent; uint NumPurchased; uint OrderRebate; uint FinalClearingPrice = SaleState[SaleIndex]._FinalClearingPrice; uint[] memory _UserOrderIndexes = UserInfo[SaleIndex][Wallet]._UserOrderIndexes; uint NumOrders = _UserOrderIndexes.length; uint[] memory _DiscountAmounts = SaleParams[SaleIndex]._DiscountAmounts; for(uint ClaimIndex; ClaimIndex < _UserOrderIndexes.length; ClaimIndex++) { Order memory _Order = Orders[SaleIndex][_UserOrderIndexes[ClaimIndex]]; if(FinalClearingPrice > 0 && _Order._BrightListPurchase) // brightlist priority discount { OrderRebate = _Order._PurchaseValue - ( ((SaleState[SaleIndex]._FinalClearingPrice * _DiscountAmounts[_Order._Priority]) / 100) * _Order._PurchaseAmount ); } else { OrderRebate = (_Order._PurchaseValue - (_Order._PurchaseAmount * CurrentPrice)); } // no discount FinalRebate += OrderRebate; Spent += (_Order._PurchaseValue - OrderRebate); NumPurchased += _Order._PurchaseAmount; } return (NumOrders, NumPurchased, Spent, FinalRebate); } /** * @dev Returns All State Parameters Of A Sale */ function ViewAllSaleInformation(uint SaleIndex) public view returns (Sale memory, InternalSale memory, MiscSale memory, SaleParam memory, uint Price) { return ( Sales[SaleIndex], SalesInternal[SaleIndex], SaleState[SaleIndex], SaleParams[SaleIndex], ViewCurrentPrice(SaleIndex) ); } /** * @dev Returns If User Is On BrightList * note: Returns BrightList Status & Best Priority Index */ function ViewBrightListStatus(uint SaleIndex, address Recipient, bytes32[] calldata Proof) public view returns (bool, uint) { bool Verified; bytes32 Leaf = keccak256(abi.encodePacked(Recipient)); for(uint PriorityIndex; PriorityIndex < SaleParams[SaleIndex]._Roots.length; PriorityIndex++) { Verified = MerkleProof.verify(Proof, SaleParams[SaleIndex]._Roots[PriorityIndex], Leaf); if(Verified) { return (true, PriorityIndex); } } return (false, _DEFAULT_PRIORITY); } /** * @dev Verifies Brightlist */ function VerifyBrightList(address _Wallet, bytes32 _Root, bytes32[] calldata _Proof) public pure returns (bool) { bytes32 _Leaf = keccak256(abi.encodePacked(_Wallet)); return MerkleProof.verify(_Proof, _Root, _Leaf); } /** * @dev Verifies Maximum Purchase Amount Being Passed Is Valid */ function VerifyAmount(address _Wallet, uint _Amount, bytes32 _Root, bytes32[] calldata _Proof) public pure returns (bool) { bytes32 _Leaf = (keccak256(abi.encodePacked(_Wallet, _Amount))); return MerkleProof.verify(_Proof, _Root, _Leaf); } /*--------------------- * INTERNAL FUNCTIONS * ----------------------*/ /** * @dev Ends A Sale */ function ___EndSale(uint SaleIndex) internal { SalesInternal[SaleIndex]._ActivePublic = false; SalesInternal[SaleIndex]._ActiveBrightList = false; } /** * @dev Refunds `Recipient` ETH Amount `Value` */ function __Refund(address Recipient, uint Value) internal { (bool Confirmed,) = Recipient.call{value: Value}(""); require(Confirmed, "DutchMarketplace: Refund failed"); emit Refunded(Value); } /** * @dev Uses ETH Unspent By A User's Previous Purchase Orders Towards A New Purchase Order */ function __ActiveRespend(uint SaleIndex, uint CurrentPrice, uint PurchaseValue, address Recipient) internal returns (uint) { uint TotalCredit; uint PotentialCredit; uint[] memory _UserOrderIndexes = UserInfo[SaleIndex][Recipient]._UserOrderIndexes; for(uint ClaimIndex; ClaimIndex < _UserOrderIndexes.length; ClaimIndex++) { Order memory _Order = Orders[SaleIndex][_UserOrderIndexes[ClaimIndex]]; require(Recipient == _Order._Purchaser, "DutchMarketplace: Invalid State"); if(TotalCredit == PurchaseValue) { return TotalCredit; } // Returns Sufficient Credit For Entire Purchase Order else { PotentialCredit = _Order._PurchaseValue - (_Order._PurchaseAmount * CurrentPrice); if(PotentialCredit + TotalCredit > PurchaseValue) { PotentialCredit = PurchaseValue - TotalCredit; } // Only Pull As Much Credit As Needed Orders[SaleIndex][_UserOrderIndexes[ClaimIndex]]._PurchaseValue = _Order._PurchaseValue - PotentialCredit; TotalCredit += PotentialCredit; } } return TotalCredit; // Returns The Total Amount Of Credit Available } /*------------------ * ACCESS MODIFIER * -------------------*/ modifier onlyAdmin { require(Admin[msg.sender] || msg.sender == _LAUNCHPAD || msg.sender == owner()); _; } } interface IERC20 { function approve(address From, address To, uint Amount) external; } interface IERC721 { /** * @dev MintPass Factory Direct Mint */ function _MintToFactory(uint ProjectID, address To, uint Amount) external; /** * @dev MintPass Factory Mint Pack Direct Mint */ function _MintToFactoryPack(uint ProjectID, address To, uint Amount) external; /** * @dev MintPass Factory Mint Pack Direct Mint For Bespoke Mint Passes */ function _MintToBespoke(address To, uint Amount) external; /** * @dev Standard ERC721 Transfer */ function transferFrom(address From, address To, uint TokenID) external; /** * @dev ArtBlocks purchaseTo() Function */ function purchaseTo(address _to, uint256 _ProjectIDMintPass) external payable returns (uint256 _tokenId); } interface IDelegationRegistry { /** * @dev Checks If A Vault Has Delegated To The Delegate */ function checkDelegateForAll(address delegate, address delegator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // 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/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.17; interface IMP { /** * @dev { For Instances Where Golden Token Or Artists Have A Bespoke Mint Pass Contract } */ function _LiveMintBurn(uint TicketID) external returns (address Recipient, uint ArtistID); }
//SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.17; abstract contract LaunchpadEnabled { /** * @dev The Launchpad Address */ address public _LAUNCHPAD = 0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700; /** * @dev Overrides The Launchpad Address */ function _____OverrideLaunchpadAddress(address NewAddress) internal { _LAUNCHPAD = NewAddress; } /** * @dev Updates The Launchpad Address From Launchpad (batch upgrade) */ function _____NewLaunchpadAddress(address NewAddress) external onlyLaunchpad { _LAUNCHPAD = NewAddress; } /** * @dev Access Control Needed For A Contract To Be Able To Use The Launchpad */ modifier onlyLaunchpad() { require(_LAUNCHPAD == msg.sender, "onlyLaunchpad: Caller Is Not Launchpad"); _; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"OrderIndex","type":"uint256"}],"name":"OrderRefundFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"PurchaseValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"NewAmountSold","type":"uint256"},{"indexed":false,"internalType":"bool","name":"BrightList","type":"bool"},{"indexed":false,"internalType":"uint256","name":"Priority","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"AppliedCredit","type":"uint256"}],"name":"Purchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"OrderIndex","type":"uint256"}],"name":"RefundClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"Value","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"SaleStarted","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Admin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTAddressToSaleIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"Orders","outputs":[{"internalType":"address","name":"_Purchaser","type":"address"},{"internalType":"uint256","name":"_PurchaseValue","type":"uint256"},{"internalType":"uint256","name":"_PurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"bool","name":"_BrightListPurchase","type":"bool"},{"internalType":"bool","name":"_Claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"PriorityPurchaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Amount","type":"uint256"},{"internalType":"uint256","name":"MaxAmount","type":"uint256"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"}],"name":"Purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SaleState","outputs":[{"internalType":"uint256","name":"_AmountSold","type":"uint256"},{"internalType":"uint256","name":"_UniqueSales","type":"uint256"},{"internalType":"uint256","name":"_FinalClearingPrice","type":"uint256"},{"internalType":"uint256","name":"_CurrentRefundIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Sales","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_ProjectIDMintPass","type":"uint256"},{"internalType":"uint256","name":"_ProjectIDArtBlocks","type":"uint256"},{"internalType":"uint256","name":"_PriceStart","type":"uint256"},{"internalType":"uint256","name":"_PriceEnd","type":"uint256"},{"internalType":"uint256","name":"_WalletLimiter","type":"uint256"},{"internalType":"uint256","name":"_MaximumAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_StartingBlockUnixTimestamp","type":"uint256"},{"internalType":"uint256","name":"_SecondsBetweenPriceDecay","type":"uint256"},{"internalType":"uint256","name":"_SaleStrip","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"SalesInternal","outputs":[{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"bool","name":"_ActivePublic","type":"bool"},{"internalType":"bool","name":"_ActiveBrightList","type":"bool"},{"internalType":"bool","name":"_Discount","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"UserInfo","outputs":[{"internalType":"uint256","name":"_PurchasedAmount","type":"uint256"},{"internalType":"uint256","name":"_RemainingPurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_ClaimIndex","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_CurrentPrice","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedPriority","type":"uint256"},{"internalType":"uint256","name":"_Credit","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_MaxAmountVerified","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"},{"internalType":"bool","name":"_Active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"bytes32","name":"_Root","type":"bytes32"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"VerifyAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"bytes32","name":"_Root","type":"bytes32"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"VerifyBrightList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"ViewAllOrderRefunds","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"},{"internalType":"uint256","name":"StartingIndex","type":"uint256"},{"internalType":"uint256","name":"EndingIndex","type":"uint256"}],"name":"ViewAllOrders","outputs":[{"components":[{"internalType":"address","name":"_Purchaser","type":"address"},{"internalType":"uint256","name":"_PurchaseValue","type":"uint256"},{"internalType":"uint256","name":"_PurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"bool","name":"_BrightListPurchase","type":"bool"},{"internalType":"bool","name":"_Claimed","type":"bool"}],"internalType":"struct MarketplaceDutch.Order[][]","name":"","type":"tuple[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"ViewAllSaleInformation","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_ProjectIDMintPass","type":"uint256"},{"internalType":"uint256","name":"_ProjectIDArtBlocks","type":"uint256"},{"internalType":"uint256","name":"_PriceStart","type":"uint256"},{"internalType":"uint256","name":"_PriceEnd","type":"uint256"},{"internalType":"uint256","name":"_WalletLimiter","type":"uint256"},{"internalType":"uint256","name":"_MaximumAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_StartingBlockUnixTimestamp","type":"uint256"},{"internalType":"uint256","name":"_SecondsBetweenPriceDecay","type":"uint256"},{"internalType":"uint256","name":"_SaleStrip","type":"uint256"}],"internalType":"struct MarketplaceDutch.Sale","name":"","type":"tuple"},{"components":[{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"bool","name":"_ActivePublic","type":"bool"},{"internalType":"bool","name":"_ActiveBrightList","type":"bool"},{"internalType":"bool","name":"_Discount","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"}],"internalType":"struct MarketplaceDutch.InternalSale","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"_AmountSold","type":"uint256"},{"internalType":"uint256","name":"_UniqueSales","type":"uint256"},{"internalType":"uint256","name":"_FinalClearingPrice","type":"uint256"},{"internalType":"uint256","name":"_CurrentRefundIndex","type":"uint256"}],"internalType":"struct MarketplaceDutch.MiscSale","name":"","type":"tuple"},{"components":[{"internalType":"bytes32[]","name":"_Roots","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootsAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_DiscountAmounts","type":"uint256[]"}],"internalType":"struct MarketplaceDutch.SaleParam","name":"","type":"tuple"},{"internalType":"uint256","name":"Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"}],"name":"ViewBrightListStatus","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"ViewCurrentPrice","outputs":[{"internalType":"uint256","name":"Price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"}],"name":"ViewInternalSaleStates","outputs":[{"components":[{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"bool","name":"_ActivePublic","type":"bool"},{"internalType":"bool","name":"_ActiveBrightList","type":"bool"},{"internalType":"bool","name":"_Discount","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"}],"internalType":"struct MarketplaceDutch.InternalSale[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"ViewOrders","outputs":[{"components":[{"internalType":"address","name":"_Purchaser","type":"address"},{"internalType":"uint256","name":"_PurchaseValue","type":"uint256"},{"internalType":"uint256","name":"_PurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"bool","name":"_BrightListPurchase","type":"bool"},{"internalType":"bool","name":"_Claimed","type":"bool"}],"internalType":"struct MarketplaceDutch.Order[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"StartingIndex","type":"uint256"},{"internalType":"uint256","name":"EndingIndex","type":"uint256"}],"name":"ViewOrdersInRange","outputs":[{"components":[{"internalType":"address","name":"_Purchaser","type":"address"},{"internalType":"uint256","name":"_PurchaseValue","type":"uint256"},{"internalType":"uint256","name":"_PurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"bool","name":"_BrightListPurchase","type":"bool"},{"internalType":"bool","name":"_Claimed","type":"bool"}],"internalType":"struct MarketplaceDutch.Order[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"}],"name":"ViewPendingCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"NFT","type":"address"}],"name":"ViewSaleIndexByNFTAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"}],"name":"ViewSaleStates","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_ProjectIDMintPass","type":"uint256"},{"internalType":"uint256","name":"_ProjectIDArtBlocks","type":"uint256"},{"internalType":"uint256","name":"_PriceStart","type":"uint256"},{"internalType":"uint256","name":"_PriceEnd","type":"uint256"},{"internalType":"uint256","name":"_WalletLimiter","type":"uint256"},{"internalType":"uint256","name":"_MaximumAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_StartingBlockUnixTimestamp","type":"uint256"},{"internalType":"uint256","name":"_SecondsBetweenPriceDecay","type":"uint256"},{"internalType":"uint256","name":"_SaleStrip","type":"uint256"}],"internalType":"struct MarketplaceDutch.Sale[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"_CurrentPrice","type":"uint256"},{"internalType":"uint256","name":"_MaximumAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"bool","name":"_Active","type":"bool"}],"internalType":"struct MarketplaceDutch.Info[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"}],"name":"ViewSaleStats","outputs":[{"internalType":"uint256","name":"NUM_ORDERS","type":"uint256"},{"internalType":"uint256","name":"NUM_PURCHASED","type":"uint256"},{"internalType":"uint256","name":"FINAL_ETH_SPENT","type":"uint256"},{"internalType":"uint256","name":"FINAL_ETH_REBATE","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"},{"internalType":"uint256","name":"MaxAmount","type":"uint256"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"}],"name":"ViewWalletSaleInformation","outputs":[{"components":[{"internalType":"uint256[]","name":"_UserOrderIndexes","type":"uint256[]"},{"internalType":"uint256","name":"_PurchasedAmount","type":"uint256"},{"internalType":"uint256","name":"_RemainingPurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_ClaimIndex","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_CurrentPrice","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedPriority","type":"uint256"},{"internalType":"uint256","name":"_Credit","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_MaxAmountVerified","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"},{"internalType":"bool","name":"_Active","type":"bool"}],"internalType":"struct MarketplaceDutch._UserSaleInformation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"},{"internalType":"address","name":"Wallet","type":"address"},{"internalType":"uint256[]","name":"MaxAmounts","type":"uint256[]"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"bytes32[][]","name":"ProofEligibilities","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"ProofAmounts","type":"bytes32[][]"}],"name":"ViewWalletSaleInformations","outputs":[{"components":[{"internalType":"uint256[]","name":"_UserOrderIndexes","type":"uint256[]"},{"internalType":"uint256","name":"_PurchasedAmount","type":"uint256"},{"internalType":"uint256","name":"_RemainingPurchaseAmount","type":"uint256"},{"internalType":"uint256","name":"_ClaimIndex","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_CurrentPrice","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedPriority","type":"uint256"},{"internalType":"uint256","name":"_Credit","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_MaxAmountVerified","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"},{"internalType":"bool","name":"_Active","type":"bool"}],"internalType":"struct MarketplaceDutch._UserSaleInformation[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LAUNCHPAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOTAL_UNIQUE_SALES_DUTCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"__InitiateRefundsAndProceeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_ProjectIDMintPass","type":"uint256"},{"internalType":"uint256","name":"_ProjectIDArtBlocks","type":"uint256"},{"internalType":"uint256","name":"_PriceStart","type":"uint256"},{"internalType":"uint256","name":"_PriceEnd","type":"uint256"},{"internalType":"uint256","name":"_WalletLimiter","type":"uint256"},{"internalType":"uint256","name":"_MaximumAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_StartingBlockUnixTimestamp","type":"uint256"},{"internalType":"uint256","name":"_SecondsBetweenPriceDecay","type":"uint256"},{"internalType":"uint256","name":"_SaleStrip","type":"uint256"}],"internalType":"struct MarketplaceDutch.Sale","name":"_Sale","type":"tuple"},{"components":[{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"bool","name":"_ActivePublic","type":"bool"},{"internalType":"bool","name":"_ActiveBrightList","type":"bool"},{"internalType":"bool","name":"_Discount","type":"bool"},{"internalType":"bool","name":"_ActiveRespend","type":"bool"}],"internalType":"struct MarketplaceDutch.InternalSale","name":"_InternalSale","type":"tuple"},{"internalType":"bytes32[]","name":"RootsPriority","type":"bytes32[]"},{"internalType":"bytes32[]","name":"RootsAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"DiscountAmounts","type":"uint256[]"}],"name":"__StartSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Admin","type":"address"}],"name":"___AdminGrant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_Admin","type":"address"}],"name":"___AdminRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Launchpad","type":"address"}],"name":"___ModifyLaunchpadAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"AmountForSale","type":"uint256"}],"name":"___ModifyMaxForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"PriceDecayInSeconds","type":"uint256"}],"name":"___ModifyPriceDecay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"PriceEnd","type":"uint256"}],"name":"___ModifyPriceEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"PriceStart","type":"uint256"}],"name":"___ModifyPriceStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_ProjectIDMintPass","type":"uint256"},{"internalType":"uint256","name":"_ProjectIDArtBlocks","type":"uint256"},{"internalType":"uint256","name":"_PriceStart","type":"uint256"},{"internalType":"uint256","name":"_PriceEnd","type":"uint256"},{"internalType":"uint256","name":"_WalletLimiter","type":"uint256"},{"internalType":"uint256","name":"_MaximumAvailableForSale","type":"uint256"},{"internalType":"uint256","name":"_StartingBlockUnixTimestamp","type":"uint256"},{"internalType":"uint256","name":"_SecondsBetweenPriceDecay","type":"uint256"},{"internalType":"uint256","name":"_SaleStrip","type":"uint256"}],"internalType":"struct MarketplaceDutch.Sale","name":"_Sale","type":"tuple"}],"name":"___ModifySale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"ClearingPrice","type":"uint256"}],"name":"___ModifySaleClearingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256[]","name":"DiscountAmounts","type":"uint256[]"}],"name":"___ModifySaleDiscountAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bool","name":"State","type":"bool"}],"name":"___ModifySaleETHClaimsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"NFT","type":"address"}],"name":"___ModifySaleNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"string","name":"Name","type":"string"}],"name":"___ModifySaleName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Operator","type":"address"}],"name":"___ModifySaleOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"ProjectID","type":"uint256"}],"name":"___ModifySaleProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"RootsAmounts","type":"bytes32[]"}],"name":"___ModifySaleRootAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"Roots","type":"bytes32[]"}],"name":"___ModifySaleRootEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"RootsEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"RootsAmounts","type":"bytes32[]"}],"name":"___ModifySaleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"StartingTokenID","type":"uint256"}],"name":"___ModifySaleStartingTokenIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bool","name":"State","type":"bool"}],"name":"___ModifySaleStateBrightList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bool","name":"State","type":"bool"}],"name":"___ModifySaleStatePublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"___ModifyTimestampStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"WalletLimiter","type":"uint256"}],"name":"___ModifyWalletLimiter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Contract","type":"address"},{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"uint256[]","name":"TokenIDs","type":"uint256[]"}],"name":"___WithdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"___WithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"Recipient","type":"address"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"___WithdrawEtherToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"_____NewLaunchpadAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608080604052346100a55760008054336001600160a01b03198083168217845592600192604092906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a382805573e06f5fae754e81bc050215ff89b03d9e9ff2070080946002541617600255338152600a6020528181209360ff19948486825416179055815220918254161790556157599081620000ab8239f35b600080fdfe60a0604052600436101561001257600080fd5b60003560e01c8062432a1e146141df578063040415731461414b57806307939f0b14613fde57806309beb0c014613fa45780630c24ce4714613f775780631020b28b14613f4a5780631af4853c14613f1d578063228dd2b514613ec6578063242a44e414613e5c57806326abb6a114613e3e57806328804ebc14613e1857806333b005d014613dd95780633529280b14613d315780633756b14614613cdb57806344a2464e14613c6f57806352163cd214613c07578063581ed44514613ba05780635c4e364214613b33578063611118bf146139b757806368f9b33c14613755578063715018a6146136e457806374509071146136b9578063765b8b5114613692578063784edfa7146136655780637933479614612e4557806384f7ec6914612e185780638833a35414612d4b5780638d06418e14612d045780638da5cb5b14612cdd57806394d2ea7c14612c225780639808ac52146129385780639b273df1146128b45780639cbf7228146127c95780639debbd41146126f6578063a3c3b30414612330578063a61f3a8714611281578063a6db1411146111e7578063a70bf2f514610ff7578063adfbc6a614610f66578063b1e2da1814610f1d578063b7e1aef514610ee3578063c618a09314610ec5578063c67ff91714610e81578063c69d7a1514610dff578063cd27a03614610d08578063d8fa3d6814610cdb578063d902c38214610b6a578063dc8f18d31461092e578063de0ed50514610901578063e358c4ad14610879578063e3e9f9a61461080b578063e8572705146107b4578063e913d0eb1461075a578063e96450031461064a578063ead82d53146105fb578063eceda49a146103f3578063f2fde38b14610303578063f94f0fe3146102d65763fd2c4a0a146102a457600080fd5b346102d1576102b236614563565b906102bb6148f9565b6000526004602052600460406000200155600080f35b600080fd5b346102d1576102e436614563565b906102ed6148f9565b6000526004602052600360406000200155600080f35b346102d15760206003193601126102d15761031c6142f9565b6103246148f9565b6001600160a01b0380911690811561038957600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102d15760406003193601126102d15761040c61430f565b6004356000526005602052600260406000200154156105b757610430600435615339565b6000916000809360043560005260056020526002604060002001549260086020526001600160a01b03604060002091166000526020526104736040600020614c10565b80519460043560005260096020526104916002604060002001614c10565b916000975b81518910156105935761055d6105639160406105546104d86104d28e60043560005260076020526104cb85600020918a614cb6565b51906148ae565b50614c5f565b998a898d15158e610586575b156105695761053c610543916105368488606461052c602061054e990151956004356000526005602052610525600285600020015491606087015190614cb6565b5190614a0e565b0491015190614a0e565b906149e9565b809c6149dc565b9a60208d01516149e9565b906149dc565b980151906149dc565b98614a21565b97610496565b5061054361053c826105368c88602061054e970151930151614a0e565b50608082015115156104e4565b604080518981526020810192909252810186905260608101859052608090f35b0390f35b606460405162461bcd60e51b815260206004820152601260248201527f53616c65204e6f7420436f6e636c7564656400000000000000000000000000006044820152fd5b346102d15760206003193601126102d157600435600090815260056020908152604091829020805460018201546002830154600390930154855192835293820152928301526060820152608090f35b346102d15760406003193601126102d1576004356001600160a01b0381168091036102d1576024359061067b6148f9565b81151580610750575b1561070c57600080809381935af161069a614d03565b50156106a257005b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b5047821115610684565b346102d15760206003193601126102d1576107b26107766142f9565b61077e6148f9565b6001600160a01b03167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b005b346102d15760806003193601126102d1576107cd6142f9565b60643567ffffffffffffffff81116102d1576020916107f361080192369060040161433b565b916044359060243590615558565b6040519015158152f35b346102d15760406003193601126102d1576107b26108276146b3565b61082f6148f9565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff63ff000000835492151560181b169116179055565b346102d15760c06003193601126102d15761089261430f565b61089a614325565b67ffffffffffffffff906084358281116102d1576108bc90369060040161433b565b60a4949194359384116102d1576105b3946108de6108ed95369060040161433b565b94909360443590600435614d95565b60405191829160208352602083019061479f565b346102d15761090f36614563565b906109186148f9565b6000526006602052600260406000200155600080f35b346102d1576020806003193601126102d157600435908160005260059081815260019081604060002001549261097c61096685614ae1565b946109746040519687614447565b808652614ae1565b9482850191601f19809701368437816000528084528460406000200154916109bc6109a684614ae1565b936109b46040519586614447565b808552614ae1565b8386019801368937806000526009855260026109dd81604060002001614c10565b906109e783615339565b936109f0615087565b506000895b610a73575b505050505050604051946040860190604087525180915260608601929060005b818110610a57575050508482038584015251808252908201949160005b828110610a445785870386f35b8351875295810195928101928401610a37565b82516001600160a01b0316855293850193918501918601610a1a565b9088859493928b9d9b9660009b9a9b528282528c898860406000200154831015610b5b57826001600160a01b038b610b2093876007610b269952848d8d8d8d610ac36104d28660406000206148ae565b60808101519098899115610b355750610b109493610525610536946064948a610b169b610b049601519860005252604060002001549160608c015190614cb6565b04604088015190614a0e565b92614cb6565b525b511692614cb6565b52614a21565b9091929394999b9897986109f5565b9350610b1094506105369250610b55969150015191604088015190614a0e565b52610b18565b505050509a989a9796976109fa565b346102d1576020806003193601126102d15760043567ffffffffffffffff81116102d157610b9c90369060040161433b565b9190610ba783614ae1565b92610bb56040519485614447565b808452601f19610bc482614ae1565b018360005b828110610cc55750505060005b818110610c8157604080518581528651818701819052878701928201908760005b828110610c045784840385f35b9091928261010082610c726001948a5160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b01960191019492919094610bf7565b80610c90610cc0928486614b8f565b3560005260068552610ca56040600020614951565b610caf8288614cb6565b52610cba8187614cb6565b50614a21565b610bd6565b610ccd6152fb565b828289010152018490610bc9565b346102d157610ce936614563565b90610cf26148f9565b6000526004602052600860406000200155600080f35b346102d15760606003193601126102d157610d216142f9565b610d2961430f565b9060443567ffffffffffffffff81116102d157610d4b8391369060040161433b565b610d569291926148f9565b6001600160a01b0360009416935b818110610d6d57005b610d78818386614b8f565b3590853b156102d1576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03851660248201526044810192909252600082606481838a5af1918215610df357600192610de4575b5001610d64565b610ded906143c0565b86610ddd565b6040513d6000823e3d90fd5b346102d157610e0d36614563565b906000526007602052604060002080548210156102d15760c091610e30916148ae565b5060ff6001600160a01b0382541691600181015490600281015460046003830154920154926040519586526020860152604085015260608401528181161515608084015260081c16151560a0820152f35b346102d15760206003193601126102d1576001600160a01b03610ea26142f9565b610eaa6148f9565b16600052600a602052604060002060ff198154169055600080f35b346102d15760006003193601126102d1576020600354604051908152f35b346102d15760206003193601126102d1576001600160a01b03610f046142f9565b16600052600b6020526020604060002054604051908152f35b346102d15760406003193601126102d1576107b2610f396146b3565b610f416148f9565b600435600052600660205260046040600020019060ff60ff1983541691151516179055565b346102d15760206003193601126102d1576004356000526006602052610100604060002060ff6001600160a01b03918281541692600182015416906002810154600460038301549201549260405195865260208601526040850152606084015281811615156080840152818160081c16151560a0840152818160101c16151560c084015260181c16151560e0820152f35b346102d1576020806003193601126102d157600435906110156150fd565b5061101e6152fb565b5061102761514a565b50604051916110358361436c565b60608381809552818482015260400152806000526004825260406000209060068352604060002092600581526040600020906009815260406000209261107a90615339565b936110849061516f565b9461108e90614951565b926040519661109c88614388565b8354885260018401549383890194855260028101549060408a0191825260030154828a01908152604051916110d08361436c565b6110d985614c10565b83526110e760018601614c10565b948684019586526002016110fa90614c10565b96604084019788526040519b8c9b8c6101e08091528d0161111a9161483b565b99888d016111809160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b516101208c0152516101408b0152516101608a0152516101808901528786036101a0890152519080865285016111b59161476b565b905191848203908501526111c89161476b565b90519180820390604001526111dc9161476b565b906101c08301520390f35b346102d1576111f5366146c2565b90916111ff6148f9565b60005260209160098352600192836040600020019167ffffffffffffffff84116112525761122d8484614b47565b916000528060002060005b84811061124157005b833582820155928201928501611238565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60c06003193601126102d157611295614325565b67ffffffffffffffff6084358181116102d1576112b690369060040161433b565b909160a4359081116102d1576112d090369060040161433b565b91906112da614a30565b6024359360043560005260066020526112f66040600020614951565b93600435600052600460205260076040600020015442106122c6576080850151158015906122b9575b1561224f5733946004356000526005602052600160406000200154976001600160a01b0381166121af575b506001600160a01b03861615612145576004356000526005602052611374876040600020546149dc565b600435600052600460205260066040600020015410612120575b60043560005260056020526113a8876040600020546149dc565b91600435600052600460205260066040600020015483116120dc5762010f2c94600435600052600860205260406000206001600160a01b0389166000526020526113fa896001604060002001546149dc565b9660009560a0850151611ed9575b5050505086151580611ebc575b15611e5257611425600435615339565b61142f8882614a0e565b9860009660e0840151611e3c575b61144788346149dc565b8b8110611dd257808c808c931180611dc9575b611d30575b505050600435600052600760205260406000206040519061147f826143a4565b3382528c60208301528b60408301528860608301528715156080830152600060a0830152805468010000000000000000811015611252576114c5916001820181556148ae565b919091611d015760a06004611578936001600160a01b038451167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416178155602084015160018201556040840151600282015560608401516003820155019161154360808201511515849060ff60ff1983541691151516179055565b015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff0016179055565b600435600052600860205260406000206001600160a01b038a166000526020526040600020805468010000000000000000811015611252576115c481859360016115dd940181556149f6565b819391549060031b600019811b9283911b169119161790565b9055600435600052600860205260406000206001600160a01b038a16600052602052600160406000200155600181018111611cd25760019060043560005260056020520160016040600020015582604060002055604060002054600460205260066040600020015410611c8e576004356000526005602052604060002054600460205260066040600020015414611c43575b5060608101518061176457506001600160a01b0390511696600435600052600460205260016040600020015497803b156102d1576040517fe0d92a7600000000000000000000000000000000000000000000000000000000815260048101999099523360248a0152604489018890526000908990606490829084905af1968715610df3577fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9860e098611755575b505b6001600160a01b03604051971687526020870152604086015260608501521515608084015260a083015260c0820152a160018055005b61175e906143c0565b8961171d565b6001810361180a5750516001600160a01b031696873b156102d1576040517fecd3769d00000000000000000000000000000000000000000000000000000000815233600482015260248101889052976000908990818381604481015b03925af1968715610df3577fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9860e0986117fb575b5061171f565b611804906143c0565b896117f5565b6002810361188757506001600160a01b0390511696600435600052600460205260016040600020015497803b156102d1576040517fe076109000000000000000000000000000000000000000000000000000000000815260048101999099523360248a0152604489018890526000908990818381606481016117c0565b600381999394959697989299146000146119ac575090919293949596600090602081019060408101925b8481106119095750505091816118f07fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9997959360e0999795516149dc565b600435600052600660205260026040600020015561171f565b6001600160a01b03825116906001600160a01b0384511661192b8287516149dc565b833b156102d1576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152916000908390606490829084905af1918215610df3576119989261199d5750614a21565b6118b1565b6119a6906143c0565b8c610cba565b60048103611a9f575090919293949596600435600052600460205260026040600020015460005b838110611a0c575050509160e09593917fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d97959361171f565b82516040517f891407c00000000000000000000000000000000000000000000000000000000081523360048201526024810184905290602090829060449082906000906001600160a01b03165af18015610df357611a74575b50611a6f90614a21565b6119d3565b602090813d8311611a98575b611a8a8183614447565b810103126102d1578a611a65565b503d611a80565b600503611bd95760043560005260046020526009604060002001549760408101516000905b838210611b0a575050906118f07fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9961054e83604060e09c9b9a99989796015192614a0e565b8a9060005b828110611b305750611b2a91611b24916149dc565b91614a21565b90611ac4565b91506001600160a01b03845116916001600160a01b03602086015116611b5682846149dc565b843b156102d1576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152926000908490606490829084905af1908115610df3578d93611bc592611bca5750614a21565b611b0f565b611bd3906143c0565b8e610cba565b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e636f72726563742053616c6560448201527f20436f6e66696775726174696f6e0000000000000000000000000000000000006064820152fd5b6005602090815260406000818120600201939093556006909152902060040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690558861166f565b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a204f766572666c6f770000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b600080611d4081949382946149e9565b80955af1611d4c614d03565b5015611d855760207f3d2a04f53164bedf9a8a46353305d6b2d2261410406df3b41f99ce6489dc003c91604051908152a1888c8c61145f565b606460405162461bcd60e51b815260206004820152601f60248201527f44757463684d61726b6574706c6163653a20526566756e64206661696c6564006044820152fd5b5034151561145a565b608460405162461bcd60e51b815260206004820152602b60248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204554482060448201527f416d6f756e742053656e740000000000000000000000000000000000000000006064820152fd5b9650611e4c338b846004356155af565b9661143d565b608460405162461bcd60e51b815260206004820152603360248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204465736960448201527f72656420507572636861736520416d6f756e74000000000000000000000000006064820152fd5b506004356000526004602052600560406000200154871115611415565b90919550611eec92965088600435615442565b9093819585611efc575b80611408565b611f5f90600435600052600c60205260406000206001600160a01b038b16600052602052604060002084600052602052604060002054926004356000526009602052611f4f8560016040600020016149f6565b90549060031b1c6044358c615558565b1561204c57611f7189604435926149dc565b11611fbc57600435600052600c60205260406000206001600160a01b0388166000526020526040600020906000526020526040600020611fb28882546149dc565b9055888080611ef6565b60a460405162461bcd60e51b815260206004820152605060248201527f44757463684d61726b6574706c6163653a20557365722048617320507572636860448201527f6173656420416c6c20416c6c6f636174696f6e20466f722050726f766964656460648201527f204d65726b6c65205072696f72697479000000000000000000000000000000006084820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a20536f6c64204f75740000000000006044820152fd5b955061213f6006604060002001546005602052604060002054906149e9565b9561138e565b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642052656369706960448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115610df357600091612220575b501561134a5795508861134a565b612242915060203d602011612248575b61223a8183614447565b8101906149c4565b8a612212565b503d612230565b608460405162461bcd60e51b815260206004820152602160248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420416374697660448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b5060a0850151151561131f565b608460405162461bcd60e51b815260206004820152602260248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420537461727460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b346102d1576020806003193601126102d15760043561234d614a30565b33600052600a825260ff6040600020541680156126e2575b80156126ce575b156102d157600090600092816000526005918282526002938460406000200154156126645781600052600983526123a885604060002001614c10565b94826000528484526003604060002001545b836000528585526001604060002001548110156125875760078086526123e76104d28360406000206148ae565b9060a082015115612403575b50506123fe90614a21565b6123ba565b90988587918b8a8c88866080850151156000146125105761245296925061053691509361244a9361054e958201988951946000525260408b81600020015491015190614a0e565b8094516149e9565b99816124e4575b5050906123fe915b84156124b1575b856000528652600461247e8260406000206148ae565b50016101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff82541617905590896123f3565b7f04c9193508100a8a67eca92ca0f12195ea0503198d725f2323a9b7d01f508ac160408051888152848a820152a1612468565b6123fe9392955060008080936001600160a01b03829451165af1612506614d03565b509390918a612459565b936040606461052c61254899956105256105369661244a9961054e9b88019e8f519a6000525285600020015491606087015190614cb6565b998161255b575b5050906123fe91612461565b6123fe9392955060008080936001600160a01b03829451165af161257d614d03565b509390918a61254f565b505050600080808088730bc56e3c1397e4570069e89c07936a5c6020e3be5af16125af614d03565b50156125d4576000525260016040600020015460036040600020015560018055600080f35b60a4826040519062461bcd60e51b82526004820152605460248201527f44757463684d61726b6574706c6163653a204d756c746973696720526566756e60448201527f64204661696c65642c20557365204661696c736166652057697468647261772060648201527f416e64204d616e75616c6c792050726f636573730000000000000000000000006084820152fd5b6084836040519062461bcd60e51b82526004820152603160248201527f44757463684d61726b6574706c6163653a2046696e616c20436c656172696e6760448201527f205072696365204e6f74205365656465640000000000000000000000000000006064820152fd5b506001600160a01b0360005416331461236c565b506001600160a01b03600254163314612365565b346102d15760406003193601126102d15761270f61430f565b60043560005260086020526001600160a01b0360406000209116600052602052610180604060002060ff6001820154916002810154906003810154600482015460058301546006840154916007850154936009600887015496015496604051998a5260208a015260408901526060880152608087015260a086015260c085015260e08401528181161515610100840152818160081c161515610120840152818160101c16151561014084015260181c161515610160820152f35b346102d15760606003193601126102d15767ffffffffffffffff6004356024358281116102d1576127fe90369060040161433b565b92906044358281116102d15761281890369060040161433b565b9390946128236148f9565b8160005260209260098452604060002090858311611252576128458383614b47565b906000528360002060005b8381106128a2575050505060005260098152600193846040600020019284116112525761287d8484614b47565b916000528060002060005b84811061289157005b833582820155928201928501612888565b82358282015591850191600101612850565b346102d1576020806003193601126102d1576004356000526007815260406000209081546128e181614ae1565b926128ef6040519485614447565b8184526000908152828120838086015b84841061291957604051828152806105b38185018a6146f6565b60019160059161292885614c5f565b81520192019201919084906128ff565b346102d1576020806003193601126102d15760043567ffffffffffffffff81116102d15761296a90369060040161433b565b61297681939293614ae1565b926129846040519485614447565b818452601f19918261299582614ae1565b0160005b818110612c075750506129ab81614ae1565b926129b96040519485614447565b8184526129c582614ae1565b0160005b818110612bec57505060005b818110612ab4575050506040519160408301936040845280518095526060948585019083878260051b8801019301916000905b828210612a6957505050508381038285015281808451928381520193019160005b828110612a365785850386f35b83518051865280830151868401526040808201519087015287015115158786015260809094019392810192600101612a29565b90919294938480612aa4837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c60019603018652895161483b565b9697019493919091019101612a08565b80612ac6612bbd928486999899614b8f565b35600052600680885260ff8060046040600020015416908115612bc5575b50612af0838688614b8f565b3560005260048952612b05604060002061516f565b612b0f848a614cb6565b52612b1a8389614cb6565b50612b2f612b29848789614b8f565b35615339565b91612b3b848789614b8f565b3560005260048a52612b88816040600020015491612b5a86898b614b8f565b3560005260048c5260406000200154612b7486898b614b8f565b3560005260058c52604060002054906149e9565b9060405193612b9685614388565b84528a840152604083015215156060820152612bb28287614cb6565b52610cba8186614cb6565b9493946129d5565b9050612bd2838688614b8f565b3560005281895260046040600020015460081c1689612ae4565b94809695612bf861514a565b828288010152019594956129c9565b94809695612c136150fd565b82828901015201959495612999565b346102d15760606003193601126102d157600435602435612c45816044356149e9565b90612c4f82614ae1565b92612c5d6040519485614447565b828452601f19612c6c84614ae1565b0160005b818110612cc657505060005b838110612c9957604051602080825281906105b3908201886146f6565b612cc190826000526007602052610ca56104d26040600020612cbb84886149dc565b906148ae565b612c7c565b602090612cd1615087565b82828901015201612c70565b346102d15760006003193601126102d15760206001600160a01b0360005416604051908152f35b346102d15760206003193601126102d1576001600160a01b03612d256142f9565b612d2d6148f9565b16600052600a6020526040600020600160ff19825416179055600080f35b346102d15760206003193601126102d157612d646142f9565b6001600160a01b03600254163303612dae576107b2906001600160a01b03167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b608460405162461bcd60e51b815260206004820152602660248201527f6f6e6c794c61756e63687061643a2043616c6c6572204973204e6f74204c617560448201527f6e636870616400000000000000000000000000000000000000000000000000006064820152fd5b346102d157612e2636614563565b90612e2f6148f9565b6000526005602052600260406000200155600080f35b346102d1576101806003193601126102d15760043567ffffffffffffffff81116102d157612e77903690600401614486565b6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102d15760405190610100820182811067ffffffffffffffff82111761125257604052612ec961430f565b82526044356001600160a01b03811681036102d15760208301526064356040830152608435606083015260a43580151581036102d157608083015260c43580151581036102d15760a083015260e43580151581036102d15760c08301526101043580151581036102d15760e08301526101243567ffffffffffffffff81116102d157612f5990369060040161433b565b90926101443567ffffffffffffffff81116102d157612f7c90369060040161433b565b949067ffffffffffffffff61016435116102d157612fa0366101643560040161433b565b96909533600052600a60205260ff604060002054168015613651575b801561363d575b156102d1576003546001600160a01b03865116600052600b602052806040600020556000526004602052604060002090805180519067ffffffffffffffff82116112525761301b826130158654614579565b86614a9c565b602090601f83116001146135c7579282600993610120936131e7999897966000926135bc575b50506000198260011b9260031b1c19161784555b6020810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e081015160078501556101008101516008850155015191015560035460005260066020526131c6600460406000206001600160a01b038851167fffffffffffffffffffffffff0000000000000000000000000000000000000000908183541617825560018201906001600160a01b0360208b0151169082541617905560408801516002820155606088015160038201550161314060808801511515829060ff60ff1983541691151516179055565b60a087015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff001617815560c0870151815460e08901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff90911691151560101b62ff0000169190911790151560181b63ff00000016179055565b6131de604051946131d68661436c565b873691614af9565b84523691614af9565b60208201526131f585614ae1565b6132026040519182614447565b85815260208101368760051b8701116102d15785905b8760051b870182106135ac575050604082015260035460005260096020526040600020815180519067ffffffffffffffff82116112525760209061325c8385614b47565b0182600052602060002060005b8381106135985750505050602082015180519067ffffffffffffffff8211611252576020600184019161329c8484614b47565b0190600052602060002060005b83811061358457505050506002604091019101519081519167ffffffffffffffff831161125257680100000000000000008311611252576020908254848455808510613567575b500190600052602060002060005b8381106135535750505050606001518015908115613548575b811561353d575b8115613532575b8115613527575b811561351c575b50156134b2578203613448576003549060005b826000526009602052600260406000200154811015613385578061337b6064613373613380948887614b8f565b351115614b9f565b614a21565b613346565b82806000526004602052600360406000200154600460406000200154116133de576133d9907fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614a21565b600355005b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e76616c69642053746172742060448201527f416e6420456e64205072696365730000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602c60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d65726b6c6560448201527f20526f6f74204c656e67746800000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642053616c65205460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152fd5b600591501484613333565b60048114915061332c565b600381149150613325565b60028114915061331e565b600181149150613317565b6001906020845194019381840155016132fe565b61357e908460005285846000209182019101614a85565b886132f0565b6001906020845194019381840155016132a9565b600190602084519401938184015501613269565b8135815260209182019101613218565b015190508e80613041565b908460005260206000209160005b601f1985168110613625575083610120936131e7999897969360019383601f19600999161061360c575b505050811b018455613055565b015160001960f88460031b161c191690558e80806135ff565b919260206001819286850151815501940192016135d5565b506001600160a01b03600054163314612fc3565b506001600160a01b03600254163314612fbc565b346102d15761367336614563565b9061367c6148f9565b6000526004602052600660406000200155600080f35b346102d15760006003193601126102d15760206001600160a01b0360025416604051908152f35b346102d15760206003193601126102d15760206136dc6136d76142f9565b6150b9565b604051908152f35b346102d15760006003193601126102d1576136fd6148f9565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102d15760c06003193601126102d15767ffffffffffffffff6004358181116102d15761378790369060040161433b565b9161379061430f565b906044358181116102d1576137a990369060040161433b565b6137b4929192614325565b6084358381116102d1576137cc90369060040161433b565b9360a4359081116102d1576137e590369060040161433b565b949093808a14806139ae575b806139a5575b1561393b576138058a614ae1565b996138136040519b8c614447565b808b52601f1961382282614ae1565b0160005b8181106139235750508a60005b8281106138ba575060405160209182820192808352815180945260408301938160408260051b8601019301916000955b8287106138705785850386f35b9091929382806138aa837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019603018652885161479f565b9601920196019592919092613863565b610cba8161391c9361390c8f8f908f908f908f908f908f908f8f8f8c926138f5846138fc946138ee8280966139049a614b8f565b359c614b8f565b3595615024565b969095615024565b969095614d95565b6139168383614cb6565b52614cb6565b8b90613833565b808d60208093613931614d33565b9201015201613826565b608460405162461bcd60e51b815260206004820152602a60248201527f44757463684d61726b6574706c6163653a204172726179204c656e677468732060448201527f4d757374204d61746368000000000000000000000000000000000000000000006064820152fd5b508582146137f7565b508181146137f1565b346102d1576060806003193601126102d15760043567ffffffffffffffff81116102d1576139e990369060040161433b565b90506139f96024356044356149e9565b91601f19613a0961096685614ae1565b019060005b828110613b23575050506000905b80821115613aa1576040805160208082528551818301819052600093600582901b8401810192808901929185015b828710613a575785850386f35b909192938280613a91837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516146f6565b9601920196019592919092613a4a565b816000526020916007835260406000208054613abc81614ae1565b91613aca6040519384614447565b8183526000908152858120958084015b838310613b065750505050613b00929350613af58286614cb6565b52610cba8185614cb6565b90613a1c565b600582600192613b158b614c5f565b815201980192019196613ada565b8082602080938801015201613a0e565b346102d157613b41366146c2565b9091613b4b6148f9565b60005b828110613b5757005b80613b6b6064613373613b9b948789614b8f565b613b76818587614b8f565b35836000526009602052613b946115c48360026040600020016149f6565b9055614a21565b613b4e565b346102d15760406003193601126102d157613bb961430f565b613bc16148f9565b60043560005260066020526001600160a01b03604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102d157613c15366146c2565b9091613c1f6148f9565b6000526020916009835260406000209067ffffffffffffffff831161125257613c488383614b47565b90600052826000209260005b838110613c5d57005b82358582015591810191600101613c54565b346102d15760406003193601126102d1576107b2613c8b6146b3565b613c936148f9565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff00835492151560081b169116179055565b346102d15760606003193601126102d157613cf461430f565b60443567ffffffffffffffff81116102d157604091613d1a613d2392369060040161433b565b91600435615442565b825191151582526020820152f35b346102d15760206003193601126102d1576004356000526004602052613da56040600020613d5e816145cc565b9060018101549060028101549060038101546004820154600583015460068401549160078501549360096008870154960154966040519a8b9a610140808d528c0190614673565b9860208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301520390f35b346102d15760206003193601126102d1576001600160a01b03613dfa6142f9565b16600052600a602052602060ff604060002054166040519015158152f35b346102d15760406003193601126102d15760206136dc613e3661430f565b6004356151e6565b346102d15760206003193601126102d15760206136dc600435615339565b346102d15760406003193601126102d157613e7561430f565b613e7d6148f9565b60043560005260066020526001600160a01b03600160406000200191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102d15760606003193601126102d157613edf61430f565b600435600052600c6020526001600160a01b036040600020911660005260205260406000206044356000526020526020604060002054604051908152f35b346102d157613f2b36614563565b90613f346148f9565b6000526004602052600160406000200155600080f35b346102d157613f5836614563565b90613f616148f9565b6000526004602052600760406000200155600080f35b346102d157613f8536614563565b90613f8e6148f9565b6000526004602052600560406000200155600080f35b346102d15760006003193601126102d157613fbd6148f9565b600080808047818115613fd5575b3390f115610df357005b506108fc613fcb565b346102d15760406003193601126102d15767ffffffffffffffff6024358181116102d157614010903690600401614486565b6140186148f9565b6004356000526020600481526040600020928251805191821161125257614049826140438754614579565b87614a9c565b8290601f83116001146140de5791806101209492600996946000926140d3575b50506000198260011b9260031b1c19161785555b810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501550151910155005b015190508780614069565b90601f1983169186600052846000209260005b81811061413457509260019285926009989661012098961061411b575b505050811b01855561407d565b015160001960f88460031b161c1916905587808061410e565b9293866001819287860151815501950193016140f1565b346102d15760606003193601126102d1576141646142f9565b60443567ffffffffffffffff81116102d1576020916141da61418d61080193369060040161433b565b9190926040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008782019260601b168252601481526141cb8161442b565b51902092602435923691614af9565b6154fb565b346102d15760406003193601126102d1576024803567ffffffffffffffff8082116102d157366023830112156102d15781600401359081116102d157368382840101116102d15761422e6148f9565b6004356000526020926004845260406000209261424f836130158654614579565b600094601f8411600114614290575093829394600093614283575b5050506000198260011b9260031b1c1916179055600080f35b010135905083808061426a565b91601f198416958560005283600020936000905b8882106142df5750508460019697106142c3575b50505050811b019055005b60001960f88660031b161c1992010135169055838080806142b8565b8060018497868395968901013581550196019201906142a4565b600435906001600160a01b03821682036102d157565b602435906001600160a01b03821682036102d157565b606435906001600160a01b03821682036102d157565b9181601f840112156102d15782359167ffffffffffffffff83116102d1576020808501948460051b0101116102d157565b6060810190811067ffffffffffffffff82111761125257604052565b6080810190811067ffffffffffffffff82111761125257604052565b60c0810190811067ffffffffffffffff82111761125257604052565b67ffffffffffffffff811161125257604052565b610100810190811067ffffffffffffffff82111761125257604052565b6101a0810190811067ffffffffffffffff82111761125257604052565b610140810190811067ffffffffffffffff82111761125257604052565b6040810190811067ffffffffffffffff82111761125257604052565b90601f601f19910116810190811067ffffffffffffffff82111761125257604052565b67ffffffffffffffff811161125257601f01601f191660200190565b9190916101409081818503126102d1576040519182019367ffffffffffffffff948381108682111761125257604052829482359081116102d157820181601f820112156102d15780356144d88161446a565b916144e66040519384614447565b8183526020938483830101116102d157816000928580930183860137830101528352808201359083015260408101356040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080910135910152565b60031960409101126102d1576004359060243590565b90600182811c921680156145c2575b602083101461459357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614588565b90604051918260008254926145e084614579565b90818452600194858116908160001461464f575060011461460c575b505061460a92500383614447565b565b9093915060005260209081600020936000915b81831061463757505061460a935082010138806145fc565b8554888401850152948501948794509183019161461f565b905061460a95506020935060ff1991501682840152151560051b82010138806145fc565b919082519283825260005b84811061469f575050601f19601f8460006020809697860101520116010190565b60208183018101518483018201520161467e565b6024359081151582036102d157565b9060406003198301126102d157600435916024359067ffffffffffffffff82116102d1576146f29160040161433b565b9091565b90815180825260208080930193019160005b828110614716575050505090565b835180516001600160a01b031686528083015186840152604080820151908701526060808201519087015260808082015115159087015260a09081015115159086015260c09094019392810192600101614708565b90815180825260208080930193019160005b82811061478b575050505090565b83518552938101939281019260010161477d565b906147b382516101a080845283019061476b565b916020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100808201519083015261012080820151151590830152610140808201511515908301526101608082015115159083015261018080910151151591015290565b9061484f8251610140808452830190614673565b916020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151908301526101208091015191015290565b80548210156148ca576000526005602060002091020190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b0360005416330361490d57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9060405161495e816143d4565b60e060ff600483956001600160a01b0380825416865260018201541660208601526002810154604086015260038101546060860152015481811615156080850152818160081c16151560a0850152818160101c16151560c085015260181c161515910152565b908160209103126102d1575180151581036102d15790565b91908201809211611cd257565b91908203918211611cd257565b80548210156148ca5760005260206000200190600090565b81810292918115918404141715611cd257565b6000198114611cd25760010190565b600260015414614a41576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b818110614a90575050565b60008155600101614a85565b9190601f8111614aab57505050565b61460a926000526020600020906020601f840160051c83019310614ad7575b601f0160051c0190614a85565b9091508190614aca565b67ffffffffffffffff81116112525760051b60200190565b9291614b0482614ae1565b91614b126040519384614447565b829481845260208094019160051b81019283116102d157905b828210614b385750505050565b81358152908301908301614b2b565b68010000000000000000821161125257805491808255828110614b6957505050565b60009182526020822092830192015b828110614b8457505050565b818155600101614b78565b91908110156148ca5760051b0190565b15614ba657565b608460405162461bcd60e51b815260206004820152602960248201527f44757463684d61726b6574706c6163653a20496e76616c696420446973636f7560448201527f6e7420416d6f756e7400000000000000000000000000000000000000000000006064820152fd5b9060405191828154918282526020928383019160005283600020936000905b828210614c455750505061460a92500383614447565b855484526001958601958895509381019390910190614c2f565b90604051614c6c816143a4565b60a060ff600483956001600160a01b03815416855260018101546020860152600281015460408601526003810154606086015201548181161515608085015260081c161515910152565b80518210156148ca5760209160051b010190565b8115614cd4570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3d15614d2e573d90614d148261446a565b91614d226040519384614447565b82523d6000602084013e565b606090565b60405190614d40826143f1565b81606081526101806000918260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201520152565b9290959693614da2614d33565b50614dac84615339565b6000948086526020906006825260409360ff6004868a20015460081c16998a15615013575b60ff6004878b20015460181c1699614de98d856151e6565b976001600160a01b03806080528116614f69575b508c9d8a9b9c9d858c9a9b9c5260088752888a2060805182168b5287526001898b20015493848d10614f5f575b90614e4685949392614e3e8f978d986149e9565b97838a615442565b888d52600c8a528b8d2060805184168e528a528b8d20818e528a529a909b20549a9c8d614f2c575b505050508360005260088552816000209d608051169d8e6000528552816000209d846000526008865282600020906000528552816000206003015493600052600485528160002060060154600586528260002054614ecb916149e9565b9482519e8f90614eda826143f1565b614ee390614c10565b815201528c015260608b015260808a015260a089015260c088015260e0870152610100860152151561012085015215156101408401521515610160830152151561018082015290565b614f48614f55959f600188828f938e8e600992525220016149f6565b90549060031b1c91615558565b9938808f81614e6e565b939b508b93614e2a565b614fbd868f83908b5193849283927f9c395bc2000000000000000000000000000000000000000000000000000000008452600484019060209093929360408301946001600160a01b03809216845216910152565b03816d76a84fef008cdabe6409d2fe638b5afa908115615009578c91614fec575b5015614dfd579c5089614dfd565b6150039150873d89116122485761223a8183614447565b38614fde565b89513d8e823e3d90fd5b8589206004015460ff169a50614dd1565b91908110156148ca5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102d157019081359167ffffffffffffffff83116102d1576020018260051b360381136102d1579190565b60405190615094826143a4565b8160a06000918281528260208201528260408201528260608201528260808201520152565b6001600160a01b0316600052600b602052604060002054806150fa57507f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b90565b6040519061510a8261440e565b81606081526101206000918260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152565b6040519061515782614388565b60006060838281528260208201528260408201520152565b9060405161517c8161440e565b6101206009829461518c816145cc565b845260018101546020850152600281015460408501526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e085015260088101546101008501520154910152565b91906151f183615339565b9060009380855260059460209386855260029060409180838520015495600888526001600160a01b0384862091168552875261522e838520614c10565b98858552600988526152438285872001614c10565b9285971515955b8b518910156152ee57896152bf9189898f89898f8961527f8f956104d2906104cb8f9560078e8d600052528960002092614cb6565b95806152e1575b156152c5575061052c859361052561053696946064948c61055d9d61054e9c9b01519a6000525285600020015491606087015190614cb6565b9761524a565b9250505061054e93506105369161055d96840151930151614a0e565b5060808601511515615286565b9a50505050505050505050565b60405190615308826143d4565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b60008181526004906020908282526040916007838320015442111561543657600581526002838320015461542a578381526003838320015461538160078585200154426149e9565b908684528583526153986008868620015483614cca565b1c90868452858352600885852001549081156153fe57916153d66153c36153df938996950683614a0e565b8987528585526008888820015490614cca565b60011c906149e9565b958352528282822001548411156153f65750505090565b200154919050565b6024856012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50206002015492915050565b50206003015492915050565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b168252601481526154868161442b565b5190209360005b876000526009825282600020548110156154e9576154c4866154b283866000206149f6565b90549060031b1c6141da368989614af9565b6154dc57906154d4600992614a21565b90915061548d565b9650505050505060019190565b505050505050905060009062010f2c90565b929091906000915b8451831015615550576155168386614cb6565b519060008282101561553e575060005260205261553860406000205b92614a21565b91615503565b60409161553893825260205220615532565b915092501490565b926150fa94936141da92604051907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602083019360601b1683526034820152603481526155a48161436c565b519020933691614af9565b92909160009384818152602060088152604090818320906001600160a01b038097169182855281526155e2838520614c10565b93975b84518910156157175785600052600780835261560b6104d2866000206104cb8d8a614cb6565b8981511685036156d4578b890361562a57505050505050505050505090565b978a9b8888839c9d615697958a6156568a9b9c9d9e9f6105368b61569d9c9d8301948551930151614a0e565b9680615662888a6149dc565b116156aa575b5061568f926001949261567f896104cb94516149e9565b966000528c528d60002092614cb6565b5001556149dc565b99614a21565b97969594939291906155e5565b6104cb919750926001949261567f6156c58961568f976149e9565b9993505092945092508f615668565b60648487519062461bcd60e51b82526004820152601f60248201527f44757463684d61726b6574706c6163653a20496e76616c6964205374617465006044820152fd5b5050505050505050509056fea2646970667358221220b8ec5968d352a76117c8a8e648d034f6bb47226b60b222accff8ea8bfb53642964736f6c63430008110033
Deployed Bytecode
0x60a0604052600436101561001257600080fd5b60003560e01c8062432a1e146141df578063040415731461414b57806307939f0b14613fde57806309beb0c014613fa45780630c24ce4714613f775780631020b28b14613f4a5780631af4853c14613f1d578063228dd2b514613ec6578063242a44e414613e5c57806326abb6a114613e3e57806328804ebc14613e1857806333b005d014613dd95780633529280b14613d315780633756b14614613cdb57806344a2464e14613c6f57806352163cd214613c07578063581ed44514613ba05780635c4e364214613b33578063611118bf146139b757806368f9b33c14613755578063715018a6146136e457806374509071146136b9578063765b8b5114613692578063784edfa7146136655780637933479614612e4557806384f7ec6914612e185780638833a35414612d4b5780638d06418e14612d045780638da5cb5b14612cdd57806394d2ea7c14612c225780639808ac52146129385780639b273df1146128b45780639cbf7228146127c95780639debbd41146126f6578063a3c3b30414612330578063a61f3a8714611281578063a6db1411146111e7578063a70bf2f514610ff7578063adfbc6a614610f66578063b1e2da1814610f1d578063b7e1aef514610ee3578063c618a09314610ec5578063c67ff91714610e81578063c69d7a1514610dff578063cd27a03614610d08578063d8fa3d6814610cdb578063d902c38214610b6a578063dc8f18d31461092e578063de0ed50514610901578063e358c4ad14610879578063e3e9f9a61461080b578063e8572705146107b4578063e913d0eb1461075a578063e96450031461064a578063ead82d53146105fb578063eceda49a146103f3578063f2fde38b14610303578063f94f0fe3146102d65763fd2c4a0a146102a457600080fd5b346102d1576102b236614563565b906102bb6148f9565b6000526004602052600460406000200155600080f35b600080fd5b346102d1576102e436614563565b906102ed6148f9565b6000526004602052600360406000200155600080f35b346102d15760206003193601126102d15761031c6142f9565b6103246148f9565b6001600160a01b0380911690811561038957600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102d15760406003193601126102d15761040c61430f565b6004356000526005602052600260406000200154156105b757610430600435615339565b6000916000809360043560005260056020526002604060002001549260086020526001600160a01b03604060002091166000526020526104736040600020614c10565b80519460043560005260096020526104916002604060002001614c10565b916000975b81518910156105935761055d6105639160406105546104d86104d28e60043560005260076020526104cb85600020918a614cb6565b51906148ae565b50614c5f565b998a898d15158e610586575b156105695761053c610543916105368488606461052c602061054e990151956004356000526005602052610525600285600020015491606087015190614cb6565b5190614a0e565b0491015190614a0e565b906149e9565b809c6149dc565b9a60208d01516149e9565b906149dc565b980151906149dc565b98614a21565b97610496565b5061054361053c826105368c88602061054e970151930151614a0e565b50608082015115156104e4565b604080518981526020810192909252810186905260608101859052608090f35b0390f35b606460405162461bcd60e51b815260206004820152601260248201527f53616c65204e6f7420436f6e636c7564656400000000000000000000000000006044820152fd5b346102d15760206003193601126102d157600435600090815260056020908152604091829020805460018201546002830154600390930154855192835293820152928301526060820152608090f35b346102d15760406003193601126102d1576004356001600160a01b0381168091036102d1576024359061067b6148f9565b81151580610750575b1561070c57600080809381935af161069a614d03565b50156106a257005b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b5047821115610684565b346102d15760206003193601126102d1576107b26107766142f9565b61077e6148f9565b6001600160a01b03167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b005b346102d15760806003193601126102d1576107cd6142f9565b60643567ffffffffffffffff81116102d1576020916107f361080192369060040161433b565b916044359060243590615558565b6040519015158152f35b346102d15760406003193601126102d1576107b26108276146b3565b61082f6148f9565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff63ff000000835492151560181b169116179055565b346102d15760c06003193601126102d15761089261430f565b61089a614325565b67ffffffffffffffff906084358281116102d1576108bc90369060040161433b565b60a4949194359384116102d1576105b3946108de6108ed95369060040161433b565b94909360443590600435614d95565b60405191829160208352602083019061479f565b346102d15761090f36614563565b906109186148f9565b6000526006602052600260406000200155600080f35b346102d1576020806003193601126102d157600435908160005260059081815260019081604060002001549261097c61096685614ae1565b946109746040519687614447565b808652614ae1565b9482850191601f19809701368437816000528084528460406000200154916109bc6109a684614ae1565b936109b46040519586614447565b808552614ae1565b8386019801368937806000526009855260026109dd81604060002001614c10565b906109e783615339565b936109f0615087565b506000895b610a73575b505050505050604051946040860190604087525180915260608601929060005b818110610a57575050508482038584015251808252908201949160005b828110610a445785870386f35b8351875295810195928101928401610a37565b82516001600160a01b0316855293850193918501918601610a1a565b9088859493928b9d9b9660009b9a9b528282528c898860406000200154831015610b5b57826001600160a01b038b610b2093876007610b269952848d8d8d8d610ac36104d28660406000206148ae565b60808101519098899115610b355750610b109493610525610536946064948a610b169b610b049601519860005252604060002001549160608c015190614cb6565b04604088015190614a0e565b92614cb6565b525b511692614cb6565b52614a21565b9091929394999b9897986109f5565b9350610b1094506105369250610b55969150015191604088015190614a0e565b52610b18565b505050509a989a9796976109fa565b346102d1576020806003193601126102d15760043567ffffffffffffffff81116102d157610b9c90369060040161433b565b9190610ba783614ae1565b92610bb56040519485614447565b808452601f19610bc482614ae1565b018360005b828110610cc55750505060005b818110610c8157604080518581528651818701819052878701928201908760005b828110610c045784840385f35b9091928261010082610c726001948a5160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b01960191019492919094610bf7565b80610c90610cc0928486614b8f565b3560005260068552610ca56040600020614951565b610caf8288614cb6565b52610cba8187614cb6565b50614a21565b610bd6565b610ccd6152fb565b828289010152018490610bc9565b346102d157610ce936614563565b90610cf26148f9565b6000526004602052600860406000200155600080f35b346102d15760606003193601126102d157610d216142f9565b610d2961430f565b9060443567ffffffffffffffff81116102d157610d4b8391369060040161433b565b610d569291926148f9565b6001600160a01b0360009416935b818110610d6d57005b610d78818386614b8f565b3590853b156102d1576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03851660248201526044810192909252600082606481838a5af1918215610df357600192610de4575b5001610d64565b610ded906143c0565b86610ddd565b6040513d6000823e3d90fd5b346102d157610e0d36614563565b906000526007602052604060002080548210156102d15760c091610e30916148ae565b5060ff6001600160a01b0382541691600181015490600281015460046003830154920154926040519586526020860152604085015260608401528181161515608084015260081c16151560a0820152f35b346102d15760206003193601126102d1576001600160a01b03610ea26142f9565b610eaa6148f9565b16600052600a602052604060002060ff198154169055600080f35b346102d15760006003193601126102d1576020600354604051908152f35b346102d15760206003193601126102d1576001600160a01b03610f046142f9565b16600052600b6020526020604060002054604051908152f35b346102d15760406003193601126102d1576107b2610f396146b3565b610f416148f9565b600435600052600660205260046040600020019060ff60ff1983541691151516179055565b346102d15760206003193601126102d1576004356000526006602052610100604060002060ff6001600160a01b03918281541692600182015416906002810154600460038301549201549260405195865260208601526040850152606084015281811615156080840152818160081c16151560a0840152818160101c16151560c084015260181c16151560e0820152f35b346102d1576020806003193601126102d157600435906110156150fd565b5061101e6152fb565b5061102761514a565b50604051916110358361436c565b60608381809552818482015260400152806000526004825260406000209060068352604060002092600581526040600020906009815260406000209261107a90615339565b936110849061516f565b9461108e90614951565b926040519661109c88614388565b8354885260018401549383890194855260028101549060408a0191825260030154828a01908152604051916110d08361436c565b6110d985614c10565b83526110e760018601614c10565b948684019586526002016110fa90614c10565b96604084019788526040519b8c9b8c6101e08091528d0161111a9161483b565b99888d016111809160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b516101208c0152516101408b0152516101608a0152516101808901528786036101a0890152519080865285016111b59161476b565b905191848203908501526111c89161476b565b90519180820390604001526111dc9161476b565b906101c08301520390f35b346102d1576111f5366146c2565b90916111ff6148f9565b60005260209160098352600192836040600020019167ffffffffffffffff84116112525761122d8484614b47565b916000528060002060005b84811061124157005b833582820155928201928501611238565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60c06003193601126102d157611295614325565b67ffffffffffffffff6084358181116102d1576112b690369060040161433b565b909160a4359081116102d1576112d090369060040161433b565b91906112da614a30565b6024359360043560005260066020526112f66040600020614951565b93600435600052600460205260076040600020015442106122c6576080850151158015906122b9575b1561224f5733946004356000526005602052600160406000200154976001600160a01b0381166121af575b506001600160a01b03861615612145576004356000526005602052611374876040600020546149dc565b600435600052600460205260066040600020015410612120575b60043560005260056020526113a8876040600020546149dc565b91600435600052600460205260066040600020015483116120dc5762010f2c94600435600052600860205260406000206001600160a01b0389166000526020526113fa896001604060002001546149dc565b9660009560a0850151611ed9575b5050505086151580611ebc575b15611e5257611425600435615339565b61142f8882614a0e565b9860009660e0840151611e3c575b61144788346149dc565b8b8110611dd257808c808c931180611dc9575b611d30575b505050600435600052600760205260406000206040519061147f826143a4565b3382528c60208301528b60408301528860608301528715156080830152600060a0830152805468010000000000000000811015611252576114c5916001820181556148ae565b919091611d015760a06004611578936001600160a01b038451167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416178155602084015160018201556040840151600282015560608401516003820155019161154360808201511515849060ff60ff1983541691151516179055565b015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff0016179055565b600435600052600860205260406000206001600160a01b038a166000526020526040600020805468010000000000000000811015611252576115c481859360016115dd940181556149f6565b819391549060031b600019811b9283911b169119161790565b9055600435600052600860205260406000206001600160a01b038a16600052602052600160406000200155600181018111611cd25760019060043560005260056020520160016040600020015582604060002055604060002054600460205260066040600020015410611c8e576004356000526005602052604060002054600460205260066040600020015414611c43575b5060608101518061176457506001600160a01b0390511696600435600052600460205260016040600020015497803b156102d1576040517fe0d92a7600000000000000000000000000000000000000000000000000000000815260048101999099523360248a0152604489018890526000908990606490829084905af1968715610df3577fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9860e098611755575b505b6001600160a01b03604051971687526020870152604086015260608501521515608084015260a083015260c0820152a160018055005b61175e906143c0565b8961171d565b6001810361180a5750516001600160a01b031696873b156102d1576040517fecd3769d00000000000000000000000000000000000000000000000000000000815233600482015260248101889052976000908990818381604481015b03925af1968715610df3577fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9860e0986117fb575b5061171f565b611804906143c0565b896117f5565b6002810361188757506001600160a01b0390511696600435600052600460205260016040600020015497803b156102d1576040517fe076109000000000000000000000000000000000000000000000000000000000815260048101999099523360248a0152604489018890526000908990818381606481016117c0565b600381999394959697989299146000146119ac575090919293949596600090602081019060408101925b8481106119095750505091816118f07fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9997959360e0999795516149dc565b600435600052600660205260026040600020015561171f565b6001600160a01b03825116906001600160a01b0384511661192b8287516149dc565b833b156102d1576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152916000908390606490829084905af1918215610df3576119989261199d5750614a21565b6118b1565b6119a6906143c0565b8c610cba565b60048103611a9f575090919293949596600435600052600460205260026040600020015460005b838110611a0c575050509160e09593917fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d97959361171f565b82516040517f891407c00000000000000000000000000000000000000000000000000000000081523360048201526024810184905290602090829060449082906000906001600160a01b03165af18015610df357611a74575b50611a6f90614a21565b6119d3565b602090813d8311611a98575b611a8a8183614447565b810103126102d1578a611a65565b503d611a80565b600503611bd95760043560005260046020526009604060002001549760408101516000905b838210611b0a575050906118f07fe95af99e42f8d54750d58074935ab609a698fc696e79d27d9b8f8a0c76f0d52d9961054e83604060e09c9b9a99989796015192614a0e565b8a9060005b828110611b305750611b2a91611b24916149dc565b91614a21565b90611ac4565b91506001600160a01b03845116916001600160a01b03602086015116611b5682846149dc565b843b156102d1576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152926000908490606490829084905af1908115610df3578d93611bc592611bca5750614a21565b611b0f565b611bd3906143c0565b8e610cba565b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e636f72726563742053616c6560448201527f20436f6e66696775726174696f6e0000000000000000000000000000000000006064820152fd5b6005602090815260406000818120600201939093556006909152902060040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690558861166f565b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a204f766572666c6f770000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b600080611d4081949382946149e9565b80955af1611d4c614d03565b5015611d855760207f3d2a04f53164bedf9a8a46353305d6b2d2261410406df3b41f99ce6489dc003c91604051908152a1888c8c61145f565b606460405162461bcd60e51b815260206004820152601f60248201527f44757463684d61726b6574706c6163653a20526566756e64206661696c6564006044820152fd5b5034151561145a565b608460405162461bcd60e51b815260206004820152602b60248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204554482060448201527f416d6f756e742053656e740000000000000000000000000000000000000000006064820152fd5b9650611e4c338b846004356155af565b9661143d565b608460405162461bcd60e51b815260206004820152603360248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204465736960448201527f72656420507572636861736520416d6f756e74000000000000000000000000006064820152fd5b506004356000526004602052600560406000200154871115611415565b90919550611eec92965088600435615442565b9093819585611efc575b80611408565b611f5f90600435600052600c60205260406000206001600160a01b038b16600052602052604060002084600052602052604060002054926004356000526009602052611f4f8560016040600020016149f6565b90549060031b1c6044358c615558565b1561204c57611f7189604435926149dc565b11611fbc57600435600052600c60205260406000206001600160a01b0388166000526020526040600020906000526020526040600020611fb28882546149dc565b9055888080611ef6565b60a460405162461bcd60e51b815260206004820152605060248201527f44757463684d61726b6574706c6163653a20557365722048617320507572636860448201527f6173656420416c6c20416c6c6f636174696f6e20466f722050726f766964656460648201527f204d65726b6c65205072696f72697479000000000000000000000000000000006084820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a20536f6c64204f75740000000000006044820152fd5b955061213f6006604060002001546005602052604060002054906149e9565b9561138e565b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642052656369706960448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115610df357600091612220575b501561134a5795508861134a565b612242915060203d602011612248575b61223a8183614447565b8101906149c4565b8a612212565b503d612230565b608460405162461bcd60e51b815260206004820152602160248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420416374697660448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b5060a0850151151561131f565b608460405162461bcd60e51b815260206004820152602260248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420537461727460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b346102d1576020806003193601126102d15760043561234d614a30565b33600052600a825260ff6040600020541680156126e2575b80156126ce575b156102d157600090600092816000526005918282526002938460406000200154156126645781600052600983526123a885604060002001614c10565b94826000528484526003604060002001545b836000528585526001604060002001548110156125875760078086526123e76104d28360406000206148ae565b9060a082015115612403575b50506123fe90614a21565b6123ba565b90988587918b8a8c88866080850151156000146125105761245296925061053691509361244a9361054e958201988951946000525260408b81600020015491015190614a0e565b8094516149e9565b99816124e4575b5050906123fe915b84156124b1575b856000528652600461247e8260406000206148ae565b50016101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff82541617905590896123f3565b7f04c9193508100a8a67eca92ca0f12195ea0503198d725f2323a9b7d01f508ac160408051888152848a820152a1612468565b6123fe9392955060008080936001600160a01b03829451165af1612506614d03565b509390918a612459565b936040606461052c61254899956105256105369661244a9961054e9b88019e8f519a6000525285600020015491606087015190614cb6565b998161255b575b5050906123fe91612461565b6123fe9392955060008080936001600160a01b03829451165af161257d614d03565b509390918a61254f565b505050600080808088730bc56e3c1397e4570069e89c07936a5c6020e3be5af16125af614d03565b50156125d4576000525260016040600020015460036040600020015560018055600080f35b60a4826040519062461bcd60e51b82526004820152605460248201527f44757463684d61726b6574706c6163653a204d756c746973696720526566756e60448201527f64204661696c65642c20557365204661696c736166652057697468647261772060648201527f416e64204d616e75616c6c792050726f636573730000000000000000000000006084820152fd5b6084836040519062461bcd60e51b82526004820152603160248201527f44757463684d61726b6574706c6163653a2046696e616c20436c656172696e6760448201527f205072696365204e6f74205365656465640000000000000000000000000000006064820152fd5b506001600160a01b0360005416331461236c565b506001600160a01b03600254163314612365565b346102d15760406003193601126102d15761270f61430f565b60043560005260086020526001600160a01b0360406000209116600052602052610180604060002060ff6001820154916002810154906003810154600482015460058301546006840154916007850154936009600887015496015496604051998a5260208a015260408901526060880152608087015260a086015260c085015260e08401528181161515610100840152818160081c161515610120840152818160101c16151561014084015260181c161515610160820152f35b346102d15760606003193601126102d15767ffffffffffffffff6004356024358281116102d1576127fe90369060040161433b565b92906044358281116102d15761281890369060040161433b565b9390946128236148f9565b8160005260209260098452604060002090858311611252576128458383614b47565b906000528360002060005b8381106128a2575050505060005260098152600193846040600020019284116112525761287d8484614b47565b916000528060002060005b84811061289157005b833582820155928201928501612888565b82358282015591850191600101612850565b346102d1576020806003193601126102d1576004356000526007815260406000209081546128e181614ae1565b926128ef6040519485614447565b8184526000908152828120838086015b84841061291957604051828152806105b38185018a6146f6565b60019160059161292885614c5f565b81520192019201919084906128ff565b346102d1576020806003193601126102d15760043567ffffffffffffffff81116102d15761296a90369060040161433b565b61297681939293614ae1565b926129846040519485614447565b818452601f19918261299582614ae1565b0160005b818110612c075750506129ab81614ae1565b926129b96040519485614447565b8184526129c582614ae1565b0160005b818110612bec57505060005b818110612ab4575050506040519160408301936040845280518095526060948585019083878260051b8801019301916000905b828210612a6957505050508381038285015281808451928381520193019160005b828110612a365785850386f35b83518051865280830151868401526040808201519087015287015115158786015260809094019392810192600101612a29565b90919294938480612aa4837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c60019603018652895161483b565b9697019493919091019101612a08565b80612ac6612bbd928486999899614b8f565b35600052600680885260ff8060046040600020015416908115612bc5575b50612af0838688614b8f565b3560005260048952612b05604060002061516f565b612b0f848a614cb6565b52612b1a8389614cb6565b50612b2f612b29848789614b8f565b35615339565b91612b3b848789614b8f565b3560005260048a52612b88816040600020015491612b5a86898b614b8f565b3560005260048c5260406000200154612b7486898b614b8f565b3560005260058c52604060002054906149e9565b9060405193612b9685614388565b84528a840152604083015215156060820152612bb28287614cb6565b52610cba8186614cb6565b9493946129d5565b9050612bd2838688614b8f565b3560005281895260046040600020015460081c1689612ae4565b94809695612bf861514a565b828288010152019594956129c9565b94809695612c136150fd565b82828901015201959495612999565b346102d15760606003193601126102d157600435602435612c45816044356149e9565b90612c4f82614ae1565b92612c5d6040519485614447565b828452601f19612c6c84614ae1565b0160005b818110612cc657505060005b838110612c9957604051602080825281906105b3908201886146f6565b612cc190826000526007602052610ca56104d26040600020612cbb84886149dc565b906148ae565b612c7c565b602090612cd1615087565b82828901015201612c70565b346102d15760006003193601126102d15760206001600160a01b0360005416604051908152f35b346102d15760206003193601126102d1576001600160a01b03612d256142f9565b612d2d6148f9565b16600052600a6020526040600020600160ff19825416179055600080f35b346102d15760206003193601126102d157612d646142f9565b6001600160a01b03600254163303612dae576107b2906001600160a01b03167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255565b608460405162461bcd60e51b815260206004820152602660248201527f6f6e6c794c61756e63687061643a2043616c6c6572204973204e6f74204c617560448201527f6e636870616400000000000000000000000000000000000000000000000000006064820152fd5b346102d157612e2636614563565b90612e2f6148f9565b6000526005602052600260406000200155600080f35b346102d1576101806003193601126102d15760043567ffffffffffffffff81116102d157612e77903690600401614486565b6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102d15760405190610100820182811067ffffffffffffffff82111761125257604052612ec961430f565b82526044356001600160a01b03811681036102d15760208301526064356040830152608435606083015260a43580151581036102d157608083015260c43580151581036102d15760a083015260e43580151581036102d15760c08301526101043580151581036102d15760e08301526101243567ffffffffffffffff81116102d157612f5990369060040161433b565b90926101443567ffffffffffffffff81116102d157612f7c90369060040161433b565b949067ffffffffffffffff61016435116102d157612fa0366101643560040161433b565b96909533600052600a60205260ff604060002054168015613651575b801561363d575b156102d1576003546001600160a01b03865116600052600b602052806040600020556000526004602052604060002090805180519067ffffffffffffffff82116112525761301b826130158654614579565b86614a9c565b602090601f83116001146135c7579282600993610120936131e7999897966000926135bc575b50506000198260011b9260031b1c19161784555b6020810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e081015160078501556101008101516008850155015191015560035460005260066020526131c6600460406000206001600160a01b038851167fffffffffffffffffffffffff0000000000000000000000000000000000000000908183541617825560018201906001600160a01b0360208b0151169082541617905560408801516002820155606088015160038201550161314060808801511515829060ff60ff1983541691151516179055565b60a087015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff001617815560c0870151815460e08901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff90911691151560101b62ff0000169190911790151560181b63ff00000016179055565b6131de604051946131d68661436c565b873691614af9565b84523691614af9565b60208201526131f585614ae1565b6132026040519182614447565b85815260208101368760051b8701116102d15785905b8760051b870182106135ac575050604082015260035460005260096020526040600020815180519067ffffffffffffffff82116112525760209061325c8385614b47565b0182600052602060002060005b8381106135985750505050602082015180519067ffffffffffffffff8211611252576020600184019161329c8484614b47565b0190600052602060002060005b83811061358457505050506002604091019101519081519167ffffffffffffffff831161125257680100000000000000008311611252576020908254848455808510613567575b500190600052602060002060005b8381106135535750505050606001518015908115613548575b811561353d575b8115613532575b8115613527575b811561351c575b50156134b2578203613448576003549060005b826000526009602052600260406000200154811015613385578061337b6064613373613380948887614b8f565b351115614b9f565b614a21565b613346565b82806000526004602052600360406000200154600460406000200154116133de576133d9907fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614a21565b600355005b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e76616c69642053746172742060448201527f416e6420456e64205072696365730000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602c60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d65726b6c6560448201527f20526f6f74204c656e67746800000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642053616c65205460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152fd5b600591501484613333565b60048114915061332c565b600381149150613325565b60028114915061331e565b600181149150613317565b6001906020845194019381840155016132fe565b61357e908460005285846000209182019101614a85565b886132f0565b6001906020845194019381840155016132a9565b600190602084519401938184015501613269565b8135815260209182019101613218565b015190508e80613041565b908460005260206000209160005b601f1985168110613625575083610120936131e7999897969360019383601f19600999161061360c575b505050811b018455613055565b015160001960f88460031b161c191690558e80806135ff565b919260206001819286850151815501940192016135d5565b506001600160a01b03600054163314612fc3565b506001600160a01b03600254163314612fbc565b346102d15761367336614563565b9061367c6148f9565b6000526004602052600660406000200155600080f35b346102d15760006003193601126102d15760206001600160a01b0360025416604051908152f35b346102d15760206003193601126102d15760206136dc6136d76142f9565b6150b9565b604051908152f35b346102d15760006003193601126102d1576136fd6148f9565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102d15760c06003193601126102d15767ffffffffffffffff6004358181116102d15761378790369060040161433b565b9161379061430f565b906044358181116102d1576137a990369060040161433b565b6137b4929192614325565b6084358381116102d1576137cc90369060040161433b565b9360a4359081116102d1576137e590369060040161433b565b949093808a14806139ae575b806139a5575b1561393b576138058a614ae1565b996138136040519b8c614447565b808b52601f1961382282614ae1565b0160005b8181106139235750508a60005b8281106138ba575060405160209182820192808352815180945260408301938160408260051b8601019301916000955b8287106138705785850386f35b9091929382806138aa837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a60019603018652885161479f565b9601920196019592919092613863565b610cba8161391c9361390c8f8f908f908f908f908f908f908f8f8f8c926138f5846138fc946138ee8280966139049a614b8f565b359c614b8f565b3595615024565b969095615024565b969095614d95565b6139168383614cb6565b52614cb6565b8b90613833565b808d60208093613931614d33565b9201015201613826565b608460405162461bcd60e51b815260206004820152602a60248201527f44757463684d61726b6574706c6163653a204172726179204c656e677468732060448201527f4d757374204d61746368000000000000000000000000000000000000000000006064820152fd5b508582146137f7565b508181146137f1565b346102d1576060806003193601126102d15760043567ffffffffffffffff81116102d1576139e990369060040161433b565b90506139f96024356044356149e9565b91601f19613a0961096685614ae1565b019060005b828110613b23575050506000905b80821115613aa1576040805160208082528551818301819052600093600582901b8401810192808901929185015b828710613a575785850386f35b909192938280613a91837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516146f6565b9601920196019592919092613a4a565b816000526020916007835260406000208054613abc81614ae1565b91613aca6040519384614447565b8183526000908152858120958084015b838310613b065750505050613b00929350613af58286614cb6565b52610cba8185614cb6565b90613a1c565b600582600192613b158b614c5f565b815201980192019196613ada565b8082602080938801015201613a0e565b346102d157613b41366146c2565b9091613b4b6148f9565b60005b828110613b5757005b80613b6b6064613373613b9b948789614b8f565b613b76818587614b8f565b35836000526009602052613b946115c48360026040600020016149f6565b9055614a21565b613b4e565b346102d15760406003193601126102d157613bb961430f565b613bc16148f9565b60043560005260066020526001600160a01b03604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102d157613c15366146c2565b9091613c1f6148f9565b6000526020916009835260406000209067ffffffffffffffff831161125257613c488383614b47565b90600052826000209260005b838110613c5d57005b82358582015591810191600101613c54565b346102d15760406003193601126102d1576107b2613c8b6146b3565b613c936148f9565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff00835492151560081b169116179055565b346102d15760606003193601126102d157613cf461430f565b60443567ffffffffffffffff81116102d157604091613d1a613d2392369060040161433b565b91600435615442565b825191151582526020820152f35b346102d15760206003193601126102d1576004356000526004602052613da56040600020613d5e816145cc565b9060018101549060028101549060038101546004820154600583015460068401549160078501549360096008870154960154966040519a8b9a610140808d528c0190614673565b9860208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301520390f35b346102d15760206003193601126102d1576001600160a01b03613dfa6142f9565b16600052600a602052602060ff604060002054166040519015158152f35b346102d15760406003193601126102d15760206136dc613e3661430f565b6004356151e6565b346102d15760206003193601126102d15760206136dc600435615339565b346102d15760406003193601126102d157613e7561430f565b613e7d6148f9565b60043560005260066020526001600160a01b03600160406000200191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102d15760606003193601126102d157613edf61430f565b600435600052600c6020526001600160a01b036040600020911660005260205260406000206044356000526020526020604060002054604051908152f35b346102d157613f2b36614563565b90613f346148f9565b6000526004602052600160406000200155600080f35b346102d157613f5836614563565b90613f616148f9565b6000526004602052600760406000200155600080f35b346102d157613f8536614563565b90613f8e6148f9565b6000526004602052600560406000200155600080f35b346102d15760006003193601126102d157613fbd6148f9565b600080808047818115613fd5575b3390f115610df357005b506108fc613fcb565b346102d15760406003193601126102d15767ffffffffffffffff6024358181116102d157614010903690600401614486565b6140186148f9565b6004356000526020600481526040600020928251805191821161125257614049826140438754614579565b87614a9c565b8290601f83116001146140de5791806101209492600996946000926140d3575b50506000198260011b9260031b1c19161785555b810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501550151910155005b015190508780614069565b90601f1983169186600052846000209260005b81811061413457509260019285926009989661012098961061411b575b505050811b01855561407d565b015160001960f88460031b161c1916905587808061410e565b9293866001819287860151815501950193016140f1565b346102d15760606003193601126102d1576141646142f9565b60443567ffffffffffffffff81116102d1576020916141da61418d61080193369060040161433b565b9190926040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008782019260601b168252601481526141cb8161442b565b51902092602435923691614af9565b6154fb565b346102d15760406003193601126102d1576024803567ffffffffffffffff8082116102d157366023830112156102d15781600401359081116102d157368382840101116102d15761422e6148f9565b6004356000526020926004845260406000209261424f836130158654614579565b600094601f8411600114614290575093829394600093614283575b5050506000198260011b9260031b1c1916179055600080f35b010135905083808061426a565b91601f198416958560005283600020936000905b8882106142df5750508460019697106142c3575b50505050811b019055005b60001960f88660031b161c1992010135169055838080806142b8565b8060018497868395968901013581550196019201906142a4565b600435906001600160a01b03821682036102d157565b602435906001600160a01b03821682036102d157565b606435906001600160a01b03821682036102d157565b9181601f840112156102d15782359167ffffffffffffffff83116102d1576020808501948460051b0101116102d157565b6060810190811067ffffffffffffffff82111761125257604052565b6080810190811067ffffffffffffffff82111761125257604052565b60c0810190811067ffffffffffffffff82111761125257604052565b67ffffffffffffffff811161125257604052565b610100810190811067ffffffffffffffff82111761125257604052565b6101a0810190811067ffffffffffffffff82111761125257604052565b610140810190811067ffffffffffffffff82111761125257604052565b6040810190811067ffffffffffffffff82111761125257604052565b90601f601f19910116810190811067ffffffffffffffff82111761125257604052565b67ffffffffffffffff811161125257601f01601f191660200190565b9190916101409081818503126102d1576040519182019367ffffffffffffffff948381108682111761125257604052829482359081116102d157820181601f820112156102d15780356144d88161446a565b916144e66040519384614447565b8183526020938483830101116102d157816000928580930183860137830101528352808201359083015260408101356040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080910135910152565b60031960409101126102d1576004359060243590565b90600182811c921680156145c2575b602083101461459357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614588565b90604051918260008254926145e084614579565b90818452600194858116908160001461464f575060011461460c575b505061460a92500383614447565b565b9093915060005260209081600020936000915b81831061463757505061460a935082010138806145fc565b8554888401850152948501948794509183019161461f565b905061460a95506020935060ff1991501682840152151560051b82010138806145fc565b919082519283825260005b84811061469f575050601f19601f8460006020809697860101520116010190565b60208183018101518483018201520161467e565b6024359081151582036102d157565b9060406003198301126102d157600435916024359067ffffffffffffffff82116102d1576146f29160040161433b565b9091565b90815180825260208080930193019160005b828110614716575050505090565b835180516001600160a01b031686528083015186840152604080820151908701526060808201519087015260808082015115159087015260a09081015115159086015260c09094019392810192600101614708565b90815180825260208080930193019160005b82811061478b575050505090565b83518552938101939281019260010161477d565b906147b382516101a080845283019061476b565b916020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100808201519083015261012080820151151590830152610140808201511515908301526101608082015115159083015261018080910151151591015290565b9061484f8251610140808452830190614673565b916020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151908301526101208091015191015290565b80548210156148ca576000526005602060002091020190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b0360005416330361490d57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9060405161495e816143d4565b60e060ff600483956001600160a01b0380825416865260018201541660208601526002810154604086015260038101546060860152015481811615156080850152818160081c16151560a0850152818160101c16151560c085015260181c161515910152565b908160209103126102d1575180151581036102d15790565b91908201809211611cd257565b91908203918211611cd257565b80548210156148ca5760005260206000200190600090565b81810292918115918404141715611cd257565b6000198114611cd25760010190565b600260015414614a41576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b818110614a90575050565b60008155600101614a85565b9190601f8111614aab57505050565b61460a926000526020600020906020601f840160051c83019310614ad7575b601f0160051c0190614a85565b9091508190614aca565b67ffffffffffffffff81116112525760051b60200190565b9291614b0482614ae1565b91614b126040519384614447565b829481845260208094019160051b81019283116102d157905b828210614b385750505050565b81358152908301908301614b2b565b68010000000000000000821161125257805491808255828110614b6957505050565b60009182526020822092830192015b828110614b8457505050565b818155600101614b78565b91908110156148ca5760051b0190565b15614ba657565b608460405162461bcd60e51b815260206004820152602960248201527f44757463684d61726b6574706c6163653a20496e76616c696420446973636f7560448201527f6e7420416d6f756e7400000000000000000000000000000000000000000000006064820152fd5b9060405191828154918282526020928383019160005283600020936000905b828210614c455750505061460a92500383614447565b855484526001958601958895509381019390910190614c2f565b90604051614c6c816143a4565b60a060ff600483956001600160a01b03815416855260018101546020860152600281015460408601526003810154606086015201548181161515608085015260081c161515910152565b80518210156148ca5760209160051b010190565b8115614cd4570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3d15614d2e573d90614d148261446a565b91614d226040519384614447565b82523d6000602084013e565b606090565b60405190614d40826143f1565b81606081526101806000918260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201520152565b9290959693614da2614d33565b50614dac84615339565b6000948086526020906006825260409360ff6004868a20015460081c16998a15615013575b60ff6004878b20015460181c1699614de98d856151e6565b976001600160a01b03806080528116614f69575b508c9d8a9b9c9d858c9a9b9c5260088752888a2060805182168b5287526001898b20015493848d10614f5f575b90614e4685949392614e3e8f978d986149e9565b97838a615442565b888d52600c8a528b8d2060805184168e528a528b8d20818e528a529a909b20549a9c8d614f2c575b505050508360005260088552816000209d608051169d8e6000528552816000209d846000526008865282600020906000528552816000206003015493600052600485528160002060060154600586528260002054614ecb916149e9565b9482519e8f90614eda826143f1565b614ee390614c10565b815201528c015260608b015260808a015260a089015260c088015260e0870152610100860152151561012085015215156101408401521515610160830152151561018082015290565b614f48614f55959f600188828f938e8e600992525220016149f6565b90549060031b1c91615558565b9938808f81614e6e565b939b508b93614e2a565b614fbd868f83908b5193849283927f9c395bc2000000000000000000000000000000000000000000000000000000008452600484019060209093929360408301946001600160a01b03809216845216910152565b03816d76a84fef008cdabe6409d2fe638b5afa908115615009578c91614fec575b5015614dfd579c5089614dfd565b6150039150873d89116122485761223a8183614447565b38614fde565b89513d8e823e3d90fd5b8589206004015460ff169a50614dd1565b91908110156148ca5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102d157019081359167ffffffffffffffff83116102d1576020018260051b360381136102d1579190565b60405190615094826143a4565b8160a06000918281528260208201528260408201528260608201528260808201520152565b6001600160a01b0316600052600b602052604060002054806150fa57507f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b90565b6040519061510a8261440e565b81606081526101206000918260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152565b6040519061515782614388565b60006060838281528260208201528260408201520152565b9060405161517c8161440e565b6101206009829461518c816145cc565b845260018101546020850152600281015460408501526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e085015260088101546101008501520154910152565b91906151f183615339565b9060009380855260059460209386855260029060409180838520015495600888526001600160a01b0384862091168552875261522e838520614c10565b98858552600988526152438285872001614c10565b9285971515955b8b518910156152ee57896152bf9189898f89898f8961527f8f956104d2906104cb8f9560078e8d600052528960002092614cb6565b95806152e1575b156152c5575061052c859361052561053696946064948c61055d9d61054e9c9b01519a6000525285600020015491606087015190614cb6565b9761524a565b9250505061054e93506105369161055d96840151930151614a0e565b5060808601511515615286565b9a50505050505050505050565b60405190615308826143d4565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b60008181526004906020908282526040916007838320015442111561543657600581526002838320015461542a578381526003838320015461538160078585200154426149e9565b908684528583526153986008868620015483614cca565b1c90868452858352600885852001549081156153fe57916153d66153c36153df938996950683614a0e565b8987528585526008888820015490614cca565b60011c906149e9565b958352528282822001548411156153f65750505090565b200154919050565b6024856012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50206002015492915050565b50206003015492915050565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b168252601481526154868161442b565b5190209360005b876000526009825282600020548110156154e9576154c4866154b283866000206149f6565b90549060031b1c6141da368989614af9565b6154dc57906154d4600992614a21565b90915061548d565b9650505050505060019190565b505050505050905060009062010f2c90565b929091906000915b8451831015615550576155168386614cb6565b519060008282101561553e575060005260205261553860406000205b92614a21565b91615503565b60409161553893825260205220615532565b915092501490565b926150fa94936141da92604051907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602083019360601b1683526034820152603481526155a48161436c565b519020933691614af9565b92909160009384818152602060088152604090818320906001600160a01b038097169182855281526155e2838520614c10565b93975b84518910156157175785600052600780835261560b6104d2866000206104cb8d8a614cb6565b8981511685036156d4578b890361562a57505050505050505050505090565b978a9b8888839c9d615697958a6156568a9b9c9d9e9f6105368b61569d9c9d8301948551930151614a0e565b9680615662888a6149dc565b116156aa575b5061568f926001949261567f896104cb94516149e9565b966000528c528d60002092614cb6565b5001556149dc565b99614a21565b97969594939291906155e5565b6104cb919750926001949261567f6156c58961568f976149e9565b9993505092945092508f615668565b60648487519062461bcd60e51b82526004820152601f60248201527f44757463684d61726b6574706c6163653a20496e76616c6964205374617465006044820152fd5b5050505050505050509056fea2646970667358221220b8ec5968d352a76117c8a8e648d034f6bb47226b60b222accff8ea8bfb53642964736f6c63430008110033
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.