Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 333 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
___Withdraw Ethe... | 17865435 | 504 days ago | IN | 0 ETH | 0.00103046 | ||||
Purchase | 17706949 | 526 days ago | IN | 0.15 ETH | 0.00716966 | ||||
Purchase | 17689762 | 528 days ago | IN | 0.15 ETH | 0.00711999 | ||||
Purchase | 17687686 | 529 days ago | IN | 0.15 ETH | 0.00823198 | ||||
Purchase | 17687577 | 529 days ago | IN | 0.15 ETH | 0.00842379 | ||||
Purchase | 17687405 | 529 days ago | IN | 0.15 ETH | 0.01001674 | ||||
Purchase | 17686455 | 529 days ago | IN | 0.15 ETH | 0.01807686 | ||||
Purchase | 17686215 | 529 days ago | IN | 0.45 ETH | 0.02141155 | ||||
Purchase | 17686211 | 529 days ago | IN | 0.75 ETH | 0.01968035 | ||||
Purchase | 17686203 | 529 days ago | IN | 0.15 ETH | 0.02015878 | ||||
Purchase | 17686155 | 529 days ago | IN | 0.15 ETH | 0.02025386 | ||||
Purchase | 17686108 | 529 days ago | IN | 0.3 ETH | 0.01728947 | ||||
__Initiate Refun... | 17686080 | 529 days ago | IN | 0 ETH | 0.01785008 | ||||
___Modify Sale C... | 17686078 | 529 days ago | IN | 0 ETH | 0.00271694 | ||||
Purchase | 17686076 | 529 days ago | IN | 0.15 ETH | 0.02141366 | ||||
Purchase | 17686068 | 529 days ago | IN | 0.16610477 ETH | 0.01544999 | ||||
Purchase | 17686056 | 529 days ago | IN | 0.18166493 ETH | 0.01755116 | ||||
Purchase | 17686045 | 529 days ago | IN | 0.39756224 ETH | 0.017605 | ||||
Purchase | 17686043 | 529 days ago | IN | 0 ETH | 0.01750575 | ||||
Purchase | 17686037 | 529 days ago | IN | 0.21900933 ETH | 0.0178592 | ||||
Purchase | 17686009 | 529 days ago | IN | 0.7787863 ETH | 0.01765614 | ||||
Purchase | 17685816 | 529 days ago | IN | 2.88174273 ETH | 0.03028448 | ||||
___Modify Sale R... | 17685731 | 529 days ago | IN | 0 ETH | 0.00499216 | ||||
___Modify Timest... | 17685653 | 529 days ago | IN | 0 ETH | 0.00313725 | ||||
___Modify Sale R... | 17685574 | 529 days ago | IN | 0 ETH | 0.00364597 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17865435 | 504 days ago | 2.5505446 ETH | ||||
17686215 | 529 days ago | 0.05811721 ETH | ||||
17686108 | 529 days ago | 0.09133817 ETH | ||||
17686080 | 529 days ago | 1.725 ETH | ||||
17686080 | 529 days ago | 0.015 ETH | ||||
17686080 | 529 days ago | 0.0098807 ETH | ||||
17686080 | 529 days ago | 0.0585529 ETH | ||||
17686080 | 529 days ago | 0.15133817 ETH | ||||
17686080 | 529 days ago | 0.12756224 ETH | ||||
17686080 | 529 days ago | 0.08811721 ETH | ||||
17686080 | 529 days ago | 0.3101141 ETH | ||||
17686080 | 529 days ago | 2.19438796 ETH | ||||
17686068 | 529 days ago | 0.00622406 ETH | ||||
17686056 | 529 days ago | 0.00311203 ETH | ||||
17686045 | 529 days ago | 0.00622406 ETH | ||||
17686037 | 529 days ago | 0.01089211 ETH | ||||
17686009 | 529 days ago | 0.01867219 ETH | ||||
17685816 | 529 days ago | 0.04979253 ETH | ||||
17282311 | 586 days ago | 11.9928417 ETH | ||||
17282292 | 586 days ago | 0.05 ETH | ||||
17282292 | 586 days ago | 0.025 ETH | ||||
17282292 | 586 days ago | 0.1 ETH | ||||
17282292 | 586 days ago | 0.025 ETH | ||||
17282292 | 586 days ago | 0.05 ETH | ||||
17282292 | 586 days ago | 0.025 ETH |
Loading...
Loading
Contract Name:
DutchMarketplace
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 DutchMarketplace 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 _MaxAmtPerPurchase; // [5] -> _MaxAmtPerPurchase 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[] _AmountPurchasedPriority; // [1] -> _AmountPurchasedPriority | The Amount Of Tokens Purchased By The User For The Provided Priority uint _PurchasedAmount; // [2] -> _PurchaseAmount | The Amount Of Tokens Purchased By The User uint _RemainingPurchaseAmount; // [3] -> _RemainingPurchaseAmount | The Amount Of Tokens Remaining To Be Purchased Specifically For The User uint _ClaimIndex; // [4] -> _ClaimIndex | If ETH-Claims Are Enabled, This Is The User's Current Claim Index uint _AmountRemaining; // [5] -> _AmountRemaining | The Amount Of Tokens Remaining To Be Sold uint _CurrentPrice; // [6] -> _MintPassCurrentPrice | The Current Price Of The Token To Be Sold uint _Priority; // [7] -> _Priority For BrightList | The User's Priority For The BrightList | note: (0 Is Highest 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 _DN = 0x00000000000076A84feF008CDAbe6409d2FE638B; // `delegate.cash` 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(uint SaleIndex, 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[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 { require(tx.origin == msg.sender, "DutchMarketplace: EOA Only, Use `delegate.cash` For Wallet Delegation"); 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(_DN).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; 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]._MaxAmtPerPurchase, "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(msg.sender, TotalETHContributed - PurchaseValue); } Orders[SaleIndex].push(Order(msg.sender, PurchaseValue, Amount, Priority, BrightListEligible, false)); UserInfo[SaleIndex][msg.sender]._UserOrderIndexes.push(OrderIndex); UserInfo[SaleIndex][msg.sender]._PurchasedAmount = UserInfo[SaleIndex][msg.sender]._PurchasedAmount + Amount; 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(SaleIndex, Recipient, Amount, PurchaseValue, NewAmountSold, BrightListEligible, Priority, AppliedCredit); } /*------------------ * ADMIN FUNCTIONS * -------------------*/ /** * @dev Starts A Sale * note: Returns SaleIndex * note: The True Discount Amount Is 100 - _Sale._DiscountAmount * note: Ex. _DiscountAmount = 75 = 25% Discount */ function __StartSale( Sale memory _Sale, InternalSale memory _InternalSale, bytes32[] calldata RootsPriority, bytes32[] calldata RootsAmounts, uint[] calldata DiscountAmounts ) external onlyAdmin returns (uint) { 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 (most gas efficient) || _InternalSale._Type == 1 // Bespoke MintPass Direct Mint (most gas efficient) || _InternalSale._Type == 2 // Factory MintPack Direct Mint (most gas efficient) || _InternalSale._Type == 3 // transferFrom() Sale (NFTs Already Minted) (not gas efficient) || _InternalSale._Type == 4 // purchaseTo() Sale (ArtBlocks Or Custom Mint Pass) (not gas efficient) || _InternalSale._Type == 5 // transferFrom() MintPack Sale (NFTs Already Minted) (not gas efficient) , "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++; return (_TOTAL_UNIQUE_SALES_DUTCH - 1); } /** * @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 ___ModifyMaxAmtPerPurchase(uint SaleIndex, uint MaxAmtPerPurchase) external onlyOwner { Sales[SaleIndex]._MaxAmtPerPurchase = MaxAmtPerPurchase; } /** * @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++; } } } /*----------------- * 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[] memory PriorityPurchaseAmounts = new uint[](SaleParams[SaleIndex]._Roots.length); 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); uint UserPurchasedAmount = UserInfo[SaleIndex][Wallet]._PurchasedAmount; if(Vault != address(0)) { if(IDelegationRegistry(_DN).checkDelegateForAll(Wallet, Vault)) { Wallet = Vault; } } for(uint x; x < SaleParams[SaleIndex]._Roots.length; x++) { PriorityPurchaseAmounts[x] = PriorityPurchaseAmount[SaleIndex][Wallet][x]; } if(MaxAmount < UserPurchasedAmount) { MaxAmount = UserPurchasedAmount; } PurchasableAmount = MaxAmount - UserPurchasedAmount; (Verified, Priority) = ViewBrightListStatus(SaleIndex, Wallet, ProofEligibility); if(Verified) { VerifiedAmount = VerifyAmount(Wallet, MaxAmount, SaleParams[SaleIndex]._RootsAmounts[Priority], ProofAmount); } return ( _UserSaleInformation ( UserInfo[SaleIndex][Wallet]._UserOrderIndexes, // The User's Order Indexes PriorityPurchaseAmounts, // The User's Purchase Amounts Corresponding To Priority 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 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, // If ActiveRespend Credit Is Active 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 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":"uint256","name":"SaleIndex","type":"uint256"},{"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":"_MaxAmtPerPurchase","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":"_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 DutchMarketplace.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":"_MaxAmtPerPurchase","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 DutchMarketplace.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 DutchMarketplace.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 DutchMarketplace.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 DutchMarketplace.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 DutchMarketplace.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 DutchMarketplace.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 DutchMarketplace.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":"_MaxAmtPerPurchase","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 DutchMarketplace.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 DutchMarketplace.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":"_AmountPurchasedPriority","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":"_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 DutchMarketplace._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":"_AmountPurchasedPriority","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":"_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 DutchMarketplace._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":"_MaxAmtPerPurchase","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 DutchMarketplace.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 DutchMarketplace.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":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MaxAmtPerPurchase","type":"uint256"}],"name":"___ModifyMaxAmtPerPurchase","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":"_MaxAmtPerPurchase","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 DutchMarketplace.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":"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
6080806040523461009457600080546001600160a01b0319808216339081178455604093926001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08480a36001805573e06f5fae754e81bc050215ff89b03d9e9ff20700809160025416176002558152600a60205220600160ff198254161790556157e290816200009a8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8062432a1e146141e4578063040415731461415057806307939f0b14613fe357806309beb0c014613fa95780631020b28b14613f7c5780631af4853c14613f4f578063228dd2b514613ef8578063242a44e414613e8e57806326abb6a114613e7057806328804ebc14613e4a57806333b005d014613e0b5780633529280b14613d635780633756b14614613d0d57806344a2464e14613ca157806352163cd214613c39578063581ed44514613bd25780635c4e364214613b65578063611118bf146139e957806368f9b33c14613787578063715018a61461371657806374509071146136eb578063765b8b51146136c4578063784edfa7146136975780637933479614612e6157806384f7ec6914612e345780638833a35414612d6e5780638d06418e14612d275780638da5cb5b14612d0057806394d2ea7c14612c455780639808ac521461295b5780639b273df1146128d75780639cbf7228146127ec5780639debbd4114612724578063a3c3b3041461235e578063a61f3a871461122a578063a6db141114611190578063a70bf2f514610fa0578063adfbc6a614610f0f578063b1e2da1814610ec6578063b7e1aef514610e8c578063c618a09314610e6e578063c67ff91714610e2a578063c69d7a1514610da8578063cd27a03614610cb1578063d8fa3d6814610c84578063d902c38214610b13578063dc8f18d3146108f8578063de0ed505146108cb578063e358c4ad14610843578063e3e9f9a6146107d3578063e85727051461077c578063e96450031461066c578063ead82d531461061d578063eceda49a14610415578063f0510f51146103e8578063f2fde38b146102f8578063f94f0fe3146102cb5763fd2c4a0a1461029957600080fd5b346102c6576102a736614568565b906102b0614909565b6000526004602052600460406000200155600080f35b600080fd5b346102c6576102d936614568565b906102e2614909565b6000526004602052600360406000200155600080f35b346102c65760206003193601126102c6576103116142fe565b610319614909565b6001600160a01b0380911690811561037e57600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102c6576103f636614568565b906103ff614909565b6000526004602052600560406000200155600080f35b346102c65760406003193601126102c65761042e614314565b6004356000526005602052600260406000200154156105d9576104526004356153c2565b6000916000809360043560005260056020526002604060002001549260086020526001600160a01b03604060002091166000526020526104956040600020614c20565b80519460043560005260096020526104b36002604060002001614c20565b916000975b81518910156105b55761057f6105859160406105766104fa6104f48e60043560005260076020526104ed85600020918a614cc6565b51906148be565b50614c6f565b998a898d15158e6105a8575b1561058b5761055e610565916105588488606461054e6020610570990151956004356000526005602052610547600285600020015491606087015190614cc6565b5190614a1e565b0491015190614a1e565b906149f9565b809c6149ec565b9a60208d01516149f9565b906149ec565b980151906149ec565b98614a31565b976104b8565b5061056561055e826105588c886020610570970151930151614a1e565b5060808201511515610506565b604080518981526020810192909252810186905260608101859052608090f35b0390f35b606460405162461bcd60e51b815260206004820152601260248201527f53616c65204e6f7420436f6e636c7564656400000000000000000000000000006044820152fd5b346102c65760206003193601126102c657600435600090815260056020908152604091829020805460018201546002830154600390930154855192835293820152928301526060820152608090f35b346102c65760406003193601126102c6576004356001600160a01b0381168091036102c6576024359061069d614909565b81151580610772575b1561072e57600080809381935af16106bc614d13565b50156106c457005b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b50478211156106a6565b346102c65760806003193601126102c6576107956142fe565b60643567ffffffffffffffff81116102c6576020916107bb6107c9923690600401614340565b9160443590602435906155e1565b6040519015158152f35b346102c65760406003193601126102c6576108416107ef6146b8565b6107f7614909565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff63ff000000835492151560181b169116179055565b005b346102c65760c06003193601126102c65761085c614314565b61086461432a565b67ffffffffffffffff906084358281116102c657610886903690600401614340565b60a4949194359384116102c6576105d5946108a86108b7953690600401614340565b94909360443590600435614dd7565b6040519182916020835260208301906147a4565b346102c6576108d936614568565b906108e2614909565b6000526006602052600260406000200155600080f35b346102c6576020806003193601126102c657600435908160005260059081815260019081604060002001549261094661093085614af1565b9461093e604051968761444c565b808652614af1565b90601f198386019201368337856000528083526109698460406000200154614da6565b958060005260098452600261098381604060002001614c20565b9061098d836153c2565b93610996615110565b506000885b610a1c575b505050505050604051936040850190604086525180915260608501919060005b818110610a00575050508381038285015281808651928381520195019160005b8281106109ed5785870386f35b83518752958101959281019284016109e0565b82516001600160a01b03168452928401929184019185016109c0565b9087859493928a9c9a9660009a999a528282528b8b8860406000200154831015610b0457826001600160a01b038b610ac993876007610acf9952848d8d8d8d610a6c6104f48660406000206148be565b60808101519098899115610ade5750610ab99493610547610558946064948a610abf9b610aad9601519860005252604060002001549160608c015190614cc6565b04604088015190614a1e565b92614cc6565b525b511692614cc6565b52614a31565b9091929394989a97969761099b565b9350610ab994506105589250610afe969150015191604088015190614a1e565b52610ac1565b505050509997999695966109a0565b346102c6576020806003193601126102c65760043567ffffffffffffffff81116102c657610b45903690600401614340565b9190610b5083614af1565b92610b5e604051948561444c565b808452601f19610b6d82614af1565b018360005b828110610c6e5750505060005b818110610c2a57604080518581528651818701819052878701928201908760005b828110610bad5784840385f35b9091928261010082610c1b6001948a5160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b01960191019492919094610ba0565b80610c39610c69928486614b9f565b3560005260068552610c4e6040600020614961565b610c588288614cc6565b52610c638187614cc6565b50614a31565b610b7f565b610c76615384565b828289010152018490610b72565b346102c657610c9236614568565b90610c9b614909565b6000526004602052600860406000200155600080f35b346102c65760606003193601126102c657610cca6142fe565b610cd2614314565b9060443567ffffffffffffffff81116102c657610cf483913690600401614340565b610cff929192614909565b6001600160a01b0360009416935b818110610d1657005b610d21818386614b9f565b3590853b156102c6576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03851660248201526044810192909252600082606481838a5af1918215610d9c57600192610d8d575b5001610d0d565b610d96906143c5565b86610d86565b6040513d6000823e3d90fd5b346102c657610db636614568565b906000526007602052604060002080548210156102c65760c091610dd9916148be565b5060ff6001600160a01b0382541691600181015490600281015460046003830154920154926040519586526020860152604085015260608401528181161515608084015260081c16151560a0820152f35b346102c65760206003193601126102c6576001600160a01b03610e4b6142fe565b610e53614909565b16600052600a602052604060002060ff198154169055600080f35b346102c65760006003193601126102c6576020600354604051908152f35b346102c65760206003193601126102c6576001600160a01b03610ead6142fe565b16600052600b6020526020604060002054604051908152f35b346102c65760406003193601126102c657610841610ee26146b8565b610eea614909565b600435600052600660205260046040600020019060ff60ff1983541691151516179055565b346102c65760206003193601126102c6576004356000526006602052610100604060002060ff6001600160a01b03918281541692600182015416906002810154600460038301549201549260405195865260208601526040850152606084015281811615156080840152818160081c16151560a0840152818160101c16151560c084015260181c16151560e0820152f35b346102c6576020806003193601126102c65760043590610fbe615186565b50610fc7615384565b50610fd06151d3565b5060405191610fde83614371565b606083818095528184820152604001528060005260048252604060002090600683526040600020926005815260406000209060098152604060002092611023906153c2565b9361102d906151f8565b9461103790614961565b92604051966110458861438d565b8354885260018401549383890194855260028101549060408a0191825260030154828a019081526040519161107983614371565b61108285614c20565b835261109060018601614c20565b948684019586526002016110a390614c20565b96604084019788526040519b8c9b8c6101e08091528d016110c39161484b565b99888d016111299160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b516101208c0152516101408b0152516101608a0152516101808901528786036101a08901525190808652850161115e91614770565b9051918482039085015261117191614770565b905191808203906040015261118591614770565b906101c08301520390f35b346102c65761119e366146c7565b90916111a8614909565b60005260209160098352600192836040600020019167ffffffffffffffff84116111fb576111d68484614b57565b916000528060002060005b8481106111ea57005b8335828201559282019285016111e1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60c06003193601126102c65761123e61432a565b67ffffffffffffffff6084358181116102c65761125f903690600401614340565b92909160a4359081116102c65761127a903690600401614340565b919093611285614a40565b602435933332036122ce5760043560005260066020526112a86040600020614961565b956004356000526004602052600760406000200154421061226457608087015115801590612257575b156121ed5733946004356000526005602052600160406000200154946001600160a01b03811661214d575b506001600160a01b038616156120e3576004356000526005602052611326876040600020546149ec565b6004356000526004602052600660406000200154106120be575b600435600052600560205261135a876040600020546149ec565b916004356000526004602052600660406000200154831161207a5762010f2c9460009460a08b0151611e77575b5050505085151580611e5a575b15611df0576113a46004356153c2565b966113af8789614a1e565b9760009560e0830151611dda575b6113c787346149ec565b8a8110611d70578a80821180611d67575b611cd1575b505060043560005260076020526040600020604051906113fc826143a9565b3382528b60208301528a60408301528760608301528615156080830152600060a08301528054680100000000000000008110156111fb57611442916001820181556148be565b919091611ca25760a060046114f5936001600160a01b038451167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815560208401516001820155604084015160028201556060840151600382015501916114c060808201511515849060ff60ff1983541691151516179055565b015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff0016179055565b600435600052600860205260406000203360005260205260406000208054680100000000000000008110156111fb57611538818493600161155194018155614a06565b819391549060031b600019811b9283911b169119161790565b9055600435600052600860205260406000203360005260205261157c896002604060002001546149ec565b6004356000526008602052604060002033600052602052600260406000200155600181018111611c735760019060043560005260056020520160016040600020015582604060002055604060002054600460205260066040600020015410611c2f576004356000526005602052604060002054600460205260066040600020015414611be4575b5060608101518061170157506001600160a01b0390511696600435600052600460205260016040600020015497803b156102c6576040517fe0d92a7600000000000000000000000000000000000000000000000000000000815260048101999099523360248a0152604489018890526000908990606490829084905af1968715610d9c577ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba98610100986116f2575b505b6001600160a01b03604051976004358952166020880152604087015260608601526080850152151560a084015260c083015260e0820152a160018055005b6116fb906143c5565b896116b2565b600181036117a85750516001600160a01b031696873b156102c6576040517fecd3769d00000000000000000000000000000000000000000000000000000000815233600482015260248101889052976000908990818381604481015b03925af1968715610d9c577ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba9861010098611799575b506116b4565b6117a2906143c5565b89611793565b6002810361182557506001600160a01b0390511696600435600052600460205260016040600020015497803b156102c6576040517fe076109000000000000000000000000000000000000000000000000000000000815260048101999099523360248a01526044890188905260009089908183816064810161175d565b6003819993949596979892991460001461194b575090919293949596600090602081019060408101925b8481106118a857505050918161188f7ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba99979593610100999795516149ec565b60043560005260066020526002604060002001556116b4565b6001600160a01b03825116906001600160a01b038451166118ca8287516149ec565b833b156102c6576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152916000908390606490829084905af1918215610d9c576119379261193c5750614a31565b61184f565b611945906143c5565b8c610c63565b60048103611a3f575090919293949596600435600052600460205260026040600020015460005b8381106119ac57505050916101009593917ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba9795936116b4565b82516040517f891407c00000000000000000000000000000000000000000000000000000000081523360048201526024810184905290602090829060449082906000906001600160a01b03165af18015610d9c57611a14575b50611a0f90614a31565b611972565b602090813d8311611a38575b611a2a818361444c565b810103126102c6578a611a05565b503d611a20565b600503611b7a5760043560005260046020526009604060002001549760408101516000905b838210611aab5750509061188f7ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba996105708360406101009c9b9a99989796015192614a1e565b8a9060005b828110611ad15750611acb91611ac5916149ec565b91614a31565b90611a64565b91506001600160a01b03845116916001600160a01b03602086015116611af782846149ec565b843b156102c6576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152926000908490606490829084905af1908115610d9c578d93611b6692611b6b5750614a31565b611ab0565b611b74906143c5565b8e610c63565b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e636f72726563742053616c6560448201527f20436f6e66696775726174696f6e0000000000000000000000000000000000006064820152fd5b6005602090815260406000818120600201939093556006909152902060040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905588611603565b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a204f766572666c6f770000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b611cda916149f9565b600080808084335af1611ceb614d13565b5015611d235760207f3d2a04f53164bedf9a8a46353305d6b2d2261410406df3b41f99ce6489dc003c91604051908152a18a8a6113dd565b606460405162461bcd60e51b815260206004820152601f60248201527f44757463684d61726b6574706c6163653a20526566756e64204661696c6564006044820152fd5b503415156113d8565b608460405162461bcd60e51b815260206004820152602b60248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204554482060448201527f416d6f756e742053656e740000000000000000000000000000000000000000006064820152fd5b9550611dea338a83600435615638565b956113bd565b608460405162461bcd60e51b815260206004820152603360248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204465736960448201527f72656420507572636861736520416d6f756e74000000000000000000000000006064820152fd5b506004356000526004602052600560406000200154861115611394565b90919450611e8a929550876004356154cb565b9092819484611e9a575b80611387565b611efd90600435600052600c60205260406000206001600160a01b038a16600052602052604060002084600052602052604060002054926004356000526009602052611eed856001604060002001614a06565b90549060031b1c6044358b6155e1565b15611fea57611f0f88604435926149ec565b11611f5a57600435600052600c60205260406000206001600160a01b0387166000526020526040600020906000526020526040600020611f508782546149ec565b9055878080611e94565b60a460405162461bcd60e51b815260206004820152605060248201527f44757463684d61726b6574706c6163653a20557365722048617320507572636860448201527f6173656420416c6c20416c6c6f636174696f6e20466f722050726f766964656460648201527f204d65726b6c65205072696f72697479000000000000000000000000000000006084820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a20536f6c64204f75740000000000006044820152fd5b95506120dd6006604060002001546005602052604060002054906149f9565b95611340565b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642052656369706960448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115610d9c576000916121be575b50156112fc579550886112fc565b6121e0915060203d6020116121e6575b6121d8818361444c565b8101906149d4565b8a6121b0565b503d6121ce565b608460405162461bcd60e51b815260206004820152602160248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420416374697660448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b5060a087015115156112d1565b608460405162461bcd60e51b815260206004820152602260248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420537461727460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b60a460405162461bcd60e51b815260206004820152604560248201527f44757463684d61726b6574706c6163653a20454f41204f6e6c792c205573652060448201527f6064656c65676174652e636173686020466f722057616c6c65742044656c656760648201527f6174696f6e0000000000000000000000000000000000000000000000000000006084820152fd5b346102c6576020806003193601126102c65760043561237b614a40565b33600052600a825260ff604060002054168015612710575b80156126fc575b156102c657600090600092816000526005918282526002938460406000200154156126925781600052600983526123d685604060002001614c20565b94826000528484526003604060002001545b836000528585526001604060002001548110156125b55760078086526124156104f48360406000206148be565b9060a082015115612431575b505061242c90614a31565b6123e8565b90988587918b8a8c888660808501511560001461253e5761248096925061055891509361247893610570958201988951946000525260408b81600020015491015190614a1e565b8094516149f9565b9981612512575b50509061242c915b84156124df575b85600052865260046124ac8260406000206148be565b50016101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8254161790559089612421565b7f04c9193508100a8a67eca92ca0f12195ea0503198d725f2323a9b7d01f508ac160408051888152848a820152a1612496565b61242c9392955060008080936001600160a01b03829451165af1612534614d13565b509390918a612487565b936040606461054e612576999561054761055896612478996105709b88019e8f519a6000525285600020015491606087015190614cc6565b9981612589575b50509061242c9161248f565b61242c9392955060008080936001600160a01b03829451165af16125ab614d13565b509390918a61257d565b505050600080808088730bc56e3c1397e4570069e89c07936a5c6020e3be5af16125dd614d13565b5015612602576000525260016040600020015460036040600020015560018055600080f35b60a4826040519062461bcd60e51b82526004820152605460248201527f44757463684d61726b6574706c6163653a204d756c746973696720526566756e60448201527f64204661696c65642c20557365204661696c736166652057697468647261772060648201527f416e64204d616e75616c6c792050726f636573730000000000000000000000006084820152fd5b6084836040519062461bcd60e51b82526004820152603160248201527f44757463684d61726b6574706c6163653a2046696e616c20436c656172696e6760448201527f205072696365204e6f74205365656465640000000000000000000000000000006064820152fd5b506001600160a01b0360005416331461239a565b506001600160a01b03600254163314612393565b346102c65760406003193601126102c65761273d614314565b60043560005260086020526001600160a01b0360406000209116600052602052610160604060002060ff600282015491600381015490600481015460058201546006830154906007840154926009600886015495015495604051988952602089015260408801526060870152608086015260a085015260c0840152818116151560e0840152818160081c161515610100840152818160101c16151561012084015260181c161515610140820152f35b346102c65760606003193601126102c65767ffffffffffffffff6004356024358281116102c657612821903690600401614340565b92906044358281116102c65761283b903690600401614340565b939094612846614909565b81600052602092600984526040600020908583116111fb576128688383614b57565b906000528360002060005b8381106128c5575050505060005260098152600193846040600020019284116111fb576128a08484614b57565b916000528060002060005b8481106128b457005b8335828201559282019285016128ab565b82358282015591850191600101612873565b346102c6576020806003193601126102c65760043560005260078152604060002090815461290481614af1565b92612912604051948561444c565b8184526000908152828120838086015b84841061293c57604051828152806105d58185018a6146fb565b60019160059161294b85614c6f565b8152019201920191908490612922565b346102c6576020806003193601126102c65760043567ffffffffffffffff81116102c65761298d903690600401614340565b61299981939293614af1565b926129a7604051948561444c565b818452601f1991826129b882614af1565b0160005b818110612c2a5750506129ce81614af1565b926129dc604051948561444c565b8184526129e882614af1565b0160005b818110612c0f57505060005b818110612ad7575050506040519160408301936040845280518095526060948585019083878260051b8801019301916000905b828210612a8c57505050508381038285015281808451928381520193019160005b828110612a595785850386f35b83518051865280830151868401526040808201519087015287015115158786015260809094019392810192600101612a4c565b90919294938480612ac7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c60019603018652895161484b565b9697019493919091019101612a2b565b80612ae9612be0928486999899614b9f565b35600052600680885260ff8060046040600020015416908115612be8575b50612b13838688614b9f565b3560005260048952612b2860406000206151f8565b612b32848a614cc6565b52612b3d8389614cc6565b50612b52612b4c848789614b9f565b356153c2565b91612b5e848789614b9f565b3560005260048a52612bab816040600020015491612b7d86898b614b9f565b3560005260048c5260406000200154612b9786898b614b9f565b3560005260058c52604060002054906149f9565b9060405193612bb98561438d565b84528a840152604083015215156060820152612bd58287614cc6565b52610c638186614cc6565b9493946129f8565b9050612bf5838688614b9f565b3560005281895260046040600020015460081c1689612b07565b94809695612c1b6151d3565b828288010152019594956129ec565b94809695612c36615186565b828289010152019594956129bc565b346102c65760606003193601126102c657600435602435612c68816044356149f9565b90612c7282614af1565b92612c80604051948561444c565b828452601f19612c8f84614af1565b0160005b818110612ce957505060005b838110612cbc57604051602080825281906105d5908201886146fb565b612ce490826000526007602052610c4e6104f46040600020612cde84886149ec565b906148be565b612c9f565b602090612cf4615110565b82828901015201612c93565b346102c65760006003193601126102c65760206001600160a01b0360005416604051908152f35b346102c65760206003193601126102c6576001600160a01b03612d486142fe565b612d50614909565b16600052600a6020526040600020600160ff19825416179055600080f35b346102c65760206003193601126102c657612d876142fe565b600254906001600160a01b033381841603612dca577fffffffffffffffffffffffff00000000000000000000000000000000000000009116911617600255600080f35b608460405162461bcd60e51b815260206004820152602660248201527f6f6e6c794c61756e63687061643a2043616c6c6572204973204e6f74204c617560448201527f6e636870616400000000000000000000000000000000000000000000000000006064820152fd5b346102c657612e4236614568565b90612e4b614909565b6000526005602052600260406000200155600080f35b346102c6576101806003193601126102c65760043567ffffffffffffffff81116102c657612e9390369060040161448b565b6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102c65760405190610100820182811067ffffffffffffffff8211176111fb57604052612ee5614314565b82526044356001600160a01b03811681036102c65760208301526064356040830152608435606083015260a43580151581036102c657608083015260c43580151581036102c65760a083015260e43580151581036102c65760c08301526101043580151581036102c65760e08301526101243567ffffffffffffffff81116102c657612f75903690600401614340565b90926101443567ffffffffffffffff81116102c657612f98903690600401614340565b949067ffffffffffffffff61016435116102c657612fbc3661016435600401614340565b96909533600052600a60205260ff604060002054168015613683575b801561366f575b156102c6576003546001600160a01b03865116600052600b602052806040600020556000526004602052604060002090805180519067ffffffffffffffff82116111fb5761303782613031865461457e565b86614aac565b602090601f83116001146135f957928260099361012093613203999897966000926135ee575b50506000198260011b9260031b1c19161784555b6020810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e081015160078501556101008101516008850155015191015560035460005260066020526131e2600460406000206001600160a01b038851167fffffffffffffffffffffffff0000000000000000000000000000000000000000908183541617825560018201906001600160a01b0360208b0151169082541617905560408801516002820155606088015160038201550161315c60808801511515829060ff60ff1983541691151516179055565b60a087015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff001617815560c0870151815460e08901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff90911691151560101b62ff0000169190911790151560181b63ff00000016179055565b6131fa604051946131f286614371565b873691614b09565b84523691614b09565b602082015261321185614af1565b61321e604051918261444c565b85815260208101368760051b8701116102c65785905b8760051b870182106135de575050604082015260035460005260096020526040600020815180519067ffffffffffffffff82116111fb576020906132788385614b57565b0182600052602060002060005b8381106135ca5750505050602082015180519067ffffffffffffffff82116111fb57602060018401916132b88484614b57565b0190600052602060002060005b8381106135b657505050506002604091019101519081519167ffffffffffffffff83116111fb576801000000000000000083116111fb576020908254848455808510613599575b500190600052602060002060005b838110613585575050505060600151801590811561357a575b811561356f575b8115613564575b8115613559575b811561354e575b50156134e457820361347a576003549060005b8260005260096020526002604060002001548110156133a15780613397606461338f61339c948887614b9f565b351115614baf565b614a31565b613362565b8280600052600460205260036040600020015460046040600020015411613410576133f5907fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614a31565b806003556000198101908111611c7357602090604051908152f35b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e76616c69642053746172742060448201527f416e6420456e64205072696365730000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602c60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d65726b6c6560448201527f20526f6f74204c656e67746800000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642053616c65205460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152fd5b60059150148461334f565b600481149150613348565b600381149150613341565b60028114915061333a565b600181149150613333565b60019060208451940193818401550161331a565b6135b0908460005285846000209182019101614a95565b8861330c565b6001906020845194019381840155016132c5565b600190602084519401938184015501613285565b8135815260209182019101613234565b015190508e8061305d565b908460005260206000209160005b601f198516811061365757508361012093613203999897969360019383601f19600999161061363e575b505050811b018455613071565b015160001960f88460031b161c191690558e8080613631565b91926020600181928685015181550194019201613607565b506001600160a01b03600054163314612fdf565b506001600160a01b03600254163314612fd8565b346102c6576136a536614568565b906136ae614909565b6000526004602052600660406000200155600080f35b346102c65760006003193601126102c65760206001600160a01b0360025416604051908152f35b346102c65760206003193601126102c657602061370e6137096142fe565b615142565b604051908152f35b346102c65760006003193601126102c65761372f614909565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102c65760c06003193601126102c65767ffffffffffffffff6004358181116102c6576137b9903690600401614340565b916137c2614314565b906044358181116102c6576137db903690600401614340565b6137e692919261432a565b6084358381116102c6576137fe903690600401614340565b9360a4359081116102c657613817903690600401614340565b949093808a14806139e0575b806139d7575b1561396d576138378a614af1565b996138456040519b8c61444c565b808b52601f1961385482614af1565b0160005b8181106139555750508a60005b8281106138ec575060405160209182820192808352815180945260408301938160408260051b8601019301916000955b8287106138a25785850386f35b9091929382806138dc837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516147a4565b9601920196019592919092613895565b610c638161394e9361393e8f8f908f908f908f908f908f908f8f8f8c926139278461392e946139208280966139369a614b9f565b359c614b9f565b35956150ad565b9690956150ad565b969095614dd7565b6139488383614cc6565b52614cc6565b8b90613865565b808d60208093613963614d43565b9201015201613858565b608460405162461bcd60e51b815260206004820152602a60248201527f44757463684d61726b6574706c6163653a204172726179204c656e677468732060448201527f4d757374204d61746368000000000000000000000000000000000000000000006064820152fd5b50858214613829565b50818114613823565b346102c6576060806003193601126102c65760043567ffffffffffffffff81116102c657613a1b903690600401614340565b9050613a2b6024356044356149f9565b91601f19613a3b61093085614af1565b019060005b828110613b55575050506000905b80821115613ad3576040805160208082528551818301819052600093600582901b8401810192808901929185015b828710613a895785850386f35b909192938280613ac3837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516146fb565b9601920196019592919092613a7c565b816000526020916007835260406000208054613aee81614af1565b91613afc604051938461444c565b8183526000908152858120958084015b838310613b385750505050613b32929350613b278286614cc6565b52610c638185614cc6565b90613a4e565b600582600192613b478b614c6f565b815201980192019196613b0c565b8082602080938801015201613a40565b346102c657613b73366146c7565b9091613b7d614909565b60005b828110613b8957005b80613b9d606461338f613bcd948789614b9f565b613ba8818587614b9f565b35836000526009602052613bc6611538836002604060002001614a06565b9055614a31565b613b80565b346102c65760406003193601126102c657613beb614314565b613bf3614909565b60043560005260066020526001600160a01b03604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102c657613c47366146c7565b9091613c51614909565b6000526020916009835260406000209067ffffffffffffffff83116111fb57613c7a8383614b57565b90600052826000209260005b838110613c8f57005b82358582015591810191600101613c86565b346102c65760406003193601126102c657610841613cbd6146b8565b613cc5614909565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff00835492151560081b169116179055565b346102c65760606003193601126102c657613d26614314565b60443567ffffffffffffffff81116102c657604091613d4c613d55923690600401614340565b916004356154cb565b825191151582526020820152f35b346102c65760206003193601126102c6576004356000526004602052613dd76040600020613d90816145d1565b9060018101549060028101549060038101546004820154600583015460068401549160078501549360096008870154960154966040519a8b9a610140808d528c0190614678565b9860208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301520390f35b346102c65760206003193601126102c6576001600160a01b03613e2c6142fe565b16600052600a602052602060ff604060002054166040519015158152f35b346102c65760406003193601126102c657602061370e613e68614314565b60043561526f565b346102c65760206003193601126102c657602061370e6004356153c2565b346102c65760406003193601126102c657613ea7614314565b613eaf614909565b60043560005260066020526001600160a01b03600160406000200191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102c65760606003193601126102c657613f11614314565b600435600052600c6020526001600160a01b036040600020911660005260205260406000206044356000526020526020604060002054604051908152f35b346102c657613f5d36614568565b90613f66614909565b6000526004602052600160406000200155600080f35b346102c657613f8a36614568565b90613f93614909565b6000526004602052600760406000200155600080f35b346102c65760006003193601126102c657613fc2614909565b600080808047818115613fda575b3390f115610d9c57005b506108fc613fd0565b346102c65760406003193601126102c65767ffffffffffffffff6024358181116102c65761401590369060040161448b565b61401d614909565b600435600052602060048152604060002092825180519182116111fb5761404e82614048875461457e565b87614aac565b8290601f83116001146140e35791806101209492600996946000926140d8575b50506000198260011b9260031b1c19161785555b810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501550151910155005b01519050878061406e565b90601f1983169186600052846000209260005b818110614139575092600192859260099896610120989610614120575b505050811b018555614082565b015160001960f88460031b161c19169055878080614113565b9293866001819287860151815501950193016140f6565b346102c65760606003193601126102c6576141696142fe565b60443567ffffffffffffffff81116102c6576020916141df6141926107c9933690600401614340565b9190926040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008782019260601b168252601481526141d081614430565b51902092602435923691614b09565b615584565b346102c65760406003193601126102c6576024803567ffffffffffffffff8082116102c657366023830112156102c65781600401359081116102c657368382840101116102c657614233614909565b6004356000526020926004845260406000209261425483613031865461457e565b600094601f8411600114614295575093829394600093614288575b5050506000198260011b9260031b1c1916179055600080f35b010135905083808061426f565b91601f198416958560005283600020936000905b8882106142e45750508460019697106142c8575b50505050811b019055005b60001960f88660031b161c1992010135169055838080806142bd565b8060018497868395968901013581550196019201906142a9565b600435906001600160a01b03821682036102c657565b602435906001600160a01b03821682036102c657565b606435906001600160a01b03821682036102c657565b9181601f840112156102c65782359167ffffffffffffffff83116102c6576020808501948460051b0101116102c657565b6060810190811067ffffffffffffffff8211176111fb57604052565b6080810190811067ffffffffffffffff8211176111fb57604052565b60c0810190811067ffffffffffffffff8211176111fb57604052565b67ffffffffffffffff81116111fb57604052565b610100810190811067ffffffffffffffff8211176111fb57604052565b6101a0810190811067ffffffffffffffff8211176111fb57604052565b610140810190811067ffffffffffffffff8211176111fb57604052565b6040810190811067ffffffffffffffff8211176111fb57604052565b90601f601f19910116810190811067ffffffffffffffff8211176111fb57604052565b67ffffffffffffffff81116111fb57601f01601f191660200190565b9190916101409081818503126102c6576040519182019367ffffffffffffffff94838110868211176111fb57604052829482359081116102c657820181601f820112156102c65780356144dd8161446f565b916144eb604051938461444c565b8183526020938483830101116102c657816000928580930183860137830101528352808201359083015260408101356040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080910135910152565b60031960409101126102c6576004359060243590565b90600182811c921680156145c7575b602083101461459857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161458d565b90604051918260008254926145e58461457e565b9081845260019485811690816000146146545750600114614611575b505061460f9250038361444c565b565b9093915060005260209081600020936000915b81831061463c57505061460f93508201013880614601565b85548884018501529485019487945091830191614624565b905061460f95506020935060ff1991501682840152151560051b8201013880614601565b919082519283825260005b8481106146a4575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201614683565b6024359081151582036102c657565b9060406003198301126102c657600435916024359067ffffffffffffffff82116102c6576146f791600401614340565b9091565b90815180825260208080930193019160005b82811061471b575050505090565b835180516001600160a01b031686528083015186840152604080820151908701526060808201519087015260808082015115159087015260a09081015115159086015260c0909401939281019260010161470d565b90815180825260208080930193019160005b828110614790575050505090565b835185529381019392810192600101614782565b906147cd6147bb83516101a0808552840190614770565b60208401518382036020850152614770565b9160408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100808201519083015261012080820151151590830152610140808201511515908301526101608082015115159083015261018080910151151591015290565b9061485f8251610140808452830190614678565b916020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151908301526101208091015191015290565b80548210156148da576000526005602060002091020190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b0360005416330361491d57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9060405161496e816143d9565b60e060ff600483956001600160a01b0380825416865260018201541660208601526002810154604086015260038101546060860152015481811615156080850152818160081c16151560a0850152818160101c16151560c085015260181c161515910152565b908160209103126102c6575180151581036102c65790565b91908201809211611c7357565b91908203918211611c7357565b80548210156148da5760005260206000200190600090565b81810292918115918404141715611c7357565b6000198114611c735760010190565b600260015414614a51576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b818110614aa0575050565b60008155600101614a95565b9190601f8111614abb57505050565b61460f926000526020600020906020601f840160051c83019310614ae7575b601f0160051c0190614a95565b9091508190614ada565b67ffffffffffffffff81116111fb5760051b60200190565b9291614b1482614af1565b91614b22604051938461444c565b829481845260208094019160051b81019283116102c657905b828210614b485750505050565b81358152908301908301614b3b565b6801000000000000000082116111fb57805491808255828110614b7957505050565b60009182526020822092830192015b828110614b9457505050565b818155600101614b88565b91908110156148da5760051b0190565b15614bb657565b608460405162461bcd60e51b815260206004820152602960248201527f44757463684d61726b6574706c6163653a20496e76616c696420446973636f7560448201527f6e7420416d6f756e7400000000000000000000000000000000000000000000006064820152fd5b9060405191828154918282526020928383019160005283600020936000905b828210614c555750505061460f9250038361444c565b855484526001958601958895509381019390910190614c3f565b90604051614c7c816143a9565b60a060ff600483956001600160a01b03815416855260018101546020860152600281015460408601526003810154606086015201548181161515608085015260081c161515910152565b80518210156148da5760209160051b010190565b8115614ce4570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3d15614d3e573d90614d248261446f565b91614d32604051938461444c565b82523d6000602084013e565b606090565b60405190614d50826143f6565b8160608152606060208201526101806000918260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201520152565b90614db082614af1565b614dbd604051918261444c565b828152601f19614dcd8294614af1565b0190602036910137565b9195909496614de4614d43565b50826000526009602052614dfc604060002054614da6565b96614e06846153c2565b60009480600052600660205260ff60046040600020015460081c1697881561509a575b60ff60046040600020015460181c1697614e438b8461526f565b9583600052600860205260406000206001600160a01b038d16600052602052600260406000200154918c6001600160a01b038216615003575b505060005b846000526009602052604060002054811015614ed857614ed3908e8e600c6020526001600160a01b0360406000209116600052602052604060002082600052602052610ac98260406000205492614cc6565b614e81565b50614f6f9d9c9192939496989a9c9b9597999b838910614ff9575b614f0990614f01858b6149f9565b9588886154cb565b98819b91614fc2575b50505060008481526008602090815260408083206001600160a01b0398909816835296815286822060048082015497845282528783206006015460059092529690912054614f7491614f6491906149f9565b956040519e8f6143f6565b614c20565b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e0870152610100860152151561012085015215156101408401521515610160830152151561018082015290565b614ff0939c50866000526009602052614fe28a6001604060002001614a06565b90549060031b1c90886155e1565b98388080614f12565b9297508792614ef3565b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015290821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115610d9c5760009161507b575b50615073575b8c614e7c565b9b503861506d565b615094915060203d6020116121e6576121d8818361444c565b38615067565b60406000206004015460ff169850614e29565b91908110156148da5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102c657019081359167ffffffffffffffff83116102c6576020018260051b360381136102c6579190565b6040519061511d826143a9565b8160a06000918281528260208201528260408201528260608201528260808201520152565b6001600160a01b0316600052600b6020526040600020548061518357507f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b90565b6040519061519382614413565b81606081526101206000918260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152565b604051906151e08261438d565b60006060838281528260208201528260408201520152565b9060405161520581614413565b61012060098294615215816145d1565b845260018101546020850152600281015460408501526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e085015260088101546101008501520154910152565b919061527a836153c2565b9060009380855260059460209386855260029060409180838520015495600888526001600160a01b038486209116855287526152b7838520614c20565b98858552600988526152cc8285872001614c20565b9285971515955b8b5189101561537757896153489189898f89898f896153088f956104f4906104ed8f9560078e8d600052528960002092614cc6565b958061536a575b1561534e575061054e859361054761055896946064948c61057f9d6105709c9b01519a6000525285600020015491606087015190614cc6565b976152d3565b9250505061057093506105589161057f96840151930151614a1e565b506080860151151561530f565b9a50505050505050505050565b60405190615391826143d9565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b6000818152600490602090828252604091600783832001544211156154bf5760058152600283832001546154b3578381526003838320015461540a60078585200154426149f9565b908684528583526154216008868620015483614cda565b1c9086845285835260088585200154908115615487579161545f61544c615468938996950683614a1e565b8987528585526008888820015490614cda565b60011c906149f9565b9583525282828220015484111561547f5750505090565b200154919050565b6024856012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50206002015492915050565b50206003015492915050565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b1682526014815261550f81614430565b5190209360005b876000526009825282600020548110156155725761554d8661553b8386600020614a06565b90549060031b1c6141df368989614b09565b615565579061555d600992614a31565b909150615516565b9650505050505060019190565b505050505050905060009062010f2c90565b929091906000915b84518310156155d95761559f8386614cc6565b51906000828210156155c757506000526020526155c160406000205b92614a31565b9161558c565b6040916155c1938252602052206155bb565b915092501490565b9261518394936141df92604051907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602083019360601b16835260348201526034815261562d81614371565b519020933691614b09565b92909160009384818152602060088152604090818320906001600160a01b0380971691828552815261566b838520614c20565b93975b84518910156157a0578560005260078083526156946104f4866000206104ed8d8a614cc6565b89815116850361575d578b89036156b357505050505050505050505090565b978a9b8888839c9d615720958a6156df8a9b9c9d9e9f6105588b6157269c9d8301948551930151614a1e565b96806156eb888a6149ec565b11615733575b506157189260019492615708896104ed94516149f9565b966000528c528d60002092614cc6565b5001556149ec565b99614a31565b979695949392919061566e565b6104ed919750926001949261570861574e89615718976149f9565b9993505092945092508f6156f1565b60648487519062461bcd60e51b82526004820152601f60248201527f44757463684d61726b6574706c6163653a20496e76616c6964205374617465006044820152fd5b5050505050505050509056fea2646970667358221220733fba88b564d10106c5299f68f1c6c07773e42ec5e99b087422d5f5ebf1230d64736f6c63430008110033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b60003560e01c8062432a1e146141e4578063040415731461415057806307939f0b14613fe357806309beb0c014613fa95780631020b28b14613f7c5780631af4853c14613f4f578063228dd2b514613ef8578063242a44e414613e8e57806326abb6a114613e7057806328804ebc14613e4a57806333b005d014613e0b5780633529280b14613d635780633756b14614613d0d57806344a2464e14613ca157806352163cd214613c39578063581ed44514613bd25780635c4e364214613b65578063611118bf146139e957806368f9b33c14613787578063715018a61461371657806374509071146136eb578063765b8b51146136c4578063784edfa7146136975780637933479614612e6157806384f7ec6914612e345780638833a35414612d6e5780638d06418e14612d275780638da5cb5b14612d0057806394d2ea7c14612c455780639808ac521461295b5780639b273df1146128d75780639cbf7228146127ec5780639debbd4114612724578063a3c3b3041461235e578063a61f3a871461122a578063a6db141114611190578063a70bf2f514610fa0578063adfbc6a614610f0f578063b1e2da1814610ec6578063b7e1aef514610e8c578063c618a09314610e6e578063c67ff91714610e2a578063c69d7a1514610da8578063cd27a03614610cb1578063d8fa3d6814610c84578063d902c38214610b13578063dc8f18d3146108f8578063de0ed505146108cb578063e358c4ad14610843578063e3e9f9a6146107d3578063e85727051461077c578063e96450031461066c578063ead82d531461061d578063eceda49a14610415578063f0510f51146103e8578063f2fde38b146102f8578063f94f0fe3146102cb5763fd2c4a0a1461029957600080fd5b346102c6576102a736614568565b906102b0614909565b6000526004602052600460406000200155600080f35b600080fd5b346102c6576102d936614568565b906102e2614909565b6000526004602052600360406000200155600080f35b346102c65760206003193601126102c6576103116142fe565b610319614909565b6001600160a01b0380911690811561037e57600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b346102c6576103f636614568565b906103ff614909565b6000526004602052600560406000200155600080f35b346102c65760406003193601126102c65761042e614314565b6004356000526005602052600260406000200154156105d9576104526004356153c2565b6000916000809360043560005260056020526002604060002001549260086020526001600160a01b03604060002091166000526020526104956040600020614c20565b80519460043560005260096020526104b36002604060002001614c20565b916000975b81518910156105b55761057f6105859160406105766104fa6104f48e60043560005260076020526104ed85600020918a614cc6565b51906148be565b50614c6f565b998a898d15158e6105a8575b1561058b5761055e610565916105588488606461054e6020610570990151956004356000526005602052610547600285600020015491606087015190614cc6565b5190614a1e565b0491015190614a1e565b906149f9565b809c6149ec565b9a60208d01516149f9565b906149ec565b980151906149ec565b98614a31565b976104b8565b5061056561055e826105588c886020610570970151930151614a1e565b5060808201511515610506565b604080518981526020810192909252810186905260608101859052608090f35b0390f35b606460405162461bcd60e51b815260206004820152601260248201527f53616c65204e6f7420436f6e636c7564656400000000000000000000000000006044820152fd5b346102c65760206003193601126102c657600435600090815260056020908152604091829020805460018201546002830154600390930154855192835293820152928301526060820152608090f35b346102c65760406003193601126102c6576004356001600160a01b0381168091036102c6576024359061069d614909565b81151580610772575b1561072e57600080809381935af16106bc614d13565b50156106c457005b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b50478211156106a6565b346102c65760806003193601126102c6576107956142fe565b60643567ffffffffffffffff81116102c6576020916107bb6107c9923690600401614340565b9160443590602435906155e1565b6040519015158152f35b346102c65760406003193601126102c6576108416107ef6146b8565b6107f7614909565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff63ff000000835492151560181b169116179055565b005b346102c65760c06003193601126102c65761085c614314565b61086461432a565b67ffffffffffffffff906084358281116102c657610886903690600401614340565b60a4949194359384116102c6576105d5946108a86108b7953690600401614340565b94909360443590600435614dd7565b6040519182916020835260208301906147a4565b346102c6576108d936614568565b906108e2614909565b6000526006602052600260406000200155600080f35b346102c6576020806003193601126102c657600435908160005260059081815260019081604060002001549261094661093085614af1565b9461093e604051968761444c565b808652614af1565b90601f198386019201368337856000528083526109698460406000200154614da6565b958060005260098452600261098381604060002001614c20565b9061098d836153c2565b93610996615110565b506000885b610a1c575b505050505050604051936040850190604086525180915260608501919060005b818110610a00575050508381038285015281808651928381520195019160005b8281106109ed5785870386f35b83518752958101959281019284016109e0565b82516001600160a01b03168452928401929184019185016109c0565b9087859493928a9c9a9660009a999a528282528b8b8860406000200154831015610b0457826001600160a01b038b610ac993876007610acf9952848d8d8d8d610a6c6104f48660406000206148be565b60808101519098899115610ade5750610ab99493610547610558946064948a610abf9b610aad9601519860005252604060002001549160608c015190614cc6565b04604088015190614a1e565b92614cc6565b525b511692614cc6565b52614a31565b9091929394989a97969761099b565b9350610ab994506105589250610afe969150015191604088015190614a1e565b52610ac1565b505050509997999695966109a0565b346102c6576020806003193601126102c65760043567ffffffffffffffff81116102c657610b45903690600401614340565b9190610b5083614af1565b92610b5e604051948561444c565b808452601f19610b6d82614af1565b018360005b828110610c6e5750505060005b818110610c2a57604080518581528651818701819052878701928201908760005b828110610bad5784840385f35b9091928261010082610c1b6001948a5160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b01960191019492919094610ba0565b80610c39610c69928486614b9f565b3560005260068552610c4e6040600020614961565b610c588288614cc6565b52610c638187614cc6565b50614a31565b610b7f565b610c76615384565b828289010152018490610b72565b346102c657610c9236614568565b90610c9b614909565b6000526004602052600860406000200155600080f35b346102c65760606003193601126102c657610cca6142fe565b610cd2614314565b9060443567ffffffffffffffff81116102c657610cf483913690600401614340565b610cff929192614909565b6001600160a01b0360009416935b818110610d1657005b610d21818386614b9f565b3590853b156102c6576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03851660248201526044810192909252600082606481838a5af1918215610d9c57600192610d8d575b5001610d0d565b610d96906143c5565b86610d86565b6040513d6000823e3d90fd5b346102c657610db636614568565b906000526007602052604060002080548210156102c65760c091610dd9916148be565b5060ff6001600160a01b0382541691600181015490600281015460046003830154920154926040519586526020860152604085015260608401528181161515608084015260081c16151560a0820152f35b346102c65760206003193601126102c6576001600160a01b03610e4b6142fe565b610e53614909565b16600052600a602052604060002060ff198154169055600080f35b346102c65760006003193601126102c6576020600354604051908152f35b346102c65760206003193601126102c6576001600160a01b03610ead6142fe565b16600052600b6020526020604060002054604051908152f35b346102c65760406003193601126102c657610841610ee26146b8565b610eea614909565b600435600052600660205260046040600020019060ff60ff1983541691151516179055565b346102c65760206003193601126102c6576004356000526006602052610100604060002060ff6001600160a01b03918281541692600182015416906002810154600460038301549201549260405195865260208601526040850152606084015281811615156080840152818160081c16151560a0840152818160101c16151560c084015260181c16151560e0820152f35b346102c6576020806003193601126102c65760043590610fbe615186565b50610fc7615384565b50610fd06151d3565b5060405191610fde83614371565b606083818095528184820152604001528060005260048252604060002090600683526040600020926005815260406000209060098152604060002092611023906153c2565b9361102d906151f8565b9461103790614961565b92604051966110458861438d565b8354885260018401549383890194855260028101549060408a0191825260030154828a019081526040519161107983614371565b61108285614c20565b835261109060018601614c20565b948684019586526002016110a390614c20565b96604084019788526040519b8c9b8c6101e08091528d016110c39161484b565b99888d016111299160e080916001600160a01b038082511685526020820151166020850152604081015160408501526060810151606085015260808101511515608085015260a0810151151560a085015260c0810151151560c085015201511515910152565b516101208c0152516101408b0152516101608a0152516101808901528786036101a08901525190808652850161115e91614770565b9051918482039085015261117191614770565b905191808203906040015261118591614770565b906101c08301520390f35b346102c65761119e366146c7565b90916111a8614909565b60005260209160098352600192836040600020019167ffffffffffffffff84116111fb576111d68484614b57565b916000528060002060005b8481106111ea57005b8335828201559282019285016111e1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60c06003193601126102c65761123e61432a565b67ffffffffffffffff6084358181116102c65761125f903690600401614340565b92909160a4359081116102c65761127a903690600401614340565b919093611285614a40565b602435933332036122ce5760043560005260066020526112a86040600020614961565b956004356000526004602052600760406000200154421061226457608087015115801590612257575b156121ed5733946004356000526005602052600160406000200154946001600160a01b03811661214d575b506001600160a01b038616156120e3576004356000526005602052611326876040600020546149ec565b6004356000526004602052600660406000200154106120be575b600435600052600560205261135a876040600020546149ec565b916004356000526004602052600660406000200154831161207a5762010f2c9460009460a08b0151611e77575b5050505085151580611e5a575b15611df0576113a46004356153c2565b966113af8789614a1e565b9760009560e0830151611dda575b6113c787346149ec565b8a8110611d70578a80821180611d67575b611cd1575b505060043560005260076020526040600020604051906113fc826143a9565b3382528b60208301528a60408301528760608301528615156080830152600060a08301528054680100000000000000008110156111fb57611442916001820181556148be565b919091611ca25760a060046114f5936001600160a01b038451167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815560208401516001820155604084015160028201556060840151600382015501916114c060808201511515849060ff60ff1983541691151516179055565b015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff0016179055565b600435600052600860205260406000203360005260205260406000208054680100000000000000008110156111fb57611538818493600161155194018155614a06565b819391549060031b600019811b9283911b169119161790565b9055600435600052600860205260406000203360005260205261157c896002604060002001546149ec565b6004356000526008602052604060002033600052602052600260406000200155600181018111611c735760019060043560005260056020520160016040600020015582604060002055604060002054600460205260066040600020015410611c2f576004356000526005602052604060002054600460205260066040600020015414611be4575b5060608101518061170157506001600160a01b0390511696600435600052600460205260016040600020015497803b156102c6576040517fe0d92a7600000000000000000000000000000000000000000000000000000000815260048101999099523360248a0152604489018890526000908990606490829084905af1968715610d9c577ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba98610100986116f2575b505b6001600160a01b03604051976004358952166020880152604087015260608601526080850152151560a084015260c083015260e0820152a160018055005b6116fb906143c5565b896116b2565b600181036117a85750516001600160a01b031696873b156102c6576040517fecd3769d00000000000000000000000000000000000000000000000000000000815233600482015260248101889052976000908990818381604481015b03925af1968715610d9c577ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba9861010098611799575b506116b4565b6117a2906143c5565b89611793565b6002810361182557506001600160a01b0390511696600435600052600460205260016040600020015497803b156102c6576040517fe076109000000000000000000000000000000000000000000000000000000000815260048101999099523360248a01526044890188905260009089908183816064810161175d565b6003819993949596979892991460001461194b575090919293949596600090602081019060408101925b8481106118a857505050918161188f7ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba99979593610100999795516149ec565b60043560005260066020526002604060002001556116b4565b6001600160a01b03825116906001600160a01b038451166118ca8287516149ec565b833b156102c6576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152916000908390606490829084905af1918215610d9c576119379261193c5750614a31565b61184f565b611945906143c5565b8c610c63565b60048103611a3f575090919293949596600435600052600460205260026040600020015460005b8381106119ac57505050916101009593917ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba9795936116b4565b82516040517f891407c00000000000000000000000000000000000000000000000000000000081523360048201526024810184905290602090829060449082906000906001600160a01b03165af18015610d9c57611a14575b50611a0f90614a31565b611972565b602090813d8311611a38575b611a2a818361444c565b810103126102c6578a611a05565b503d611a20565b600503611b7a5760043560005260046020526009604060002001549760408101516000905b838210611aab5750509061188f7ffeb0d4a2c02e9a23ffa11244895e815e8f84b8af3e03468cabad6df8a91e3cba996105708360406101009c9b9a99989796015192614a1e565b8a9060005b828110611ad15750611acb91611ac5916149ec565b91614a31565b90611a64565b91506001600160a01b03845116916001600160a01b03602086015116611af782846149ec565b843b156102c6576040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039290921660048301523360248301526044820152926000908490606490829084905af1908115610d9c578d93611b6692611b6b5750614a31565b611ab0565b611b74906143c5565b8e610c63565b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e636f72726563742053616c6560448201527f20436f6e66696775726174696f6e0000000000000000000000000000000000006064820152fd5b6005602090815260406000818120600201939093556006909152902060040180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905588611603565b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a204f766572666c6f770000000000006044820152fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b611cda916149f9565b600080808084335af1611ceb614d13565b5015611d235760207f3d2a04f53164bedf9a8a46353305d6b2d2261410406df3b41f99ce6489dc003c91604051908152a18a8a6113dd565b606460405162461bcd60e51b815260206004820152601f60248201527f44757463684d61726b6574706c6163653a20526566756e64204661696c6564006044820152fd5b503415156113d8565b608460405162461bcd60e51b815260206004820152602b60248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204554482060448201527f416d6f756e742053656e740000000000000000000000000000000000000000006064820152fd5b9550611dea338a83600435615638565b956113bd565b608460405162461bcd60e51b815260206004820152603360248201527f44757463684d61726b6574706c6163653a20496e636f7272656374204465736960448201527f72656420507572636861736520416d6f756e74000000000000000000000000006064820152fd5b506004356000526004602052600560406000200154861115611394565b90919450611e8a929550876004356154cb565b9092819484611e9a575b80611387565b611efd90600435600052600c60205260406000206001600160a01b038a16600052602052604060002084600052602052604060002054926004356000526009602052611eed856001604060002001614a06565b90549060031b1c6044358b6155e1565b15611fea57611f0f88604435926149ec565b11611f5a57600435600052600c60205260406000206001600160a01b0387166000526020526040600020906000526020526040600020611f508782546149ec565b9055878080611e94565b60a460405162461bcd60e51b815260206004820152605060248201527f44757463684d61726b6574706c6163653a20557365722048617320507572636860448201527f6173656420416c6c20416c6c6f636174696f6e20466f722050726f766964656460648201527f204d65726b6c65205072696f72697479000000000000000000000000000000006084820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b606460405162461bcd60e51b815260206004820152601a60248201527f44757463684d61726b6574706c6163653a20536f6c64204f75740000000000006044820152fd5b95506120dd6006604060002001546005602052604060002054906149f9565b95611340565b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642052656369706960448201527f656e7400000000000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115610d9c576000916121be575b50156112fc579550886112fc565b6121e0915060203d6020116121e6575b6121d8818361444c565b8101906149d4565b8a6121b0565b503d6121ce565b608460405162461bcd60e51b815260206004820152602160248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420416374697660448201527f65000000000000000000000000000000000000000000000000000000000000006064820152fd5b5060a087015115156112d1565b608460405162461bcd60e51b815260206004820152602260248201527f44757463684d61726b6574706c6163653a2053616c65204e6f7420537461727460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b60a460405162461bcd60e51b815260206004820152604560248201527f44757463684d61726b6574706c6163653a20454f41204f6e6c792c205573652060448201527f6064656c65676174652e636173686020466f722057616c6c65742044656c656760648201527f6174696f6e0000000000000000000000000000000000000000000000000000006084820152fd5b346102c6576020806003193601126102c65760043561237b614a40565b33600052600a825260ff604060002054168015612710575b80156126fc575b156102c657600090600092816000526005918282526002938460406000200154156126925781600052600983526123d685604060002001614c20565b94826000528484526003604060002001545b836000528585526001604060002001548110156125b55760078086526124156104f48360406000206148be565b9060a082015115612431575b505061242c90614a31565b6123e8565b90988587918b8a8c888660808501511560001461253e5761248096925061055891509361247893610570958201988951946000525260408b81600020015491015190614a1e565b8094516149f9565b9981612512575b50509061242c915b84156124df575b85600052865260046124ac8260406000206148be565b50016101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff8254161790559089612421565b7f04c9193508100a8a67eca92ca0f12195ea0503198d725f2323a9b7d01f508ac160408051888152848a820152a1612496565b61242c9392955060008080936001600160a01b03829451165af1612534614d13565b509390918a612487565b936040606461054e612576999561054761055896612478996105709b88019e8f519a6000525285600020015491606087015190614cc6565b9981612589575b50509061242c9161248f565b61242c9392955060008080936001600160a01b03829451165af16125ab614d13565b509390918a61257d565b505050600080808088730bc56e3c1397e4570069e89c07936a5c6020e3be5af16125dd614d13565b5015612602576000525260016040600020015460036040600020015560018055600080f35b60a4826040519062461bcd60e51b82526004820152605460248201527f44757463684d61726b6574706c6163653a204d756c746973696720526566756e60448201527f64204661696c65642c20557365204661696c736166652057697468647261772060648201527f416e64204d616e75616c6c792050726f636573730000000000000000000000006084820152fd5b6084836040519062461bcd60e51b82526004820152603160248201527f44757463684d61726b6574706c6163653a2046696e616c20436c656172696e6760448201527f205072696365204e6f74205365656465640000000000000000000000000000006064820152fd5b506001600160a01b0360005416331461239a565b506001600160a01b03600254163314612393565b346102c65760406003193601126102c65761273d614314565b60043560005260086020526001600160a01b0360406000209116600052602052610160604060002060ff600282015491600381015490600481015460058201546006830154906007840154926009600886015495015495604051988952602089015260408801526060870152608086015260a085015260c0840152818116151560e0840152818160081c161515610100840152818160101c16151561012084015260181c161515610140820152f35b346102c65760606003193601126102c65767ffffffffffffffff6004356024358281116102c657612821903690600401614340565b92906044358281116102c65761283b903690600401614340565b939094612846614909565b81600052602092600984526040600020908583116111fb576128688383614b57565b906000528360002060005b8381106128c5575050505060005260098152600193846040600020019284116111fb576128a08484614b57565b916000528060002060005b8481106128b457005b8335828201559282019285016128ab565b82358282015591850191600101612873565b346102c6576020806003193601126102c65760043560005260078152604060002090815461290481614af1565b92612912604051948561444c565b8184526000908152828120838086015b84841061293c57604051828152806105d58185018a6146fb565b60019160059161294b85614c6f565b8152019201920191908490612922565b346102c6576020806003193601126102c65760043567ffffffffffffffff81116102c65761298d903690600401614340565b61299981939293614af1565b926129a7604051948561444c565b818452601f1991826129b882614af1565b0160005b818110612c2a5750506129ce81614af1565b926129dc604051948561444c565b8184526129e882614af1565b0160005b818110612c0f57505060005b818110612ad7575050506040519160408301936040845280518095526060948585019083878260051b8801019301916000905b828210612a8c57505050508381038285015281808451928381520193019160005b828110612a595785850386f35b83518051865280830151868401526040808201519087015287015115158786015260809094019392810192600101612a4c565b90919294938480612ac7837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c60019603018652895161484b565b9697019493919091019101612a2b565b80612ae9612be0928486999899614b9f565b35600052600680885260ff8060046040600020015416908115612be8575b50612b13838688614b9f565b3560005260048952612b2860406000206151f8565b612b32848a614cc6565b52612b3d8389614cc6565b50612b52612b4c848789614b9f565b356153c2565b91612b5e848789614b9f565b3560005260048a52612bab816040600020015491612b7d86898b614b9f565b3560005260048c5260406000200154612b9786898b614b9f565b3560005260058c52604060002054906149f9565b9060405193612bb98561438d565b84528a840152604083015215156060820152612bd58287614cc6565b52610c638186614cc6565b9493946129f8565b9050612bf5838688614b9f565b3560005281895260046040600020015460081c1689612b07565b94809695612c1b6151d3565b828288010152019594956129ec565b94809695612c36615186565b828289010152019594956129bc565b346102c65760606003193601126102c657600435602435612c68816044356149f9565b90612c7282614af1565b92612c80604051948561444c565b828452601f19612c8f84614af1565b0160005b818110612ce957505060005b838110612cbc57604051602080825281906105d5908201886146fb565b612ce490826000526007602052610c4e6104f46040600020612cde84886149ec565b906148be565b612c9f565b602090612cf4615110565b82828901015201612c93565b346102c65760006003193601126102c65760206001600160a01b0360005416604051908152f35b346102c65760206003193601126102c6576001600160a01b03612d486142fe565b612d50614909565b16600052600a6020526040600020600160ff19825416179055600080f35b346102c65760206003193601126102c657612d876142fe565b600254906001600160a01b033381841603612dca577fffffffffffffffffffffffff00000000000000000000000000000000000000009116911617600255600080f35b608460405162461bcd60e51b815260206004820152602660248201527f6f6e6c794c61756e63687061643a2043616c6c6572204973204e6f74204c617560448201527f6e636870616400000000000000000000000000000000000000000000000000006064820152fd5b346102c657612e4236614568565b90612e4b614909565b6000526005602052600260406000200155600080f35b346102c6576101806003193601126102c65760043567ffffffffffffffff81116102c657612e9390369060040161448b565b6101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102c65760405190610100820182811067ffffffffffffffff8211176111fb57604052612ee5614314565b82526044356001600160a01b03811681036102c65760208301526064356040830152608435606083015260a43580151581036102c657608083015260c43580151581036102c65760a083015260e43580151581036102c65760c08301526101043580151581036102c65760e08301526101243567ffffffffffffffff81116102c657612f75903690600401614340565b90926101443567ffffffffffffffff81116102c657612f98903690600401614340565b949067ffffffffffffffff61016435116102c657612fbc3661016435600401614340565b96909533600052600a60205260ff604060002054168015613683575b801561366f575b156102c6576003546001600160a01b03865116600052600b602052806040600020556000526004602052604060002090805180519067ffffffffffffffff82116111fb5761303782613031865461457e565b86614aac565b602090601f83116001146135f957928260099361012093613203999897966000926135ee575b50506000198260011b9260031b1c19161784555b6020810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e081015160078501556101008101516008850155015191015560035460005260066020526131e2600460406000206001600160a01b038851167fffffffffffffffffffffffff0000000000000000000000000000000000000000908183541617825560018201906001600160a01b0360208b0151169082541617905560408801516002820155606088015160038201550161315c60808801511515829060ff60ff1983541691151516179055565b60a087015181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690151560081b61ff001617815560c0870151815460e08901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff90911691151560101b62ff0000169190911790151560181b63ff00000016179055565b6131fa604051946131f286614371565b873691614b09565b84523691614b09565b602082015261321185614af1565b61321e604051918261444c565b85815260208101368760051b8701116102c65785905b8760051b870182106135de575050604082015260035460005260096020526040600020815180519067ffffffffffffffff82116111fb576020906132788385614b57565b0182600052602060002060005b8381106135ca5750505050602082015180519067ffffffffffffffff82116111fb57602060018401916132b88484614b57565b0190600052602060002060005b8381106135b657505050506002604091019101519081519167ffffffffffffffff83116111fb576801000000000000000083116111fb576020908254848455808510613599575b500190600052602060002060005b838110613585575050505060600151801590811561357a575b811561356f575b8115613564575b8115613559575b811561354e575b50156134e457820361347a576003549060005b8260005260096020526002604060002001548110156133a15780613397606461338f61339c948887614b9f565b351115614baf565b614a31565b613362565b8280600052600460205260036040600020015460046040600020015411613410576133f5907fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614a31565b806003556000198101908111611c7357602090604051908152f35b608460405162461bcd60e51b815260206004820152602e60248201527f44757463684d61726b6574706c6163653a20496e76616c69642053746172742060448201527f416e6420456e64205072696365730000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602c60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d65726b6c6560448201527f20526f6f74204c656e67746800000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f44757463684d61726b6574706c6163653a20496e76616c69642053616c65205460448201527f79706500000000000000000000000000000000000000000000000000000000006064820152fd5b60059150148461334f565b600481149150613348565b600381149150613341565b60028114915061333a565b600181149150613333565b60019060208451940193818401550161331a565b6135b0908460005285846000209182019101614a95565b8861330c565b6001906020845194019381840155016132c5565b600190602084519401938184015501613285565b8135815260209182019101613234565b015190508e8061305d565b908460005260206000209160005b601f198516811061365757508361012093613203999897969360019383601f19600999161061363e575b505050811b018455613071565b015160001960f88460031b161c191690558e8080613631565b91926020600181928685015181550194019201613607565b506001600160a01b03600054163314612fdf565b506001600160a01b03600254163314612fd8565b346102c6576136a536614568565b906136ae614909565b6000526004602052600660406000200155600080f35b346102c65760006003193601126102c65760206001600160a01b0360025416604051908152f35b346102c65760206003193601126102c657602061370e6137096142fe565b615142565b604051908152f35b346102c65760006003193601126102c65761372f614909565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102c65760c06003193601126102c65767ffffffffffffffff6004358181116102c6576137b9903690600401614340565b916137c2614314565b906044358181116102c6576137db903690600401614340565b6137e692919261432a565b6084358381116102c6576137fe903690600401614340565b9360a4359081116102c657613817903690600401614340565b949093808a14806139e0575b806139d7575b1561396d576138378a614af1565b996138456040519b8c61444c565b808b52601f1961385482614af1565b0160005b8181106139555750508a60005b8281106138ec575060405160209182820192808352815180945260408301938160408260051b8601019301916000955b8287106138a25785850386f35b9091929382806138dc837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516147a4565b9601920196019592919092613895565b610c638161394e9361393e8f8f908f908f908f908f908f908f8f8f8c926139278461392e946139208280966139369a614b9f565b359c614b9f565b35956150ad565b9690956150ad565b969095614dd7565b6139488383614cc6565b52614cc6565b8b90613865565b808d60208093613963614d43565b9201015201613858565b608460405162461bcd60e51b815260206004820152602a60248201527f44757463684d61726b6574706c6163653a204172726179204c656e677468732060448201527f4d757374204d61746368000000000000000000000000000000000000000000006064820152fd5b50858214613829565b50818114613823565b346102c6576060806003193601126102c65760043567ffffffffffffffff81116102c657613a1b903690600401614340565b9050613a2b6024356044356149f9565b91601f19613a3b61093085614af1565b019060005b828110613b55575050506000905b80821115613ad3576040805160208082528551818301819052600093600582901b8401810192808901929185015b828710613a895785850386f35b909192938280613ac3837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a6001960301865288516146fb565b9601920196019592919092613a7c565b816000526020916007835260406000208054613aee81614af1565b91613afc604051938461444c565b8183526000908152858120958084015b838310613b385750505050613b32929350613b278286614cc6565b52610c638185614cc6565b90613a4e565b600582600192613b478b614c6f565b815201980192019196613b0c565b8082602080938801015201613a40565b346102c657613b73366146c7565b9091613b7d614909565b60005b828110613b8957005b80613b9d606461338f613bcd948789614b9f565b613ba8818587614b9f565b35836000526009602052613bc6611538836002604060002001614a06565b9055614a31565b613b80565b346102c65760406003193601126102c657613beb614314565b613bf3614909565b60043560005260066020526001600160a01b03604060002091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102c657613c47366146c7565b9091613c51614909565b6000526020916009835260406000209067ffffffffffffffff83116111fb57613c7a8383614b57565b90600052826000209260005b838110613c8f57005b82358582015591810191600101613c86565b346102c65760406003193601126102c657610841613cbd6146b8565b613cc5614909565b60043560005260066020526004604060002001907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff00835492151560081b169116179055565b346102c65760606003193601126102c657613d26614314565b60443567ffffffffffffffff81116102c657604091613d4c613d55923690600401614340565b916004356154cb565b825191151582526020820152f35b346102c65760206003193601126102c6576004356000526004602052613dd76040600020613d90816145d1565b9060018101549060028101549060038101546004820154600583015460068401549160078501549360096008870154960154966040519a8b9a610140808d528c0190614678565b9860208b015260408a01526060890152608088015260a087015260c086015260e08501526101008401526101208301520390f35b346102c65760206003193601126102c6576001600160a01b03613e2c6142fe565b16600052600a602052602060ff604060002054166040519015158152f35b346102c65760406003193601126102c657602061370e613e68614314565b60043561526f565b346102c65760206003193601126102c657602061370e6004356153c2565b346102c65760406003193601126102c657613ea7614314565b613eaf614909565b60043560005260066020526001600160a01b03600160406000200191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055600080f35b346102c65760606003193601126102c657613f11614314565b600435600052600c6020526001600160a01b036040600020911660005260205260406000206044356000526020526020604060002054604051908152f35b346102c657613f5d36614568565b90613f66614909565b6000526004602052600160406000200155600080f35b346102c657613f8a36614568565b90613f93614909565b6000526004602052600760406000200155600080f35b346102c65760006003193601126102c657613fc2614909565b600080808047818115613fda575b3390f115610d9c57005b506108fc613fd0565b346102c65760406003193601126102c65767ffffffffffffffff6024358181116102c65761401590369060040161448b565b61401d614909565b600435600052602060048152604060002092825180519182116111fb5761404e82614048875461457e565b87614aac565b8290601f83116001146140e35791806101209492600996946000926140d8575b50506000198260011b9260031b1c19161785555b810151600185015560408101516002850155606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501550151910155005b01519050878061406e565b90601f1983169186600052846000209260005b818110614139575092600192859260099896610120989610614120575b505050811b018555614082565b015160001960f88460031b161c19169055878080614113565b9293866001819287860151815501950193016140f6565b346102c65760606003193601126102c6576141696142fe565b60443567ffffffffffffffff81116102c6576020916141df6141926107c9933690600401614340565b9190926040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008782019260601b168252601481526141d081614430565b51902092602435923691614b09565b615584565b346102c65760406003193601126102c6576024803567ffffffffffffffff8082116102c657366023830112156102c65781600401359081116102c657368382840101116102c657614233614909565b6004356000526020926004845260406000209261425483613031865461457e565b600094601f8411600114614295575093829394600093614288575b5050506000198260011b9260031b1c1916179055600080f35b010135905083808061426f565b91601f198416958560005283600020936000905b8882106142e45750508460019697106142c8575b50505050811b019055005b60001960f88660031b161c1992010135169055838080806142bd565b8060018497868395968901013581550196019201906142a9565b600435906001600160a01b03821682036102c657565b602435906001600160a01b03821682036102c657565b606435906001600160a01b03821682036102c657565b9181601f840112156102c65782359167ffffffffffffffff83116102c6576020808501948460051b0101116102c657565b6060810190811067ffffffffffffffff8211176111fb57604052565b6080810190811067ffffffffffffffff8211176111fb57604052565b60c0810190811067ffffffffffffffff8211176111fb57604052565b67ffffffffffffffff81116111fb57604052565b610100810190811067ffffffffffffffff8211176111fb57604052565b6101a0810190811067ffffffffffffffff8211176111fb57604052565b610140810190811067ffffffffffffffff8211176111fb57604052565b6040810190811067ffffffffffffffff8211176111fb57604052565b90601f601f19910116810190811067ffffffffffffffff8211176111fb57604052565b67ffffffffffffffff81116111fb57601f01601f191660200190565b9190916101409081818503126102c6576040519182019367ffffffffffffffff94838110868211176111fb57604052829482359081116102c657820181601f820112156102c65780356144dd8161446f565b916144eb604051938461444c565b8183526020938483830101116102c657816000928580930183860137830101528352808201359083015260408101356040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e0830152610100808201359083015261012080910135910152565b60031960409101126102c6576004359060243590565b90600182811c921680156145c7575b602083101461459857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161458d565b90604051918260008254926145e58461457e565b9081845260019485811690816000146146545750600114614611575b505061460f9250038361444c565b565b9093915060005260209081600020936000915b81831061463c57505061460f93508201013880614601565b85548884018501529485019487945091830191614624565b905061460f95506020935060ff1991501682840152151560051b8201013880614601565b919082519283825260005b8481106146a4575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201614683565b6024359081151582036102c657565b9060406003198301126102c657600435916024359067ffffffffffffffff82116102c6576146f791600401614340565b9091565b90815180825260208080930193019160005b82811061471b575050505090565b835180516001600160a01b031686528083015186840152604080820151908701526060808201519087015260808082015115159087015260a09081015115159086015260c0909401939281019260010161470d565b90815180825260208080930193019160005b828110614790575050505090565b835185529381019392810192600101614782565b906147cd6147bb83516101a0808552840190614770565b60208401518382036020850152614770565b9160408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e0830152610100808201519083015261012080820151151590830152610140808201511515908301526101608082015115159083015261018080910151151591015290565b9061485f8251610140808452830190614678565b916020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010080820151908301526101208091015191015290565b80548210156148da576000526005602060002091020190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b0360005416330361491d57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b9060405161496e816143d9565b60e060ff600483956001600160a01b0380825416865260018201541660208601526002810154604086015260038101546060860152015481811615156080850152818160081c16151560a0850152818160101c16151560c085015260181c161515910152565b908160209103126102c6575180151581036102c65790565b91908201809211611c7357565b91908203918211611c7357565b80548210156148da5760005260206000200190600090565b81810292918115918404141715611c7357565b6000198114611c735760010190565b600260015414614a51576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b818110614aa0575050565b60008155600101614a95565b9190601f8111614abb57505050565b61460f926000526020600020906020601f840160051c83019310614ae7575b601f0160051c0190614a95565b9091508190614ada565b67ffffffffffffffff81116111fb5760051b60200190565b9291614b1482614af1565b91614b22604051938461444c565b829481845260208094019160051b81019283116102c657905b828210614b485750505050565b81358152908301908301614b3b565b6801000000000000000082116111fb57805491808255828110614b7957505050565b60009182526020822092830192015b828110614b9457505050565b818155600101614b88565b91908110156148da5760051b0190565b15614bb657565b608460405162461bcd60e51b815260206004820152602960248201527f44757463684d61726b6574706c6163653a20496e76616c696420446973636f7560448201527f6e7420416d6f756e7400000000000000000000000000000000000000000000006064820152fd5b9060405191828154918282526020928383019160005283600020936000905b828210614c555750505061460f9250038361444c565b855484526001958601958895509381019390910190614c3f565b90604051614c7c816143a9565b60a060ff600483956001600160a01b03815416855260018101546020860152600281015460408601526003810154606086015201548181161515608085015260081c161515910152565b80518210156148da5760209160051b010190565b8115614ce4570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b3d15614d3e573d90614d248261446f565b91614d32604051938461444c565b82523d6000602084013e565b606090565b60405190614d50826143f6565b8160608152606060208201526101806000918260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201520152565b90614db082614af1565b614dbd604051918261444c565b828152601f19614dcd8294614af1565b0190602036910137565b9195909496614de4614d43565b50826000526009602052614dfc604060002054614da6565b96614e06846153c2565b60009480600052600660205260ff60046040600020015460081c1697881561509a575b60ff60046040600020015460181c1697614e438b8461526f565b9583600052600860205260406000206001600160a01b038d16600052602052600260406000200154918c6001600160a01b038216615003575b505060005b846000526009602052604060002054811015614ed857614ed3908e8e600c6020526001600160a01b0360406000209116600052602052604060002082600052602052610ac98260406000205492614cc6565b614e81565b50614f6f9d9c9192939496989a9c9b9597999b838910614ff9575b614f0990614f01858b6149f9565b9588886154cb565b98819b91614fc2575b50505060008481526008602090815260408083206001600160a01b0398909816835296815286822060048082015497845282528783206006015460059092529690912054614f7491614f6491906149f9565b956040519e8f6143f6565b614c20565b8d5260208d015260408c015260608b015260808a015260a089015260c088015260e0870152610100860152151561012085015215156101408401521515610160830152151561018082015290565b614ff0939c50866000526009602052614fe28a6001604060002001614a06565b90549060031b1c90886155e1565b98388080614f12565b9297508792614ef3565b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015290821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115610d9c5760009161507b575b50615073575b8c614e7c565b9b503861506d565b615094915060203d6020116121e6576121d8818361444c565b38615067565b60406000206004015460ff169850614e29565b91908110156148da5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102c657019081359167ffffffffffffffff83116102c6576020018260051b360381136102c6579190565b6040519061511d826143a9565b8160a06000918281528260208201528260408201528260608201528260808201520152565b6001600160a01b0316600052600b6020526040600020548061518357507f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b90565b6040519061519382614413565b81606081526101206000918260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201520152565b604051906151e08261438d565b60006060838281528260208201528260408201520152565b9060405161520581614413565b61012060098294615215816145d1565b845260018101546020850152600281015460408501526003810154606085015260048101546080850152600581015460a0850152600681015460c0850152600781015460e085015260088101546101008501520154910152565b919061527a836153c2565b9060009380855260059460209386855260029060409180838520015495600888526001600160a01b038486209116855287526152b7838520614c20565b98858552600988526152cc8285872001614c20565b9285971515955b8b5189101561537757896153489189898f89898f896153088f956104f4906104ed8f9560078e8d600052528960002092614cc6565b958061536a575b1561534e575061054e859361054761055896946064948c61057f9d6105709c9b01519a6000525285600020015491606087015190614cc6565b976152d3565b9250505061057093506105589161057f96840151930151614a1e565b506080860151151561530f565b9a50505050505050505050565b60405190615391826143d9565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b6000818152600490602090828252604091600783832001544211156154bf5760058152600283832001546154b3578381526003838320015461540a60078585200154426149f9565b908684528583526154216008868620015483614cda565b1c9086845285835260088585200154908115615487579161545f61544c615468938996950683614a1e565b8987528585526008888820015490614cda565b60011c906149f9565b9583525282828220015484111561547f5750505090565b200154919050565b6024856012897f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50206002015492915050565b50206003015492915050565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b1682526014815261550f81614430565b5190209360005b876000526009825282600020548110156155725761554d8661553b8386600020614a06565b90549060031b1c6141df368989614b09565b615565579061555d600992614a31565b909150615516565b9650505050505060019190565b505050505050905060009062010f2c90565b929091906000915b84518310156155d95761559f8386614cc6565b51906000828210156155c757506000526020526155c160406000205b92614a31565b9161558c565b6040916155c1938252602052206155bb565b915092501490565b9261518394936141df92604051907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602083019360601b16835260348201526034815261562d81614371565b519020933691614b09565b92909160009384818152602060088152604090818320906001600160a01b0380971691828552815261566b838520614c20565b93975b84518910156157a0578560005260078083526156946104f4866000206104ed8d8a614cc6565b89815116850361575d578b89036156b357505050505050505050505090565b978a9b8888839c9d615720958a6156df8a9b9c9d9e9f6105588b6157269c9d8301948551930151614a1e565b96806156eb888a6149ec565b11615733575b506157189260019492615708896104ed94516149f9565b966000528c528d60002092614cc6565b5001556149ec565b99614a31565b979695949392919061566e565b6104ed919750926001949261570861574e89615718976149f9565b9993505092945092508f6156f1565b60648487519062461bcd60e51b82526004820152601f60248201527f44757463684d61726b6574706c6163653a20496e76616c6964205374617465006044820152fd5b5050505050505050509056fea2646970667358221220733fba88b564d10106c5299f68f1c6c07773e42ec5e99b087422d5f5ebf1230d64736f6c63430008110033
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.