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