Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 484 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
__Withdraw All E... | 19785126 | 204 days ago | IN | 0 ETH | 0.00022581 | ||||
__Start Fixed Pr... | 19696479 | 216 days ago | IN | 0 ETH | 0.00268799 | ||||
Purchase Fixed P... | 19298700 | 272 days ago | IN | 1 ETH | 0.00677379 | ||||
Purchase Fixed P... | 19298202 | 272 days ago | IN | 1 ETH | 0.00590153 | ||||
__Start Fixed Pr... | 19290035 | 273 days ago | IN | 0 ETH | 0.01244827 | ||||
__Withdraw All E... | 19241890 | 280 days ago | IN | 0 ETH | 0.00137708 | ||||
__Withdraw ETH F... | 19241795 | 280 days ago | IN | 0 ETH | 0.00208848 | ||||
Purchase Fixed P... | 19241791 | 280 days ago | IN | 3 ETH | 0.00647647 | ||||
Purchase Fixed P... | 19241726 | 280 days ago | IN | 0.9 ETH | 0.00432218 | ||||
Purchase Fixed P... | 19241716 | 280 days ago | IN | 0.1 ETH | 0.00458765 | ||||
Purchase Fixed P... | 19241629 | 280 days ago | IN | 0.1 ETH | 0.00489892 | ||||
Purchase Fixed P... | 19241593 | 280 days ago | IN | 0.1 ETH | 0.00361472 | ||||
Purchase Fixed P... | 19241585 | 280 days ago | IN | 0.1 ETH | 0.00377469 | ||||
Purchase Fixed P... | 19241552 | 280 days ago | IN | 0.1 ETH | 0.00424867 | ||||
Purchase Fixed P... | 19241539 | 280 days ago | IN | 0.1 ETH | 0.00492272 | ||||
Purchase Fixed P... | 19241534 | 280 days ago | IN | 0.1 ETH | 0.00439862 | ||||
Purchase Fixed P... | 19241530 | 280 days ago | IN | 0.1 ETH | 0.00448575 | ||||
Purchase Fixed P... | 19241516 | 280 days ago | IN | 0.1 ETH | 0.00526123 | ||||
Purchase Fixed P... | 19241507 | 280 days ago | IN | 0.1 ETH | 0.0079148 | ||||
Purchase Fixed P... | 19241485 | 280 days ago | IN | 0.1 ETH | 0.00412918 | ||||
Purchase Fixed P... | 19241472 | 280 days ago | IN | 0.1 ETH | 0.00524275 | ||||
Purchase Fixed P... | 19241469 | 280 days ago | IN | 0.1 ETH | 0.00415323 | ||||
Purchase Fixed P... | 19241454 | 280 days ago | IN | 0.4 ETH | 0.00599927 | ||||
Purchase Fixed P... | 19241453 | 280 days ago | IN | 0.1 ETH | 0.00423016 | ||||
Purchase Fixed P... | 19241449 | 280 days ago | IN | 0.1 ETH | 0.00415076 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19785126 | 204 days ago | 2 ETH | ||||
19241890 | 280 days ago | 75.5107 ETH | ||||
19241795 | 280 days ago | 10.6893 ETH | ||||
18809952 | 341 days ago | 0.0333 ETH | ||||
18809952 | 341 days ago | 0.0333 ETH | ||||
18809952 | 341 days ago | 0.0333 ETH | ||||
18809824 | 341 days ago | 0.0333 ETH | ||||
18809824 | 341 days ago | 0.0333 ETH | ||||
18809824 | 341 days ago | 0.0333 ETH | ||||
18809467 | 341 days ago | 0.0333 ETH | ||||
18809467 | 341 days ago | 0.0333 ETH | ||||
18809467 | 341 days ago | 0.0333 ETH | ||||
18809414 | 341 days ago | 0.0333 ETH | ||||
18809414 | 341 days ago | 0.0333 ETH | ||||
18809414 | 341 days ago | 0.0333 ETH | ||||
18809349 | 341 days ago | 0.0333 ETH | ||||
18809349 | 341 days ago | 0.0333 ETH | ||||
18809349 | 341 days ago | 0.0333 ETH | ||||
18809244 | 341 days ago | 0.0333 ETH | ||||
18809244 | 341 days ago | 0.0333 ETH | ||||
18809244 | 341 days ago | 0.0333 ETH | ||||
18809088 | 341 days ago | 0.0333 ETH | ||||
18809088 | 341 days ago | 0.0333 ETH | ||||
18809088 | 341 days ago | 0.0333 ETH | ||||
18808521 | 341 days ago | 0.0333 ETH |
Loading...
Loading
Contract Name:
Marketplace
Compiler Version
v0.8.19+commit.7dd6d404
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.19; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { IMinter } from "./IMinter.sol"; import { DelegateCashEnabled } from "./DelegateCashEnabled.sol"; contract Marketplace is Ownable, ReentrancyGuard, DelegateCashEnabled { struct SaleTypeFixedPrice { string _Name; // [0] -> _Name uint _Price; // [1] -> _Price uint _MintPassProjectID; // [2] -> _MintPassProjectID uint _Type; // [3] -> _Type (The Type Of Sale) (Must Be Configured To One Of The Following Options) // { ----------------------------------------------- } // | 0 = _MintToFactory() Single Mint | // | 1 = _MintToFactory() Mint Pack | // | 2 = _LiveMintMarketplace() Single Mint | // | 3 = _LiveMintMarketplace() Mint Pack | // | 4 = purchaseTo() ArtBlocks Direct Sale | // | 5 = transferFrom() Already-Minted ERC721 Sale | // | 6 = purchaseTo() ArtBlocks Direct Sale /w ETH | // { ----------------------------------------------- } uint _MinterProjectID; // [4] -> _MinterProjectID (ArtBlocks or LiveMint) uint _AmountForSale; // [5] -> _AmountForSale uint _TimestampStart; // [6] -> _TimestampStart uint _CurrentIndex; // [7] -> _CurrentIndex uint _BatchPurchaseAmount; // [8] -> _BatchPurchaseAmount (Transfer Amount Per Purchase) (MintPack or Direct Mint) address _NFT; // [9] -> _NFT address _Operator; // [10] -> _Operator bytes32[] _RootEligibilities; // [11] -> _RootEligibilities bytes32[] _RootAmounts; // [12] -> _RootAmounts uint[] _LiveMintProjectIDs; // [13] -> _LiveMintProjectIDs } struct FixedPriceSaleInfo { string _Name; // [0] -> _Price uint _Price; // [1] -> _Price uint _MintPassProjectID; // [2] -> _MintPassProjectID uint _Type; // [3] -> _Type (The Type Of Sale) (Must Be Configured To One Of These Options) // { ----------------------------------------------- } // | 0 = _MintToFactory() Single Mint | // | 1 = _MintToFactory() Mint Pack | // | 2 = _LiveMintMarketplace() Single Mint | // | 3 = _LiveMintMarketplace() Mint Pack | // | 4 = purchaseTo() ArtBlocks Direct Sale | // | 5 = transferFrom() Already-Minted ERC721 Sale | // | 6 = purchaseTo() ArtBlocks Direct Sale /w ETH | // { ----------------------------------------------- } uint _MinterProjectID; // [4] -> _MinterProjectID (ArtBlocks or LiveMint) uint _AmountForSale; // [5] -> _AmountForSale uint _TimestampStart; // [6] -> _TimestampStart uint _CurrentIndex; // [7] -> _CurrentIndex uint _BatchPurchaseAmount; // [8] -> _BatchPurchaseAmount (Transfer Amount Per Purchase) address _NFT; // [9] -> _NFT address _Operator; // [10] -> _Operator bytes32[] _RootEligibilities; // [11] -> _RootEligibilities bytes32[] _RootAmounts; // [12] -> _RootAmounts uint[] _LiveMintProjectIDs; // [13] -> _LiveMintProjectIDs uint[] _DiscountAmountWEIValues; // [14] -> _DiscountAmountWEIValues uint _ETHRevenue; // [15] -> _ETHRevenue uint _AmountRemaining; // [16] -> _AmountRemaining uint _Priority; // [17] -> _Priority uint _AmountRemainingMerklePriority; // [18] -> _AmountRemainingMerklePriority uint _AmountPurchasedUser; // [19] -> _AmountPurchasedUser bool _BrightListEligible; // [20] -> _BrightListEligible bool _BrightListAmounts; // [21] -> _BrightListAmounts } struct SaleTypePresale { string _Name; // [0] -> _Name address _Operator; // [1] -> _Operator address _NFT; // [2] -> _NFT uint _MaxForSale; // [3] -> _MaxForSale uint _MaxPerPurchase; // [4] -> _MaxPerPurchase uint _PricePresale; // [5] -> _PricePresale uint _PricePublic; // [6] -> _PricePublic uint _TimestampEndFullSet; // [7] -> _TimestampEndFullSet uint _TimestampEndCitizen; // [8] -> _TimestampEndCitizen uint _TimestampSaleStart; // [9] -> _TimestampSaleStart uint _Type; // [10] -> _Type uint _ProjectID; // [11] -> _ProjectID } struct InternalPresaleSale { bool _Active; // [0] -> _Active uint _AmountSold; // [1] -> _AmountSold uint _ETHRevenue; // [2] -> _ETHRevenue uint _GlobalPurchasesFullSet; // [3] -> _GlobalPurchasesFullSet uint _GlobalPurchasesCitizen; // [4] -> _GlobalPurchasesCitizen uint _GlobalPurchasesPublic; // [5] -> _GlobalPurchasesPublic uint _CurrentTokenIndex; // [6] -> _CurrentTokenIndex uint _AmountSoldFullSet; // [7] -> _AmountSoldFullSet uint _AmountSoldCitizen; // [8] -> _AmountSoldCitizen uint _AmountSoldPublic; // [9] -> _AmountSoldPublic } struct InternalPresaleSaleRoots { bytes32 _RootEligibilityFullSet; // [0] -> _RootEligibilityFullSet bytes32 _RootEligibilityCitizen; // [1] -> _RootEligibilityCitizen bytes32 _RootAmountFullSet; // [2] -> _RootAmountFullSet bytes32 _RootAmountCitizen; // [3] -> _RootAmountCitizen } struct InternalPresaleWalletInfo { uint _AmountPurchasedFullSetWindow; // [0] -> _AmountPurchasedFullSetWindow uint _AmountPurchasedCitizenWindow; // [1] -> _AmountPurchasedCitizenWindow uint _AmountPurchasedWallet; // [2] -> _AmountPurchasedWallet } struct SaleInfoPresale { uint _ETHRevenue; // [0] -> _ETHRevenue uint _PricePresale; // [1] -> _PricePresale uint _PricePublic; // [2] -> _PricePublic uint _MaxForSale; // [3] -> _MaxForSale uint _AmountRemaining; // [4] -> _AmountRemaining uint _TimestampEndFullSet; // [5] -> _TimestampEndFullSet uint _TimestampEndCitizen; // [6] -> _TimestampEndCitizen uint _TimestampSaleStart; // [7] -> _TimestampSaleStart uint _AmountPurchasableFullSet; // [8] -> _AmountPurchasableFullSet uint _AmountPurchasableCitizen; // [9] -> _AmountPurchasableCitizen uint _AmountPurchasedFullSetWindow; // [10] -> _AmountPurchasedFullSetWindow uint _AmountPurchasedCitizenWindow; // [11] -> _AmountPurchasedCitizenWindow uint _GlobalPurchasesFullSet; // [12] -> _GlobalPurchasesFullSet uint _GlobalPurchasesCitizen; // [13] -> _GlobalPurchasesCitizen uint _GlobalPurchasesPublic; // [14] -> _GlobalPurchasesPublic uint _AmountPurchasedWallet; // [15] -> _AmountPurchasedWallet bool _EligibleFullSet; // [16] -> _EligibleFullSet bool _EligibleCitizen; // [17] -> _EligibleCitizen bool _ValidMaxAmountFullSet; // [18] -> _ValidMaxAmountFullSet bool _ValidMaxAmountCitizen; // [19] -> _ValidMaxAmountCitizen } /*------------------ * STATE VARIABLES * -------------------*/ uint public _TOTAL_UNIQUE_PRESALE_SALES; // Total Unique Presale Sales uint public _TOTAL_UNIQUE_FIXED_SALES; // Total Unique Fixed Price Sales address private constant _BRT_MULTISIG = 0x0BC56e3c1397e4570069e89C07936A5c6020e3BE; // `sales.brightmoments.eth`a /*----------- * MAPPINGS * ------------*/ mapping(uint=>SaleTypeFixedPrice) public FixedPriceSales; // [SaleIndex] -> SaleTypeFixedPrice mapping(uint=>SaleTypePresale) public PresaleSales; // [SaleIndex] -> SaleTypePresale mapping(uint=>InternalPresaleSale) public PresaleSalesInternal; // [SaleIndex] -> InternalPresaleSale mapping(uint=>uint) public AmountSoldFixedPrice; // [SaleIndex] -> Amount Sold mapping(uint=>uint[]) public DiscountAmounts; // [SaleIndex] -> Discount Amounts mapping(uint=>InternalPresaleSaleRoots) public InternalRoots; // [SaleIndex] -> InternalPresaleSaleRoots mapping(uint=>mapping(address=>InternalPresaleWalletInfo)) public InternalSaleWalletInfo; // [SaleIndex][Wallet] -> InternalPresaleWalletInfo mapping(uint=>uint) public ETHRevenueFixedPriceSale; // [SaleIndex] -> ETH Amount mapping(uint=>uint) public ETHRevenueWithdrawn; // [SaleIndex] -> ETH Amount Withdrawn mapping(uint=>mapping(address=>mapping(uint=>uint))) public PriorityPurchaseAmount; // [SaleIndex][Wallet][Priority] => Purchased Amount For Priority Level mapping(address=>bool) public Admin; // [Address] -> Admin Status mapping(uint=>mapping(address=>uint)) public UserPurchasedAmount; // [SaleIndex][Wallet] -> Purchased Amount /*--------- * EVENTS * ----------*/ event PurchasedPresale(uint SaleIndex, address Purchaser, uint DesiredAmount, uint MessageValue, bool PresaleEnded); event SaleStarted(uint SaleIndex); event Refunded(address Refundee, uint Amount); event Purchased(uint SaleIndex, address Purchaser, uint Amount, uint Priority); event Fullset(); event Citizen(); event Public(); constructor() { Admin[msg.sender] = true; Admin[0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700] = true; Admin[0x90D98d5A1fD21B7cEa4D5c18341607ed1a8345c0] = true; Admin[0x18B7511938FBe2EE08ADf3d4A24edB00A5C9B783] = true; _transferOwnership(0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700); } /*--------------------- * EXTERNAL FUNCTIONS * ----------------------*/ /** * @dev Purchases One Fixed Price Sale * @param SaleIndex The Sale Index To Purchase * @param DesiredAmount The Desired Amount To Purchase * @param MaxAmount The Maximum Merkle Priority To Purchase * @param Vault Delegate Vault Address * @param ProofEligibility Merkle Proof For Eligibility * @param ProofAmount Merkle Proof For MaxAmount */ function PurchaseFixedPrice ( uint SaleIndex, uint DesiredAmount, uint MaxAmount, address Vault, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount ) external payable nonReentrant { __FinalizeFixedPriceSale( SaleIndex, DesiredAmount, MaxAmount, Vault, ProofEligibility, ProofAmount, msg.value, msg.sender ); } /** * @dev Purchases Multiple Fixed Price Sales * @param SaleIndexes The Sale Indexes To Purchase * @param DesiredAmounts The Desired Amounts To Purchase * @param MaxAmounts The Maximum Merkle Priority To Purchase * @param Vaults Delegate Vault Addresses * @param ProofEligibilities Merkle Proofs For Eligibility * @param ProofAmounts Merkle Proofs For MaxAmount * @param MessageValues The Amounts To Purchase Per Sale */ function PurchaseFixedPriceMulti ( uint[] calldata SaleIndexes, uint[] calldata DesiredAmounts, uint[] calldata MaxAmounts, address[] calldata Vaults, bytes32[][] calldata ProofEligibilities, bytes32[][] calldata ProofAmounts, uint[] calldata MessageValues ) external payable nonReentrant { uint MessageValueSum; require( SaleIndexes.length == DesiredAmounts.length && DesiredAmounts.length == MaxAmounts.length && MaxAmounts.length == Vaults.length && Vaults.length == ProofEligibilities.length && ProofEligibilities.length == ProofAmounts.length && ProofAmounts.length == MessageValues.length, "Marketplace: Incorrect Array Lengths" ); for(uint x; x < SaleIndexes.length; x++) { __FinalizeFixedPriceSale( SaleIndexes[x], DesiredAmounts[x], MaxAmounts[x], Vaults[x], ProofEligibilities[x], ProofAmounts[x], MessageValues[x], msg.sender ); MessageValueSum += MessageValues[x]; } require(MessageValueSum == msg.value, "Marketplace: `msg.value` & `MessageValues` Input Incorrect"); } /** * @dev Presale Purchase * @param SaleIndex The Sale Index To Purchase * @param DesiredAmount The Desired Amount To Purchase * @param MaxAmount The Maximum Amount For Merkle Priority Purchase * @param Vault Delegate Vault Address * @param ProofEligibility Merkle Proof For Eligibility * @param ProofAmount Merkle Proof For MaxAmount */ function PurchasePresale ( uint SaleIndex, uint DesiredAmount, uint MaxAmount, address Vault, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount ) external payable nonReentrant { __FinalizePresale( SaleIndex, DesiredAmount, MaxAmount, Vault, ProofEligibility, ProofAmount, msg.value, msg.sender ); } /*------------------ * ADMIN FUNCTIONS * -------------------*/ /** * @dev Instantiates A New Presale Sale * @param _Sale The Presale Sale Struct * @param _Roots The Presale Sale Roots Struct */ function __StartPresaleSale(SaleTypePresale memory _Sale, InternalPresaleSaleRoots memory _Roots) external onlyAdmin { PresaleSales[_TOTAL_UNIQUE_PRESALE_SALES] = _Sale; PresaleSalesInternal[_TOTAL_UNIQUE_PRESALE_SALES]._Active = true; InternalRoots[_TOTAL_UNIQUE_PRESALE_SALES] = _Roots; emit SaleStarted(_TOTAL_UNIQUE_PRESALE_SALES); _TOTAL_UNIQUE_PRESALE_SALES++; } /** * @dev Overwrites A Presale Sale * @param SaleIndex The Sale Index To Edit * @param _Sale The Fixed Price Sale Struct */ function __OverwritePresaleSale(uint SaleIndex, SaleTypePresale memory _Sale) external onlyAdmin { PresaleSales[SaleIndex] = _Sale; } /** * @dev Changes The Presale Sale Type * @param SaleIndex The Sale Index To Edit * @param Type The Sale Type (0 = _MintToFactory() | 1 = purchaseTo() | 2 = transferFrom()) */ function __ChangePresaleType(uint SaleIndex, uint Type) external onlyAdmin { PresaleSales[SaleIndex]._Type = Type; } /** * @dev Changes Presale ArtBlocks ProjectID * @param SaleIndex The Sale Index To Edit * @param ProjectID ArtBlocks ProjectID */ function __ChangePresaleProjectID(uint SaleIndex, uint ProjectID) external onlyAdmin { PresaleSales[SaleIndex]._ProjectID = ProjectID; } /** * @dev Changes Presale Times * @param SaleIndex The Sale Index To Edit * @param TimestampSaleStart The Unix Timestamp For Sale Start * @param TimestampFullSetEnd The Unix Timestamp When Full Set Window Ends * @param TimestampCitizenEnd The Unix Timestamp When Citizen Window Ends (Public Begins) */ function __ChangePresaleTimes ( uint SaleIndex, uint TimestampSaleStart, uint TimestampFullSetEnd, uint TimestampCitizenEnd ) external onlyAdmin { PresaleSales[SaleIndex]._TimestampSaleStart = TimestampSaleStart; PresaleSales[SaleIndex]._TimestampEndFullSet = TimestampFullSetEnd; PresaleSales[SaleIndex]._TimestampEndCitizen = TimestampCitizenEnd; } /** * @dev Changes All Presale Roots * @param SaleIndex The Sale Index To Edit * @param RootEligibilityFullSet The Merkle Eligibility Root For Full Set * @param RootAmountsFullSet The Merkle Amounts Root For Full Set * @param RootEligibilityCitizen The Merkle Eligibility Root For Citizens * @param RootAmountsCitizen The Merkle Amounts Root For Citizens */ function __ChangePresaleRootsAll ( uint SaleIndex, bytes32 RootEligibilityFullSet, bytes32 RootAmountsFullSet, bytes32 RootEligibilityCitizen, bytes32 RootAmountsCitizen ) external onlyAdmin { InternalRoots[SaleIndex]._RootEligibilityFullSet = RootEligibilityFullSet; InternalRoots[SaleIndex]._RootEligibilityCitizen = RootEligibilityCitizen; InternalRoots[SaleIndex]._RootAmountFullSet = RootAmountsFullSet; InternalRoots[SaleIndex]._RootAmountCitizen = RootAmountsCitizen; } /** * @dev Changes The Presale Roots For Merkle Eligibility * @param SaleIndex The Sale Index To Edit * @param RootCitizen The Merkle Eligibility Root For Citizens * @param RootFullSet The Merkle Eligibility Root For Full Set Holders */ function __ChangePresaleRootsEligibility ( uint SaleIndex, bytes32 RootCitizen, bytes32 RootFullSet ) external onlyAdmin { InternalRoots[SaleIndex]._RootEligibilityCitizen = RootCitizen; InternalRoots[SaleIndex]._RootEligibilityFullSet = RootFullSet; } /** * @dev Changes The Presale Roots For Merkle Amounts * @param SaleIndex The Sale Index To Edit * @param RootCitizen The Merkle Amount Root For Citizens * @param RootFullSet The Merkle Amount Root For Full Set Holders */ function __ChangePresaleRootsAmounts ( uint SaleIndex, bytes32 RootCitizen, bytes32 RootFullSet ) external onlyAdmin { InternalRoots[SaleIndex]._RootAmountCitizen = RootCitizen; InternalRoots[SaleIndex]._RootAmountFullSet = RootFullSet; } /** * @dev Changes Presale Sale Max For Sale * @param SaleIndex The Sale Index To Edit * @param MaxForSale The Total Amount For Sale */ function __ChangePresaleSaleMaxForSale(uint SaleIndex, uint MaxForSale) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._MaxForSale = MaxForSale; } /** * @dev Change Presale Sale Max Per Purchase * @param SaleIndex The Sale Index To Edit * @param MaxPerPurchase The Maximum Purchase Amount Per Transaction */ function __ChangePresaleSaleMaxPerPurchase(uint SaleIndex, uint MaxPerPurchase) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._MaxPerPurchase = MaxPerPurchase; } /** * @dev Changes Presale Sale Mint Pass Price * @param SaleIndex The Sale Index To Edit * @param Price The Sale Presale Price Input In WEI */ function __ChangePresaleSalePresalePrice(uint SaleIndex, uint Price) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._PricePresale = Price; } /** * @dev Changes Presale Sale Public Price * @param SaleIndex The Sale Index To Edit * @param Price The Sale Public Price Input In WEI */ function __ChangePresaleSalePublicPrice(uint SaleIndex, uint Price) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._PricePublic = Price; } /** * @dev Changes Timestamp End Full Set * @param SaleIndex The Sale Index To Edit * @param Timestamp The Unix Timestamp Of The End Of Full Set Window (1st Priority) */ function __ChangePresaleSaleEndFullSet(uint SaleIndex, uint Timestamp) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._TimestampEndFullSet = Timestamp; } /** * @dev Changes Timestamp End Citizen * @param SaleIndex The Sale Index To Edit * @param Timestamp The Unix Timestamp Of The End Of Citizen Window (2nd Priority) */ function __ChangePresaleSaleEndCitizen(uint SaleIndex, uint Timestamp) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._TimestampEndCitizen = Timestamp; } /** * @dev Changes Timestamp Sale Start * @param SaleIndex The Sale Index To Edit * @param Timestamp The Unix Timestamp For Sale Start */ function __ChangePresaleSaleStart(uint SaleIndex, uint Timestamp) external onlyAdmin { require(PresaleSalesInternal[SaleIndex]._Active, "Marketplace: Sale Not Active"); PresaleSales[SaleIndex]._TimestampSaleStart = Timestamp; } /** * @dev Changes Presale Sale Full Set Root * @param SaleIndex The Sale Index To Edit * @param RootFullSet The Full Set Priority Root */ function __ChangePresaleSaleRootFullSet(uint SaleIndex, bytes32 RootFullSet) external onlyAdmin { InternalRoots[SaleIndex]._RootEligibilityFullSet = RootFullSet; } /** * @dev Changes Presale Sale Citizen Root * @param SaleIndex The Sale Index To Edit * @param RootCitizen The Citizen Priority Root */ function __ChangePresaleSaleRootCitizen(uint SaleIndex, bytes32 RootCitizen) external onlyAdmin { InternalRoots[SaleIndex]._RootAmountCitizen = RootCitizen; } /** * @dev Initializes A Sale Via A Struct * @param _Sale The Sale Struct * @param Discounts The Array Of Discount Amounts ([80,90] = [20%,10%]) Discounts */ function __StartFixedPriceSale ( SaleTypeFixedPrice memory _Sale, uint[] calldata Discounts ) external onlyAdmin returns (uint SaleIndex) { return __FixedPriceSaleInit(_Sale, Discounts); } /** * @dev Starts Multiple Fixed Price Sales * @param _Sales The Sale Struct * @param Discounts The Array Of Discount Amounts ([80,90] = [20%,10%]) Discounts */ function __StartFixedPriceSales ( SaleTypeFixedPrice[] memory _Sales, uint[][] calldata Discounts ) external onlyAdmin returns (uint[] memory SaleIndexes) { SaleIndexes = new uint[](_Sales.length); for(uint x; x < _Sales.length; x++) { SaleIndexes[x] = __FixedPriceSaleInit(_Sales[x], Discounts[x]); } return SaleIndexes; } /** * @dev Changes The Price Of A Fixed Price Sale * @param SaleIndex The Sale Index To Edit * @param Price The Sale Price (IN WEI) */ function __ChangeFixedPrice(uint SaleIndex, uint Price) external onlyAdmin { FixedPriceSales[SaleIndex]._Price = Price; } /** * @dev Changes The MintPass ProjectID * @param SaleIndex The Sale Index To Edit * @param MintPassProjectID The Mint Pass ProjectID */ function __ChangeFixedPriceMintPassProjectID(uint SaleIndex, uint MintPassProjectID) external onlyAdmin { FixedPriceSales[SaleIndex]._MintPassProjectID = MintPassProjectID; } /** * @dev Changes The Type Of A Sale * @param SaleIndex The Sale Index To Edit * @param Type The Sale Type (0 = _MintToFactory() | 1 = purchaseTo() | 2 = transferFrom()) */ function __ChangeFixedPriceType(uint SaleIndex, uint Type) external onlyAdmin { FixedPriceSales[SaleIndex]._Type = Type; } /** * @dev Changes The ArtBlocks ProjectID * @param SaleIndex The Sale Index To Edit * @param ABProjectID ArtBlocks ProjectID */ function __ChangeFixedPriceABProjectID(uint SaleIndex, uint ABProjectID) external onlyAdmin { FixedPriceSales[SaleIndex]._MinterProjectID = ABProjectID; } /** * @dev Changes The Amount Of NFTs For Sale * @param SaleIndex The Sale Index To Edit * @param AmountForSale The Total Amount For Sale */ function __ChangeFixedPriceAmountForSale(uint SaleIndex, uint AmountForSale) external onlyAdmin { FixedPriceSales[SaleIndex]._AmountForSale = AmountForSale; } /** * @dev Changes A Fixed Price Sale's Unix Start Time * @param SaleIndex The Sale Index To Edit * @param UnixTimestamp The Unix Timestamp To Store */ function __ChangeFixedPriceStartTimestamp(uint SaleIndex, uint UnixTimestamp) external onlyAdmin { FixedPriceSales[SaleIndex]._TimestampStart = UnixTimestamp; } /** * @dev Changes A Fixed Price Sale's Unix Start Time * @param SaleIndex The Sale Index To Edit * @param CurrentIndex The Current TokenID To Disperse */ function __ChangeFixedPriceCurrentIndex(uint SaleIndex, uint CurrentIndex) external onlyAdmin { FixedPriceSales[SaleIndex]._CurrentIndex = CurrentIndex; } /** * @dev Changes The NFT Address Of A Fixed Price Sale * @param SaleIndex The Sale Index To Edit * @param NewAddress The NFT Contract Address To Store */ function __ChangeFixedPriceNFTAddress(uint SaleIndex, address NewAddress) external onlyAdmin { FixedPriceSales[SaleIndex]._NFT = NewAddress; } /** * @dev Changes The NFT Address Of A Fixed Price Sale * @param SaleIndex The Sale Index To Edit * @param Operator The Operator Holding The NFTs To Disperse */ function __ChangeFixedPriceOperator(uint SaleIndex, address Operator) external onlyAdmin { FixedPriceSales[SaleIndex]._Operator = Operator; } /** * @dev Changes The Fixed Price Merkle Root For Merkle Eligibility * @param SaleIndex The Sale Index To Edit * @param NewRoots The Merkle Roots To Store */ function __ChangeFixedPriceRootEligibility(uint SaleIndex, bytes32[] calldata NewRoots) external onlyAdmin { FixedPriceSales[SaleIndex]._RootEligibilities = NewRoots; } /** * @dev Changes The Fixed Price Merkle Root For Merkle Eligibility * @param SaleIndex The Sale Index To Edit * @param NewRoots The Merkle Root To Store */ function __ChangeFixedPriceRootAmounts(uint SaleIndex, bytes32[] calldata NewRoots) external onlyAdmin { FixedPriceSales[SaleIndex]._RootAmounts = NewRoots; } /** * @dev Changes The Fixed Price Sale Roots * @param SaleIndex The Sale Index To Edit * @param RootEligibilities The Merkle Root For Merkle Eligibility * @param RootAmounts The Merkle Root For Amounts */ function __ChangeFixedPriceSaleRoots(uint SaleIndex, bytes32[] calldata RootEligibilities, bytes32[] calldata RootAmounts) external onlyAdmin { FixedPriceSales[SaleIndex]._RootEligibilities = RootEligibilities; FixedPriceSales[SaleIndex]._RootAmounts = RootAmounts; } /** * @dev Changes Fixed Price Sale Discount Amounts (IN BIPS) * @param SaleIndex The Sale Index To Edit * @param Discounts The Array Of Discount Amounts ([80,90] = 20%, 10% Discount) To Seed */ function __ChangeFixedPriceDiscountAmounts(uint SaleIndex, uint[] calldata Discounts) external onlyAdmin { for(uint x; x < Discounts.length; x++) { require(Discounts[x] <= 100, "Marketplace: Invalid Discount Amounts");} DiscountAmounts[SaleIndex] = Discounts; } /** * @dev Changes The Fixed Price LiveMint ProjectIDs * @param SaleIndex The Sale Index To Edit * @param LiveMintProjectIDs The LiveMint ProjectIDs To Seed */ function __ChangeFixedPriceLiveMintProjecIDs(uint SaleIndex, uint[] calldata LiveMintProjectIDs) external onlyAdmin { FixedPriceSales[SaleIndex]._LiveMintProjectIDs = LiveMintProjectIDs; } /** * @dev Changes The Fixed Price Sale Mint Pack Amount * @param SaleIndex The Sale Index To Edit * @param MintPackAmount The Mint Pack Amount To Seed */ function __ChangeFixedPriceMintPackAmount(uint SaleIndex, uint MintPackAmount) external onlyAdmin { FixedPriceSales[SaleIndex]._BatchPurchaseAmount = MintPackAmount; } /** * @dev Sweeps Proceeds From A Sale Index To Multisig * @param SaleIndex The Sale Index To Withdraw From */ function __WithdrawETHFromSaleIndex(uint SaleIndex) external onlyAdmin { require(ETHRevenueFixedPriceSale[SaleIndex] - ETHRevenueWithdrawn[SaleIndex] > 0, "Marketplace: No ETH To Withdraw"); uint WithdrawAmount = ETHRevenueFixedPriceSale[SaleIndex] - ETHRevenueWithdrawn[SaleIndex]; ETHRevenueWithdrawn[SaleIndex] += WithdrawAmount; (bool success,) = _BRT_MULTISIG.call { value: WithdrawAmount }(""); require(success, "Marketplace: ETH Withdraw Failed"); } /*--------------*/ /* ONLY OWNER */ /*--------------*/ /** * @dev onlyOwner: Grants Admin Role * @param Wallet The Admin To Add */ function ____AddressAuthorize(address Wallet) external onlyOwner { Admin[Wallet] = true; } /** * @dev onlyOwner: Removes Admin Role * @param Wallet The Admin To Remove */ function ____DeuthorizeAddress(address Wallet) external onlyOwner { Admin[Wallet] = false; } /** * @dev onlyOwner: Withdraws Ether From Contract To Address With A Specified Amount * @param Recipient The Recipient Of The Ether * @param Amount The Amount Of Ether To Withdraw */ 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 ETH In Contract To Multisig */ function __WithdrawAllETHToMultisig() external onlyOwner { (bool success,) = _BRT_MULTISIG.call { value: address(this).balance }(""); require(success, "Marketplace: ETH Withdraw Failed"); } /*----------------- * VIEW FUNCTIONS * ------------------*/ /** * @dev Returns The Fixed Price Merkle Roots */ function ViewFixedPriceRoots(uint SaleIndex) external view returns (bytes32[] memory, bytes32[] memory) { return (FixedPriceSales[SaleIndex]._RootEligibilities, FixedPriceSales[SaleIndex]._RootAmounts); } /** * @dev Verifies BrightList For Presale */ function VerifyBrightList(address _Wallet, bytes32 _RootEligibilities, bytes32[] calldata _Proof) public pure returns(bool) { bytes32 _Leaf = keccak256(abi.encodePacked(_Wallet)); return MerkleProof.verify(_Proof, _RootEligibilities, _Leaf); } /** * @dev Verifies BrightList For Presale Fixed Price Sale */ function VerifyBrightListWithPriority ( uint SaleIndex, address _Wallet, bytes32[] calldata _ProofEligibility ) public view returns (bool, uint) { bytes32 _Leaf = keccak256(abi.encodePacked(_Wallet)); for(uint x; x < DiscountAmounts[SaleIndex].length; x++) { if(MerkleProof.verify(_ProofEligibility, FixedPriceSales[SaleIndex]._RootEligibilities[x], _Leaf)) { return (true, x); } } return (false, 69420); } /** * @dev Verifies Merkle Amount Is Passed Correctly */ function VerifyBrightListAmount ( address _Wallet, uint _Amount, bytes32 _RootAmounts, bytes32[] calldata _ProofAmount ) public pure returns (bool) { bytes32 _Leaf = (keccak256(abi.encodePacked(_Wallet, _Amount))); return MerkleProof.verify(_ProofAmount, _RootAmounts, _Leaf); } /** * @dev Verifies Maximum Purchase Amount Being Passed Is Valid */ function VerifyAmount(address _Wallet, uint _Amount, bytes32 _RootEligibilities, bytes32[] calldata _Proof) public pure returns(bool) { bytes32 _Leaf = (keccak256(abi.encodePacked(_Wallet, _Amount))); return MerkleProof.verify(_Proof, _RootEligibilities, _Leaf); } /** * @dev Returns Information Of A Fixed Price Sale */ function ViewSaleInfoFixedPrice ( uint SaleIndex, address Wallet, uint MaxAmount, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount ) public view returns (FixedPriceSaleInfo memory) { return __ViewSaleInfoFixedPrice( SaleIndex, Wallet, MaxAmount, ProofEligibility, ProofAmount ); } /** * @dev Returns Information Of Multiple Fixed Price Sales */ function ViewSaleInfosFixedPrice( uint[] calldata SaleIndexes, address[] calldata Wallets, uint[] calldata MaxAmounts, bytes32[][] calldata ProofEligibilities, bytes32[][] calldata ProofAmounts ) public view returns (FixedPriceSaleInfo[] memory _Sales) { _Sales = new FixedPriceSaleInfo[](SaleIndexes.length); for(uint x; x < SaleIndexes.length; x++) { _Sales[x] = __ViewSaleInfoFixedPrice( SaleIndexes[x], Wallets[x], MaxAmounts[x], ProofEligibilities[x], ProofAmounts[x] ); } return _Sales; } /** * @dev Returns A Wallet's Sale Information For A Presale Sale */ function ViewSaleInfoPresale ( uint SaleIndex, address Wallet, uint MaxAmountFullSet, uint MaxAmountCitizen, bytes32[] calldata FullsetProof, bytes32[] calldata CitizenProof, bytes32[] calldata ProofAmountFullSet, bytes32[] calldata ProofAmountCitizen ) public view returns (SaleInfoPresale memory) { uint AmountPurchaseableFullset; uint AmountPurchaseableCitizen; SaleTypePresale memory _Sale = PresaleSales[SaleIndex]; InternalPresaleSale memory _SaleInternal = PresaleSalesInternal[SaleIndex]; InternalPresaleWalletInfo memory _WalletInfo = InternalSaleWalletInfo[SaleIndex][Wallet]; uint AmountRemaining = _Sale._MaxForSale - _SaleInternal._AmountSold; uint ETHRevenue = _SaleInternal._ETHRevenue; if(_WalletInfo._AmountPurchasedFullSetWindow >= MaxAmountFullSet) { AmountPurchaseableFullset = 0; } else { AmountPurchaseableFullset = MaxAmountFullSet - _WalletInfo._AmountPurchasedFullSetWindow; } if(_WalletInfo._AmountPurchasedCitizenWindow >= MaxAmountCitizen) { AmountPurchaseableCitizen = 0; } else { AmountPurchaseableCitizen = MaxAmountCitizen - _WalletInfo._AmountPurchasedCitizenWindow; } return SaleInfoPresale ( ETHRevenue, // ETHRevenue _Sale._PricePresale, // _PricePresale _Sale._PricePublic, // _PricePublic _Sale._MaxForSale, // _MintPassesAvailable AmountRemaining, // _AmountRemaining _Sale._TimestampEndFullSet, // _TimestampEndFullSet _Sale._TimestampEndCitizen, // _TimestampEndCitizen _Sale._TimestampSaleStart, // _TimestampSaleStart AmountPurchaseableFullset, // _AmountPurchasableFullSet AmountPurchaseableCitizen, // _AmountPurchasableCitizen _WalletInfo._AmountPurchasedFullSetWindow, // _AmountPurchasedFullSetWindow _WalletInfo._AmountPurchasedCitizenWindow, // _AmountPurchasedCitizenWindow _SaleInternal._GlobalPurchasesFullSet, // _GlobalPurchasesFullSet _SaleInternal._GlobalPurchasesCitizen, // _GlobalPurchasesCitizen _SaleInternal._GlobalPurchasesPublic, // _GlobalPurchasesPublic _WalletInfo._AmountPurchasedWallet, // _AmountPurchasedWallet VerifyBrightList(Wallet, InternalRoots[SaleIndex]._RootEligibilityFullSet, FullsetProof), // _EligibleFullSet VerifyBrightList(Wallet, InternalRoots[SaleIndex]._RootEligibilityCitizen, CitizenProof), // _EligibleCitizen VerifyAmount(Wallet, MaxAmountFullSet, InternalRoots[SaleIndex]._RootAmountFullSet, ProofAmountFullSet), // _ValidMaxAmountFullSet VerifyAmount(Wallet, MaxAmountCitizen, InternalRoots[SaleIndex]._RootAmountCitizen, ProofAmountCitizen) // _ValidMaxAmountCitizen ); } /*----------- * INTERNAL * ------------*/ /** * @dev Refunds `Recipient` ETH Amount `Value` */ function __Refund(address Recipient, uint Value) internal { (bool Confirmed,) = Recipient.call{value: Value}(""); require(Confirmed, "Marketplace: Refund failed"); emit Refunded(Recipient, Value); } /** * @dev Initializes A Sale Via A Struct */ function __FixedPriceSaleInit(SaleTypeFixedPrice memory _Sale, uint[] calldata Discounts) internal returns (uint SaleIndex) { require( _Sale._RootEligibilities.length == _Sale._RootAmounts.length && _Sale._RootAmounts.length == Discounts.length, "Marketplace: All Array Lengths Must Match" ); for(uint x; x < Discounts.length; x++) { require(Discounts[x] <= 100 && Discounts[x] > 0, "Marketplace: Discount Amounts Must Be <= 100 & > 0"); } SaleIndex = _TOTAL_UNIQUE_FIXED_SALES; FixedPriceSales[SaleIndex] = _Sale; DiscountAmounts[SaleIndex] = Discounts; _TOTAL_UNIQUE_FIXED_SALES += 1; return SaleIndex; } /** * @dev Finalizes A Fixed Price Sale */ function __FinalizeFixedPriceSale( uint SaleIndex, uint DesiredAmount, uint MaxAmount, address Vault, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount, uint MessageValue, address Purchaser ) internal { require(tx.origin == Purchaser, "Marketplace: EOA Only"); address MerkleRecipient = Purchaser; if(Vault != address(0)) { if(DelegateCash.checkDelegateForAll(Purchaser, Vault)) { MerkleRecipient = Vault; } } require(block.timestamp >= FixedPriceSales[SaleIndex]._TimestampStart, "Marketplace: Sale Not Started"); (bool BrightList, uint Priority) = VerifyBrightListWithPriority(SaleIndex, MerkleRecipient, ProofEligibility); if(BrightList) { require( VerifyBrightListAmount( MerkleRecipient, MaxAmount, FixedPriceSales[SaleIndex]._RootAmounts[Priority], ProofAmount ), "DutchMarketplace: Invalid Max Amount Merkle Proof For Provided Merkle Priority" ); require( MessageValue == (((FixedPriceSales[SaleIndex]._Price * DesiredAmount) * DiscountAmounts[SaleIndex][Priority]) / 100), "Marketplace: Incorrect BrightList ETH Sent" ); require( DesiredAmount + PriorityPurchaseAmount[SaleIndex][MerkleRecipient][Priority] <= MaxAmount, "Marketplace: Desired Purchase Amount Exceeds Purchase Allocation" ); PriorityPurchaseAmount[SaleIndex][MerkleRecipient][Priority] += DesiredAmount; } else { require(MessageValue == FixedPriceSales[SaleIndex]._Price * DesiredAmount, "Marketplace: Incorrect ETH Amount Sent"); } require(AmountSoldFixedPrice[SaleIndex] + DesiredAmount <= FixedPriceSales[SaleIndex]._AmountForSale, "Marketplace: Not Enough NFTs Left For Sale"); AmountSoldFixedPrice[SaleIndex] = AmountSoldFixedPrice[SaleIndex] + DesiredAmount; if(FixedPriceSales[SaleIndex]._Type == 0) // Factory MintPass Direct Mint { IMinter(FixedPriceSales[SaleIndex]._NFT)._MintToFactory( Purchaser, DesiredAmount ); } else if (FixedPriceSales[SaleIndex]._Type == 1) // Factory MintPass MintPack Direct Mint { for(uint x; x < DesiredAmount; x++) { IMinter(FixedPriceSales[SaleIndex]._NFT)._MintToFactory( Purchaser, FixedPriceSales[SaleIndex]._BatchPurchaseAmount ); } } else if (FixedPriceSales[SaleIndex]._Type == 2) // LiveMint Direct Mint { ILiveMint(FixedPriceSales[SaleIndex]._NFT)._LiveMintMarketplace( Purchaser, FixedPriceSales[SaleIndex]._MinterProjectID, DesiredAmount ); } else if (FixedPriceSales[SaleIndex]._Type == 3) // LiveMint Direct Mint Pack { for(uint x; x < FixedPriceSales[SaleIndex]._LiveMintProjectIDs.length; x++) { ILiveMint(FixedPriceSales[SaleIndex]._NFT)._LiveMintMarketplace( Purchaser, FixedPriceSales[SaleIndex]._LiveMintProjectIDs[x], DesiredAmount ); } } else if(FixedPriceSales[SaleIndex]._Type == 4) // ArtBlocks purchaseTo() Mint { uint ProjectID = FixedPriceSales[SaleIndex]._MinterProjectID; for(uint x; x < DesiredAmount; x++) { IMinter(FixedPriceSales[SaleIndex]._NFT).purchaseTo(Purchaser, ProjectID); } } else if (FixedPriceSales[SaleIndex]._Type == 5) // ERC721 transferFrom() Sale { IERC721 _NFT = IERC721(FixedPriceSales[SaleIndex]._NFT); address _Operator = FixedPriceSales[SaleIndex]._Operator; uint _StartingIndex = FixedPriceSales[SaleIndex]._CurrentIndex; for(uint Index; Index < DesiredAmount; Index++) { _NFT.transferFrom(_Operator, Purchaser, _StartingIndex + Index); } FixedPriceSales[SaleIndex]._CurrentIndex += DesiredAmount; } else if (FixedPriceSales[SaleIndex]._Type == 6) { IMinter _NFT = IMinter(FixedPriceSales[SaleIndex]._NFT); uint _BatchPurchaseAmount = FixedPriceSales[SaleIndex]._BatchPurchaseAmount; uint _ETHValue = FixedPriceSales[SaleIndex]._Price / _BatchPurchaseAmount; uint _MinterProjectID = FixedPriceSales[SaleIndex]._MinterProjectID; for(uint x; x < DesiredAmount; x++) // Iterates Over The Desired Units Of Purchase { for(uint y; y < _BatchPurchaseAmount; y++) // Mints Configured Amount Of NFTs Per Unit Purchased { _NFT.purchaseTo{value: _ETHValue}(Purchaser, _MinterProjectID); } } } else { revert('Marketplace: Incorrect Sale Configuration'); } UserPurchasedAmount[SaleIndex][Purchaser] += DesiredAmount; ETHRevenueFixedPriceSale[SaleIndex] += MessageValue; emit Purchased(SaleIndex, Purchaser, DesiredAmount, Priority); } /** * @dev Finalizes A Presale Purchase * @param SaleIndex The Sale Index To Purchase * @param DesiredAmount The Desired Amount To Purchase * @param MaxAmount The Maximum Amount For Merkle Priority Purchase * @param Vault Delegate Vault Address * @param Proof Merkle Proof For Eligibility * @param ProofAmount Merkle Proof For MaxAmount */ function __FinalizePresale( uint SaleIndex, uint DesiredAmount, uint MaxAmount, address Vault, bytes32[] calldata Proof, bytes32[] calldata ProofAmount, uint MessageValue, address Purchaser ) internal { require(tx.origin == Purchaser, "Marketplace: EOA Only"); require(block.timestamp >= PresaleSales[SaleIndex]._TimestampSaleStart, "Marketplace: Sale Not Started"); address MerkleRecipient = Purchaser; if(Vault != address(0)) { if(DelegateCash.checkDelegateForAll(Purchaser, Vault)) { MerkleRecipient = Vault; } } InternalPresaleSale memory _InternalPresaleSale = PresaleSalesInternal[SaleIndex]; SaleTypePresale memory _PresaleSale = PresaleSales[SaleIndex]; bool PresaleEnded; uint _Price; uint _MaxPerPurchase = _PresaleSale._MaxPerPurchase; if(_InternalPresaleSale._AmountSold + DesiredAmount > _PresaleSale._MaxForSale) { DesiredAmount = _PresaleSale._MaxForSale - _InternalPresaleSale._AmountSold; // Partial Fill } if(block.timestamp <= _PresaleSale._TimestampEndCitizen) // Presale { if(block.timestamp <= _PresaleSale._TimestampEndFullSet) // Full Set Window { require ( // Eligible For Full Set Window VerifyBrightList(MerkleRecipient, InternalRoots[SaleIndex]._RootEligibilityFullSet, Proof), "Full Set Window: Not Eligible For Presale Window Or Block Pending, Please Try Again In A Few Seconds..." ); require(VerifyAmount(MerkleRecipient, MaxAmount, InternalRoots[SaleIndex]._RootAmountFullSet, ProofAmount), "Invalid Full Set Amount Proof"); require(InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedWallet + DesiredAmount <= MaxAmount, "All Full Set Allocation Used"); InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedFullSetWindow += DesiredAmount; PresaleSalesInternal[SaleIndex]._GlobalPurchasesFullSet += DesiredAmount; emit Fullset(); } else // Citizen Window { require ( // Eligible For Citizen Window VerifyBrightList(MerkleRecipient, InternalRoots[SaleIndex]._RootEligibilityCitizen, Proof), "Citizen Window: Not Eligible For Presale Window Or Block Pending, Please Try Again In A Few Seconds..." ); require(VerifyAmount(MerkleRecipient, MaxAmount, InternalRoots[SaleIndex]._RootAmountCitizen, ProofAmount), "Invalid Citizen Amount Proof"); require(InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedCitizenWindow + DesiredAmount <= MaxAmount, "All Citizen Allocation Used"); InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedWallet += DesiredAmount; PresaleSalesInternal[SaleIndex]._GlobalPurchasesCitizen += DesiredAmount; emit Citizen(); } _Price = _PresaleSale._PricePresale * DesiredAmount; } else // Public Sale { _Price = _PresaleSale._PricePublic * DesiredAmount; PresaleSalesInternal[SaleIndex]._GlobalPurchasesPublic += DesiredAmount; PresaleEnded = true; emit Public(); } require(DesiredAmount <= _MaxPerPurchase, "Invalid Desired Purchase Amount. Must Be <= Max Purchase Limit"); // Purchase Limiter require(_InternalPresaleSale._AmountSold + DesiredAmount <= _PresaleSale._MaxForSale, "Sale Ended"); // Sale End State require(DesiredAmount > 0 && _Price > 0, "Sale Ended"); // Sale End State require(MessageValue >= _Price, "Invalid ETH Amount"); // Ensures ETH Amount Sent Is Correct if(MessageValue > _Price) { __Refund(Purchaser, MessageValue - _Price); } // Refunds The Difference if(_PresaleSale._Type == 0) { IMinter(_PresaleSale._NFT)._MintToFactory(0, Purchaser, DesiredAmount); } else if (_PresaleSale._Type == 1) { for(uint x; x < DesiredAmount; x++) { IMinter(_PresaleSale._NFT).purchaseTo(Purchaser, _PresaleSale._ProjectID); } } PresaleSalesInternal[SaleIndex]._AmountSold += DesiredAmount; PresaleSalesInternal[SaleIndex]._CurrentTokenIndex += DesiredAmount; PresaleSalesInternal[SaleIndex]._ETHRevenue += _Price; InternalSaleWalletInfo[SaleIndex][MerkleRecipient]._AmountPurchasedWallet += DesiredAmount; emit PurchasedPresale(SaleIndex, Purchaser, DesiredAmount, MessageValue, PresaleEnded); } /** * @dev Returns The Sale Info For A Fixed Price Sale */ function __ViewSaleInfoFixedPrice ( uint SaleIndex, address Wallet, uint MaxAmount, bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmount ) internal view returns (FixedPriceSaleInfo memory) { uint Price = FixedPriceSales[SaleIndex]._Price; uint AmountForSale = FixedPriceSales[SaleIndex]._AmountForSale; uint AmountRemaining = AmountForSale - AmountSoldFixedPrice[SaleIndex]; uint ETHRevenue = ETHRevenueFixedPriceSale[SaleIndex]; uint AmountPurchasedUser = UserPurchasedAmount[SaleIndex][Wallet]; uint AmountRemainingMerklePriority; uint PurchasedAmountMerklePriority; bool BrightListMerkleAmount; uint[] memory DiscountAmountWEIValues = new uint[](FixedPriceSales[SaleIndex]._RootEligibilities.length); for(uint x; x < FixedPriceSales[SaleIndex]._RootEligibilities.length; x++) { DiscountAmountWEIValues[x] = (Price * DiscountAmounts[SaleIndex][x]) / 100; } (bool BrightListEligible, uint Priority) = VerifyBrightListWithPriority( SaleIndex, Wallet, ProofEligibility ); if(BrightListEligible) { BrightListMerkleAmount = VerifyBrightListAmount(Wallet, MaxAmount, FixedPriceSales[SaleIndex]._RootAmounts[Priority], ProofAmount); PurchasedAmountMerklePriority = PriorityPurchaseAmount[SaleIndex][Wallet][Priority]; if(MaxAmount > PurchasedAmountMerklePriority) { AmountRemainingMerklePriority = MaxAmount - PurchasedAmountMerklePriority; } } return FixedPriceSaleInfo( FixedPriceSales[SaleIndex]._Name, Price, FixedPriceSales[SaleIndex]._MintPassProjectID, FixedPriceSales[SaleIndex]._Type, FixedPriceSales[SaleIndex]._MinterProjectID, AmountForSale, FixedPriceSales[SaleIndex]._TimestampStart, FixedPriceSales[SaleIndex]._CurrentIndex, FixedPriceSales[SaleIndex]._BatchPurchaseAmount, FixedPriceSales[SaleIndex]._NFT, FixedPriceSales[SaleIndex]._Operator, FixedPriceSales[SaleIndex]._RootEligibilities, FixedPriceSales[SaleIndex]._RootAmounts, FixedPriceSales[SaleIndex]._LiveMintProjectIDs, DiscountAmountWEIValues, ETHRevenue, AmountRemaining, Priority, AmountRemainingMerklePriority, AmountPurchasedUser, BrightListEligible, BrightListMerkleAmount ); } /*----------- * MODIFIER * ------------*/ /** * @dev onlyAdmin Modifier */ modifier onlyAdmin { require(Admin[msg.sender], "Marketplace | onlyAdmin | Caller Is Not Admin"); _; } } interface IERC20 { function approve(address From, address To, uint Amount) external; } interface IERC721 { function transferFrom(address From, address To, uint TokenID) external; } interface ILiveMint { function _LiveMintMarketplace(address Recipient, uint ArtistID, uint Amount) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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.9.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; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _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.9.2) (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 rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 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 from 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { 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 rebuilds 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 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 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 from 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) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { 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 /** * @title DelegateCashEnabled * @author @brougkr * @notice For Easily Integrating `delegate.cash` */ pragma solidity ^0.8.19; abstract contract DelegateCashEnabled { address private constant _DN = 0x00000000000076A84feF008CDAbe6409d2FE638B; IDelegation public constant DelegateCash = IDelegation(_DN); } interface IDelegation { /** * @dev Returns If A Vault Has Delegated To The Delegate */ function checkDelegateForAll(address delegate, address vault) external view returns (bool); }
// SPDX-License-Identifier: MIT /** * @title IMinter Minter Interface * @author @brougkr */ pragma solidity ^0.8.19; interface IMinter { function purchase(uint256 _projectId) payable external returns (uint tokenID); // Custom function purchaseTo(address _to, uint _projectId) payable external returns (uint tokenID); // ArtBlocks Standard Minter // function purchaseTo(address _to) external returns (uint tokenID); // Custom // function purchaseTo(address _to, uint _projectId, address _ownedNFTAddress, uint _ownedNFTTokenID) payable external returns (uint tokenID); // ArtBlocks PolyMinter function tokenURI(uint256 _tokenId) external view returns (string memory); function _MintToFactory(uint ProjectID, address To, uint Amount) external; // MintPassFactory function _MintToFactory(address To, uint Amount) external; // MintPassBespoke }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Citizen","type":"event"},{"anonymous":false,"inputs":[],"name":"Fullset","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":[],"name":"Public","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"Purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"Priority","type":"uint256"}],"name":"Purchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"Purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"DesiredAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"MessageValue","type":"uint256"},{"indexed":false,"internalType":"bool","name":"PresaleEnded","type":"bool"}],"name":"PurchasedPresale","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Refundee","type":"address"},{"indexed":false,"internalType":"uint256","name":"Amount","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":"uint256","name":"","type":"uint256"}],"name":"AmountSoldFixedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DelegateCash","outputs":[{"internalType":"contract IDelegation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"DiscountAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ETHRevenueFixedPriceSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ETHRevenueWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"FixedPriceSales","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"InternalRoots","outputs":[{"internalType":"bytes32","name":"_RootEligibilityFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootEligibilityCitizen","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountCitizen","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"InternalSaleWalletInfo","outputs":[{"internalType":"uint256","name":"_AmountPurchasedFullSetWindow","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedCitizenWindow","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedWallet","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PresaleSales","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_MaxPerPurchase","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_ProjectID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"PresaleSalesInternal","outputs":[{"internalType":"bool","name":"_Active","type":"bool"},{"internalType":"uint256","name":"_AmountSold","type":"uint256"},{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesFullSet","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesCitizen","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesPublic","type":"uint256"},{"internalType":"uint256","name":"_CurrentTokenIndex","type":"uint256"},{"internalType":"uint256","name":"_AmountSoldFullSet","type":"uint256"},{"internalType":"uint256","name":"_AmountSoldCitizen","type":"uint256"},{"internalType":"uint256","name":"_AmountSoldPublic","type":"uint256"}],"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":"DesiredAmount","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":"PurchaseFixedPrice","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"DesiredAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"MaxAmounts","type":"uint256[]"},{"internalType":"address[]","name":"Vaults","type":"address[]"},{"internalType":"bytes32[][]","name":"ProofEligibilities","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"ProofAmounts","type":"bytes32[][]"},{"internalType":"uint256[]","name":"MessageValues","type":"uint256[]"}],"name":"PurchaseFixedPriceMulti","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"DesiredAmount","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":"PurchasePresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"UserPurchasedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"bytes32","name":"_RootEligibilities","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":"_RootEligibilities","type":"bytes32"},{"internalType":"bytes32[]","name":"_Proof","type":"bytes32[]"}],"name":"VerifyBrightList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"uint256","name":"_Amount","type":"uint256"},{"internalType":"bytes32","name":"_RootAmounts","type":"bytes32"},{"internalType":"bytes32[]","name":"_ProofAmount","type":"bytes32[]"}],"name":"VerifyBrightListAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"_Wallet","type":"address"},{"internalType":"bytes32[]","name":"_ProofEligibility","type":"bytes32[]"}],"name":"VerifyBrightListWithPriority","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"ViewFixedPriceRoots","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"},{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"},{"internalType":"uint256","name":"MaxAmount","type":"uint256"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"}],"name":"ViewSaleInfoFixedPrice","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_DiscountAmountWEIValues","type":"uint256[]"},{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountRemainingMerklePriority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedUser","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_BrightListAmounts","type":"bool"}],"internalType":"struct Marketplace.FixedPriceSaleInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Wallet","type":"address"},{"internalType":"uint256","name":"MaxAmountFullSet","type":"uint256"},{"internalType":"uint256","name":"MaxAmountCitizen","type":"uint256"},{"internalType":"bytes32[]","name":"FullsetProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"CitizenProof","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmountFullSet","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmountCitizen","type":"bytes32[]"}],"name":"ViewSaleInfoPresale","outputs":[{"components":[{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasableFullSet","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasableCitizen","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedFullSetWindow","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedCitizenWindow","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesFullSet","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesCitizen","type":"uint256"},{"internalType":"uint256","name":"_GlobalPurchasesPublic","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedWallet","type":"uint256"},{"internalType":"bool","name":"_EligibleFullSet","type":"bool"},{"internalType":"bool","name":"_EligibleCitizen","type":"bool"},{"internalType":"bool","name":"_ValidMaxAmountFullSet","type":"bool"},{"internalType":"bool","name":"_ValidMaxAmountCitizen","type":"bool"}],"internalType":"struct Marketplace.SaleInfoPresale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"},{"internalType":"address[]","name":"Wallets","type":"address[]"},{"internalType":"uint256[]","name":"MaxAmounts","type":"uint256[]"},{"internalType":"bytes32[][]","name":"ProofEligibilities","type":"bytes32[][]"},{"internalType":"bytes32[][]","name":"ProofAmounts","type":"bytes32[][]"}],"name":"ViewSaleInfosFixedPrice","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"},{"internalType":"uint256[]","name":"_DiscountAmountWEIValues","type":"uint256[]"},{"internalType":"uint256","name":"_ETHRevenue","type":"uint256"},{"internalType":"uint256","name":"_AmountRemaining","type":"uint256"},{"internalType":"uint256","name":"_Priority","type":"uint256"},{"internalType":"uint256","name":"_AmountRemainingMerklePriority","type":"uint256"},{"internalType":"uint256","name":"_AmountPurchasedUser","type":"uint256"},{"internalType":"bool","name":"_BrightListEligible","type":"bool"},{"internalType":"bool","name":"_BrightListAmounts","type":"bool"}],"internalType":"struct Marketplace.FixedPriceSaleInfo[]","name":"_Sales","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOTAL_UNIQUE_FIXED_SALES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_TOTAL_UNIQUE_PRESALE_SALES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"__ChangeFixedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"ABProjectID","type":"uint256"}],"name":"__ChangeFixedPriceABProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"AmountForSale","type":"uint256"}],"name":"__ChangeFixedPriceAmountForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"CurrentIndex","type":"uint256"}],"name":"__ChangeFixedPriceCurrentIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256[]","name":"Discounts","type":"uint256[]"}],"name":"__ChangeFixedPriceDiscountAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256[]","name":"LiveMintProjectIDs","type":"uint256[]"}],"name":"__ChangeFixedPriceLiveMintProjecIDs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MintPackAmount","type":"uint256"}],"name":"__ChangeFixedPriceMintPackAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MintPassProjectID","type":"uint256"}],"name":"__ChangeFixedPriceMintPassProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"NewAddress","type":"address"}],"name":"__ChangeFixedPriceNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"address","name":"Operator","type":"address"}],"name":"__ChangeFixedPriceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"NewRoots","type":"bytes32[]"}],"name":"__ChangeFixedPriceRootAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"NewRoots","type":"bytes32[]"}],"name":"__ChangeFixedPriceRootEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32[]","name":"RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"RootAmounts","type":"bytes32[]"}],"name":"__ChangeFixedPriceSaleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"UnixTimestamp","type":"uint256"}],"name":"__ChangeFixedPriceStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Type","type":"uint256"}],"name":"__ChangeFixedPriceType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"ProjectID","type":"uint256"}],"name":"__ChangePresaleProjectID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootEligibilityFullSet","type":"bytes32"},{"internalType":"bytes32","name":"RootAmountsFullSet","type":"bytes32"},{"internalType":"bytes32","name":"RootEligibilityCitizen","type":"bytes32"},{"internalType":"bytes32","name":"RootAmountsCitizen","type":"bytes32"}],"name":"__ChangePresaleRootsAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootCitizen","type":"bytes32"},{"internalType":"bytes32","name":"RootFullSet","type":"bytes32"}],"name":"__ChangePresaleRootsAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootCitizen","type":"bytes32"},{"internalType":"bytes32","name":"RootFullSet","type":"bytes32"}],"name":"__ChangePresaleRootsEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"__ChangePresaleSaleEndCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"__ChangePresaleSaleEndFullSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MaxForSale","type":"uint256"}],"name":"__ChangePresaleSaleMaxForSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"MaxPerPurchase","type":"uint256"}],"name":"__ChangePresaleSaleMaxPerPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"__ChangePresaleSalePresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Price","type":"uint256"}],"name":"__ChangePresaleSalePublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootCitizen","type":"bytes32"}],"name":"__ChangePresaleSaleRootCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"bytes32","name":"RootFullSet","type":"bytes32"}],"name":"__ChangePresaleSaleRootFullSet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Timestamp","type":"uint256"}],"name":"__ChangePresaleSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"TimestampFullSetEnd","type":"uint256"},{"internalType":"uint256","name":"TimestampCitizenEnd","type":"uint256"}],"name":"__ChangePresaleTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"internalType":"uint256","name":"Type","type":"uint256"}],"name":"__ChangePresaleType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"},{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_MaxPerPurchase","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_ProjectID","type":"uint256"}],"internalType":"struct Marketplace.SaleTypePresale","name":"_Sale","type":"tuple"}],"name":"__OverwritePresaleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"}],"internalType":"struct Marketplace.SaleTypeFixedPrice","name":"_Sale","type":"tuple"},{"internalType":"uint256[]","name":"Discounts","type":"uint256[]"}],"name":"__StartFixedPriceSale","outputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_Price","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_MinterProjectID","type":"uint256"},{"internalType":"uint256","name":"_AmountForSale","type":"uint256"},{"internalType":"uint256","name":"_TimestampStart","type":"uint256"},{"internalType":"uint256","name":"_CurrentIndex","type":"uint256"},{"internalType":"uint256","name":"_BatchPurchaseAmount","type":"uint256"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"bytes32[]","name":"_RootEligibilities","type":"bytes32[]"},{"internalType":"bytes32[]","name":"_RootAmounts","type":"bytes32[]"},{"internalType":"uint256[]","name":"_LiveMintProjectIDs","type":"uint256[]"}],"internalType":"struct Marketplace.SaleTypeFixedPrice[]","name":"_Sales","type":"tuple[]"},{"internalType":"uint256[][]","name":"Discounts","type":"uint256[][]"}],"name":"__StartFixedPriceSales","outputs":[{"internalType":"uint256[]","name":"SaleIndexes","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"address","name":"_Operator","type":"address"},{"internalType":"address","name":"_NFT","type":"address"},{"internalType":"uint256","name":"_MaxForSale","type":"uint256"},{"internalType":"uint256","name":"_MaxPerPurchase","type":"uint256"},{"internalType":"uint256","name":"_PricePresale","type":"uint256"},{"internalType":"uint256","name":"_PricePublic","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndFullSet","type":"uint256"},{"internalType":"uint256","name":"_TimestampEndCitizen","type":"uint256"},{"internalType":"uint256","name":"_TimestampSaleStart","type":"uint256"},{"internalType":"uint256","name":"_Type","type":"uint256"},{"internalType":"uint256","name":"_ProjectID","type":"uint256"}],"internalType":"struct Marketplace.SaleTypePresale","name":"_Sale","type":"tuple"},{"components":[{"internalType":"bytes32","name":"_RootEligibilityFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootEligibilityCitizen","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountFullSet","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmountCitizen","type":"bytes32"}],"internalType":"struct Marketplace.InternalPresaleSaleRoots","name":"_Roots","type":"tuple"}],"name":"__StartPresaleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__WithdrawAllETHToMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"SaleIndex","type":"uint256"}],"name":"__WithdrawETHFromSaleIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Wallet","type":"address"}],"name":"____AddressAuthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Wallet","type":"address"}],"name":"____DeuthorizeAddress","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":[],"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
608080604052346100f45760008054336001600160a01b03198083168217845592917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0916001600160a01b03918216838580a3600193848055338452600e6020526040842060ff1990868282541617905573e06f5fae754e81bc050215ff89b03d9e9ff20700958686526040862081838254161790557390d98d5a1fd21b7cea4d5c18341607ed1a8345c086526040862081838254161790557318b7511938fbe2ee08adf3d4a24edb00a5c9b78386526040862091825416179055848454918216178455169180a3615f219081620000fa8239f35b600080fdfe610440604052600436101561001357600080fd5b60006102605260003560e01c80630404157314613a075780630a595192146139bc5780630ade686b146138b25780630c0d44751461382e57806312cb2565146137fe578063145e28701461377157806316ffa2e21461370c578063171459a61461369057806319f656861461362a5780631ae3b93a14613513578063228dd2b5146134b35780632dbef8e91461292a57806333b005d0146128e75780634314d55f146125f657806343fa0329146125915780634710a06c1461254a5780634852590e146123de5780634a850fbd146123975780634ab4e832146123325780634d1280e1146122eb5780634ec7a65b146120cd57806350fe6add1461206857806352d635f614611fdb57806358e2b34c14611fa95780635a23785d14611e865780635b80402814611e655780635fc99e3014611e215780636213195814611dbc5780636569f4c714611d8c578063665ccfaa14611d455780636915fed614611cfe5780636a95cc0814611cd2578063715018a614611c595780637826817d14611bf45780637b0c805614611b675780637bfd7f2214611add578063800c42d114611a595780638da5cb5b14611a305780639366ca6b146119c8578063953ba9ee146119635780639e05fd301461191c578063a038ad6e146118b7578063a297684314611869578063a761f7a1146117a5578063b7e96e6014611760578063ba0eebe41461173f578063bae24f91146116f8578063c4e5ae72146116b1578063c5f44dd41461165f578063cc557cab14611547578063cd5936cb146114e3578063d002ae641461148d578063d13091f91461142e578063d347ab2f1461135e578063d63fe42a14611317578063d93c9c4f1461111e578063e204591c14610db7578063e857270514610b6e578063ea0fd98514610d70578063ec38035414610d1a578063eef8959814610ccd578063f2fde38b14610bd8578063f3290bfe14610b73578063f7e8528a14610b6e578063f8a5bd2914610b27578063f8dec46d14610a8e578063fb61f5a914610a5e5763ff6014ba1461030f57600080fd5b34610a5757610100600319360112610a5757610329613a75565b60843567ffffffffffffffff8111610a5757610349903690600401613a9f565b60a49291923567ffffffffffffffff8111610a575761036c903690600401613a9f565b610120526103605260c43567ffffffffffffffff8111610a5757610394903690600401613a9f565b60805260e43567ffffffffffffffff8111610a57576103b7903690600401613a9f565b919060a0526040516103c881613b6c565b6102605181526102605160208201526102605160408201526102605160608201526102605160808201526102605160a08201526102605160c08201526102605160e08201526102605161010082015261026051610120820152610260516101408201526102605161016082015261026051610180820152610260516101a0820152610260516101c0820152610260516101e08201526102605161020082015261026051610220820152610260516102408201526102608051910152610260518061016052806101c05260043590526005602052600b604061026051206104b46040518061034052613b3b565b6104bd81614167565b61034051526001600160a01b0360018201541660206103405101526001600160a01b0360028201541660406103405101526003810154606061034051015260048101546080610340510152600581015460a0610340510152600681015460c0610340510152600781015460e061034051015260088101546101006103405101526009810154610120610340510152600a81015461014061034051015201546101606103405101526004356102605152600660205260096040610260512061058a6040518061010052613b1e565b60ff8154161515610100515260018101546020610100510152600281015460406101005101526003810154606061010051015260048101546080610100510152600581015460a0610100510152600681015460c0610100510152600781015460e061010051015260088101546101008051015201546101206101005101526004356102605152600a602052604061026051206001600160a01b038516600052602052604060002060405190816102005281606081011067ffffffffffffffff606084011117610a2857816060600293016040528154905260018101546020610200510152015460406102005101526107de61069460606103405101516020610100510151906145f6565b61010051604001516102205261020051519093906044358110610a13575061026051610160525b610200516020015160643581106109fe5750610260516101c0525b610340519560a08701516102405260c0870151610140526107b460608801519461075f60e08a0151986101206101008c01519b01519b604061020051805161038052602081015160c05260a06101005160608101516102a05260808101516102805201516103005201516101e052600435610260515260096020526040610260512054866146cd565b60e0526004356102605152600960205261078b61012051610360516001604061026051200154866146cd565b6102e0526004356102605152600960205260805190600260406102605120015460443585614834565b6102c0526004356102605152600960205260a0519060036040610260512001549060643590614834565b610320526107f2604051806101a052613b6c565b610220516101a051526102405160206101a05101526101405160406101a051015260606101a051015260806101a051015260a06101a051015260c06101a051015260e06101a0510152610160516101006101a05101526101c0516101206101a0510152610380516101406101a051015260c0516101606101a05101526102a0516101806101a0510152610280516101a080510152610300516101c06101a05101526101e0516101e06101a051015260e05115156102006101a05101526102e05115156102206101a05101526102c05115156102406101a05101526103205115156102606101a051015261028060405161022051815260206101a0510151602082015260406101a0510151604082015260606101a0510151606082015260806101a0510151608082015260a06101a051015160a082015260c06101a051015160c082015260e06101a051015160e08201526101006101a05101516101008201526101206101a05101516101208201526101406101a05101516101408201526101606101a05101516101608201526101806101a05101516101808201526101a0805101516101a08201526101c06101a05101516101c08201526101e06101a05101516101e08201526102006101a051015115156102008201526102206101a051015115156102208201526102406101a051015115156102408201526102606101a05101511515610260820152f35b610a0a906064356145f6565b6101c0526106d6565b610a1f906044356145f6565b610160526106bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102605180fd5b34610a57576020600319360112610a57576004356102605152600760205260206040610260512054604051908152f35b34610a57576020600319360112610a5757600435610260515260066020526101406040610260512060ff8154169060018101549060028101546003820154600483015460058401549060068501549260078601549460096008880154970154976040519915158a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b34610a5757610b3536613e96565b90336102605152600e602052610b5460ff60406102605120541661444a565b610260515260046020526102605190600360408320015580f35b614273565b34610a5757610b8136613e96565b90336102605152600e602052610ba060ff60406102605120541661444a565b8061026051526006602052610bbe60ff6040610260512054166144d2565b610260515260056020526102605190600760408320015580f35b34610a57576020600319360112610a5757610bf1613a5f565b610bf96142cb565b6001600160a01b03809116908115610c6357600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36102605180f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b34610a57576040600319360112610a5757610ce6613a75565b6004356102605152600f6020526001600160a01b036040610260512091166000526020526020604060002054604051908152f35b34610a57576102605180600319360112610d6d57610d366142cb565b610d666102605180808047730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b50614633565b6102605180f35b80fd5b34610a5757610d7e36613e96565b90336102605152600e602052610d9d60ff60406102605120541661444a565b610260515260056020526102605190600b60408320015580f35b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757610de9903690600401613eac565b9060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610a5757604051916080830183811083821117610a28576040526024358352604435602084015260643560408401526084356060840152336102605152600e602052610e6560ff60406102605120541661444a565b600254610260515260056020526102605191604083209282519081519283116110ee5750610e938454614114565b601f81116110ad575b50610260519084602092601f851160011461103e5750509180600b9492610160946102605192611033575b50506000198260011b9260031b1c19161784555b600184016001600160a01b039081602084015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a850155015191015560025461026051526006602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556002549052600960205260036060604061026051209280518455602081015160018501556040810151600285015501519101556110296002547fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614378565b6002556102605180f35b015190508780610ec7565b5261026051602081209291905b601f1985168110611095575092600b94926001926101609583601f1981161061107c575b505050811b018455610edb565b015160001960f88460031b161c1916905587808061106f565b9192602060018192868501518155019401920161104b565b6110de9085610260515260206102605120601f850160051c810191602086106110e4575b601f0160051c01906144bb565b85610e9c565b90915081906110d1565b7f4e487b710000000000000000000000000000000000000000000000000000000090526041600452602461026051fd5b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757611150903690600401613a9f565b91602435818111610a5757611169903690600401613a9f565b604435838111610a5757611181903690600401613a9f565b919093606435818111610a575761119c903690600401613a9f565b9091608435908111610a57576111b6903690600401613a9f565b9490936111c28a613c48565b996111d06040519b8c613bc2565b808b52601f196111df82613c48565b01610260515b8181106112ff5750508a610260515b82811061127d575060405160209182820192808352815180945260408301938160408260051b86010193019161026051955b8287106112335785850386f35b90919293828061126d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a600196030186528851613fdd565b9601920196019592919092611226565b6112f2816112f8936112e28f8f908f908f908f908f908f8f8f8f926112cb8d6112d2946112c56112c0838099976112b982809a6112da9e6143b6565b359f6143b6565b6143c6565b9c6143b6565b35956143da565b9590946143da565b959094615bb2565b6112ec838361454e565b5261454e565b50614378565b8b906111f4565b808d6020809361130d61489e565b92010152016111e5565b34610a575761132536613e96565b90336102605152600e60205261134460ff60406102605120541661444a565b610260515260046020526102605190600260408320015580f35b34610a57576020600319360112610a5757600435610260515260056020526113ee6040610260512061138f81614167565b906001600160a01b03908160018201541691600282015416906003810154600482015460058301546006840154600785015491600886015493600987015495600b600a890154980154986040519c8d9c8d610180908181520190613f9d565b9a60208d015260408c015260608b015260808a015260a089015260c088015260e08701526101008601526101208501526101408401526101608301520390f35b34610a57576080600319360112610a5757336102605152600e60205261145d60ff60406102605120541661444a565b60043561026051526005602052610260516040812060243560098201556044356007820155600860643591015580f35b34610a57576060600319360112610a57576114a6613a75565b60443567ffffffffffffffff8111610a57576040916114cc6114d5923690600401613a9f565b9160043561477a565b825191151582526020820152f35b34610a575760a0600319360112610a5757336102605152600e60205261151260ff60406102605120541661444a565b600435610260515260096020526102605160408120602435815560643560018201556044356002820155600360843591015580f35b34610a57576060600319360112610a575767ffffffffffffffff600435602435828111610a575761157c903690600401613a9f565b9290604435828111610a5757611596903690600401613a9f565b939091336102605152602095600e87526115b960ff60406102605120541661444a565b826102605152600487526102605191600b6040842001928683116110ee57506115e28284614575565b9161026051526102605191878320835b83811061164d5750505050526004845261026051600c60408220019284116110ee575061161f8383614575565b906102605152610260519280842090845b84811061163b578580f35b83358382015592810192600101611630565b823582820155918901916001016115f2565b34610a57576020600319360112610a5757600435610260515260096020526080604061026051208054906001810154906003600282015491015491604051938452602084015260408301526060820152f35b34610a57576116bf36613e96565b90336102605152600e6020526116de60ff60406102605120541661444a565b610260515260046020526102605190600660408320015580f35b34610a575761170636613e96565b90336102605152600e60205261172560ff60406102605120541661444a565b610260515260046020526102605190600560408320015580f35b34610a57576102605180600319360112610d6d576020600354604051908152f35b34610a575761176e36613e96565b90610260515260086020526102605160408120908154831015610d6d576020611797848461422c565b90546040519160031b1c8152f35b34610a57576020600319360112610a57576004356102605152600460205261182f604061026051206117d681614167565b906001810154906002810154906003810154600482015460058301546006840154906007850154926008860154946001600160a01b03600a8160098a01541698015416976040519b8c9b8c6101608091528d0190613f9d565b9960208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301520390f35b34610a575761187736613ad0565b9091336102605152600e60205261189760ff60406102605120541661444a565b610260515260096020526002610260519260408420906003820155015580f35b34610a57576118c536613e96565b90336102605152600e6020526118e460ff60406102605120541661444a565b806102605152600660205261190260ff6040610260512054166144d2565b610260515260056020526102605190600660408320015580f35b34610a575761192a36613e96565b90336102605152600e60205261194960ff60406102605120541661444a565b610260515260046020526102605190600760408320015580f35b34610a575761197136613e96565b90336102605152600e60205261199060ff60406102605120541661444a565b80610260515260066020526119ae60ff6040610260512054166144d2565b610260515260056020526102605190600360408320015580f35b34610a57576020600319360112610a57576001600160a01b036119e9613a5f565b6119f16142cb565b166102605152600e602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905580f35b34610a57576102605180600319360112610d6d576001600160a01b036020915416604051908152f35b34610a57576040600319360112610a5757611a72613a75565b336102605152600e602052611a9060ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b036009604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a575760a0600319360112610a5757611af6613a75565b67ffffffffffffffff606435818111610a5757611b17903690600401613a9f565b92608435928311610a5757611b6393611b37611b4f943690600401613a9f565b939092611b4261489e565b5060443590600435615bb2565b604051918291602083526020830190613fdd565b0390f35b34610a5757611b7536613aea565b90336102605152602092600e8452611b9660ff60406102605120541661444a565b6102605152600483526102605190600d60408320019167ffffffffffffffff84116110ee5750611bc683836145bd565b906102605152610260519280842090845b848110611be2578580f35b83358382015592810192600101611bd7565b34610a5757611c0236613e96565b90336102605152600e602052611c2160ff60406102605120541661444a565b8061026051526006602052611c3f60ff6040610260512054166144d2565b610260515260056020526102605190600460408320015580f35b34610a57576102605180600319360112610d6d57611c756142cb565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36102605180f35b34610a57576102605180600319360112610d6d5760206040516d76a84fef008cdabe6409d2fe638b8152f35b34610a5757611d0c36613e96565b90336102605152600e602052611d2b60ff60406102605120541661444a565b610260515260046020526102605190600860408320015580f35b34610a5757611d5336613e96565b90336102605152600e602052611d7260ff60406102605120541661444a565b610260515260046020526102605190600160408320015580f35b34610a57576020600319360112610a57576004356102605152600c60205260206040610260512054604051908152f35b34610a57576020600319360112610a575760043561026051526004602052611e1360406102605120611b63611dff600c611df8600b850161467e565b930161467e565b604051938493604085526040850190613f69565b908382036020850152613f69565b34610a5757611e2f36613e96565b90336102605152600e602052611e4e60ff60406102605120541661444a565b610260515260096020526102605190604082205580f35b34610a57576102605180600319360112610d6d576020600254604051908152f35b34610a5757611e9436613aea565b90336102605152602092600e8452611eb560ff60406102605120541661444a565b610260515b838110611f1d57506102605152600883526102605190604082209167ffffffffffffffff84116110ee5750611eef83836145bd565b906102605152610260519280842090845b848110611f0b578580f35b83358382015592810192600101611f00565b606480611f2b8387876143b6565b3511611f405750611f3b90614378565b611eba565b857f6f756e74730000000000000000000000000000000000000000000000000000006084926040519262461bcd60e51b84526004840152602560248401527f4d61726b6574706c6163653a20496e76616c696420446973636f756e7420416d6044840152820152fd5b611fd0611fb536613e2f565b94611fc7979697949194939293614323565b33973497614f18565b600180556102605180f35b34610a5757611fe936613aea565b90336102605152602092600e845261200a60ff60406102605120541661444a565b6102605152600483526102605190600b60408320019167ffffffffffffffff84116110ee575061203a8383614575565b906102605152610260519280842090845b848110612056578580f35b8335838201559281019260010161204b565b34610a575761207636613e96565b90336102605152600e60205261209560ff60406102605120541661444a565b80610260515260066020526120b360ff6040610260512054166144d2565b610260515260056020526102605190600560408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff602435818111610a57576120ff903690600401613eac565b3361026051526020600e815261211e60ff60406102605120541661444a565b6004356102605152600581526102605192604084209383519081519283116110ee575061214b8554614114565b601f81116122b7575b5061026051908391601f8411600114612249575091806101609492600b9694610260519261223e575b50506000198260011b9260031b1c19161785555b600185016001600160a01b03809284015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a85015501519101556102605180f35b01519050878061217d565b919086601f19851693526102605192858420935b8181106122a05750926001928592600b9896610160989610612287575b505050811b018555612191565b015160001960f88460031b161c1916905587808061227a565b92938660018192878601518155019501930161225d565b6122e590866102605152846102605120601f850160051c8101918686106110e457601f0160051c01906144bb565b85612154565b34610a57576122f936613e96565b90336102605152600e60205261231860ff60406102605120541661444a565b610260515260096020526102605190600360408320015580f35b34610a575761234036613e96565b90336102605152600e60205261235f60ff60406102605120541661444a565b806102605152600660205261237d60ff6040610260512054166144d2565b610260515260056020526102605190600860408320015580f35b34610a57576123a536613e96565b90336102605152600e6020526123c460ff60406102605120541661444a565b610260515260046020526102605190600460408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a575736602382011215610a575780600401359161241c83613c48565b9261242a6040519485613bc2565b8084526020928385016024809360051b83010191368311610a5757838101915b838310612524575050505035908111610a575761246b903690600401613a9f565b929092336102605152600e835261248b60ff60406102605120541661444a565b612495825161451d565b91610260515b81518110156124dc57806124c76124b56124d7938561454e565b516124c183878b6143da565b9161493f565b6124d1828761454e565b52614378565b61249b565b5050509060405191818392830181845282518091528160408501930191610260515b82811061250d57505050500390f35b8351855286955093810193928101926001016124fe565b8235868111610a5757879161253f8392883691870101613ccc565b81520192019161244a565b34610a575761255836613e96565b90336102605152600e60205261257760ff60406102605120541661444a565b610260515260056020526102605190600a60408320015580f35b34610a575761259f36613e96565b90336102605152600e6020526125be60ff60406102605120541661444a565b80610260515260066020526125dc60ff6040610260512054166144d2565b610260515260056020526102605190600960408320015580f35b60e0600319360112610a575767ffffffffffffffff600435818111610a5757612623903690600401613a9f565b919061018052602435818111610a5757612641903690600401613a9f565b604435838111610a5757612659903690600401613a9f565b606492919235858111610a5757612674903690600401613a9f565b608435878111610a575761268c903690600401613a9f565b9260a435898111610a57576126a5903690600401613a9f565b92909160c4359a8b11610a57576126c18c9b3690600401613a9f565b99909a6126cc614323565b89610260519d14806128de575b806128d5575b806128cc575b806128c3575b806128ba575b156128515799979593918d9b9997959391610260519b5b8d8d1061278b578e340361272157600180556102605180f35b608460405162461bcd60e51b815260206004820152603a60248201527f4d61726b6574706c6163653a20606d73672e76616c756560202620604d65737360448201527f61676556616c7565736020496e70757420496e636f72726563740000000000006064820152fd5b909192939495969798999a9b9c809e8d8f8e8e818f8f8f8f8f8f8f908f8f928f8d94928580948180948161018051916127c3926143b6565b359f6127ce926143b6565b359b6127d9926143b6565b35976127e4926143b6565b6127ed906143c6565b966127f7926143da565b936128039291936143da565b9490938b8b3399612813926143b6565b359661281e99614f18565b612827926143b6565b356128319161443d565b9d61283b90614378565b9c9b9a99989796959493929190509d9c9d612708565b608460405162461bcd60e51b8152602060048201526024808201527f4d61726b6574706c6163653a20496e636f7272656374204172726179204c656e60448201527f67746873000000000000000000000000000000000000000000000000000000006064820152fd5b508a86146126f1565b508588146126eb565b508787146126e5565b508689146126df565b50888a146126d9565b34610a57576020600319360112610a57576001600160a01b03612908613a5f565b166102605152600e602052602060ff6040610260512054166040519015158152f35b61293336613e2f565b909295939694612941614323565b849361294e333214614e6a565b866102605152600560205261296f6009604061026051200154421015614ecd565b33986001600160a01b038116613411575b50866102605152600660205260406102605120926009604051946129a386613b1e565b60ff8154161515865260018101546020870152600281015460408701526003810154606087015260048101546080870152600581015460a0870152600681015460c0870152600781015460e0870152600881015461010087015201546101208501528761026051526005602052604061026051209860405195612a2587613b3b565b612a2e8b614167565b87526001600160a01b0360018c01541660208801526001600160a01b0360028c015416604088015260038b01546060880152600b60048c01549b8c60808a0152600581015460a08a0152600681015460c08a0152600781015460e08a015260088101546101008a015260098101546101208a0152600a8101546101408a01520154610160880152612ac76102605199602088015161443d565b60608801518091116133f9575b5061010087015142116133915760e0870151421161314457612b09918a6102605152600960205260406102605120548d6146cd565b1561308e57612b2f9188610260515260096020526002604061026051200154848c614834565b1561304a57856102605152600a6020526102605160408120906001600160a01b038a169052602052612b6b84600260406102605120015461443d565b1161300657846102605152600a6020526102605160408120906001600160a01b038916905260205260406102605120612ba584825461443d565b9055846102605152600660205260036040610260512001612bc784825461443d565b90557fcbd36e4b86009c473bacdb97bc58ae30b265d96734b308ad24c36382379f94356102605180a15b612bff8360a0840151614562565b955b8311612f9c57612c18836020612c2493015161443d565b60608301511015615b67565b81151580612f93575b612c3690615b67565b843410612f4f57843411612eb1575b61014081015180612dc55750604001516001600160a01b031694853b15610a5757604051957fe0d92a76000000000000000000000000000000000000000000000000000000008752610260516004880152336024880152826044880152866064816102605180945af1948515612db7577fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9660a096612da8575b505b846102605152600660205260016040610260512001612d0184825461443d565b9055846102605152600660205260066040610260512001612d2384825461443d565b90558461026051526006602052612d456002604061026051200191825461443d565b9055836102605152600a6020526001600160a01b036040610260512091166000526020526002604060002001612d7c82825461443d565b9055604051928352336020840152604083015234606083015215156080820152a1600180556102605180f35b612db190613b58565b87612cdf565b6040513d61026051823e3d90fd5b939592949193600114612e01575b509160a093917fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9593612ce1565b610260515b848110612e135750612dd3565b60408281015161016084015191517f891407c000000000000000000000000000000000000000000000000000000000815233600482015260248101929092526102605160209183916044918391906001600160a01b03165af18015612db757612e86575b50612e8190614378565b612e06565b602090813d8311612eaa575b612e9c8183613bc2565b81010312610a575787612e77565b503d612e92565b612ebb85346145f6565b6102605180808084335af1612ece614603565b5015612f0b576040805133815260208101929092527fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065191a1612c45565b606460405162461bcd60e51b815260206004820152601a60248201527f4d61726b6574706c6163653a20526566756e64206661696c65640000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601260248201527f496e76616c69642045544820416d6f756e7400000000000000000000000000006044820152fd5b50841515612c2d565b608460405162461bcd60e51b815260206004820152603e60248201527f496e76616c6964204465736972656420507572636861736520416d6f756e742e60448201527f204d757374204265203c3d204d6178205075726368617365204c696d697400006064820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f416c6c2046756c6c2053657420416c6c6f636174696f6e2055736564000000006044820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642046756c6c2053657420416d6f756e742050726f6f660000006044820152fd5b60c460405162461bcd60e51b815260206004820152606760248201527f46756c6c205365742057696e646f773a204e6f7420456c696769626c6520466f60448201527f722050726573616c652057696e646f77204f7220426c6f636b2050656e64696e60648201527f672c20506c656173652054727920416761696e20496e2041204665772053656360848201527f6f6e64732e2e2e0000000000000000000000000000000000000000000000000060a4820152fd5b613164918a6102605152600960205260016040610260512001548d6146cd565b156132db5761318a9188610260515260096020526003604061026051200154848c614834565b1561329757856102605152600a6020526102605160408120906001600160a01b038a1690526020526131c684600160406102605120015461443d565b1161325357846102605152600a6020526102605160408120906001600160a01b03891690526020526002604061026051200161320384825461443d565b905584610260515260066020526004604061026051200161322584825461443d565b90557f77f1809049936567b54d52228d4d8a59319ce7e2d559dab971b18249c7195a0b6102605180a1612bf1565b606460405162461bcd60e51b815260206004820152601b60248201527f416c6c20436974697a656e20416c6c6f636174696f6e205573656400000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420436974697a656e20416d6f756e742050726f6f66000000006044820152fd5b60c460405162461bcd60e51b815260206004820152606660248201527f436974697a656e2057696e646f773a204e6f7420456c696769626c6520466f7260448201527f2050726573616c652057696e646f77204f7220426c6f636b2050656e64696e6760648201527f2c20506c656173652054727920416761696e20496e204120466577205365636f60848201527f6e64732e2e2e000000000000000000000000000000000000000000000000000060a4820152fd5b50505050509492506133a78260c0830151614562565b948461026051526006602052600560406102605120016133c884825461443d565b90556001937f5097e51fc343963a2820a2e342a74873349a82c853e17dca54fb14846bec0a436102605180a1612c01565b61340a9198506020870151906145f6565b968c612ad4565b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038b81166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115612db7576102605191613484575b501561298057985089612980565b6134a6915060203d6020116134ac575b61349e8183613bc2565b810190614eb5565b8b613476565b503d613494565b34610a57576060600319360112610a57576134cc613a75565b6004356102605152600d602052610260516001600160a01b036040822092169052602052610260516040812090604435905260205260206040610260512054604051908152f35b34610a57576040600319360112610a57576004356001600160a01b038116809103610a5757602435906135446142cb565b81151580613620575b156135dc576102605180809381935af1613565614603565b5015613572576102605180f35b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b504782111561354d565b34610a57576040600319360112610a5757613643613a75565b6004356102605152600a602052610260516001600160a01b036040822092169052602052606060406102605120805490600260018201549101549060405192835260208301526040820152f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a57576136c2903690600401613ccc565b90602435908111610a57576020916136e1613704923690600401613a9f565b91336102605152600e85526136ff60ff60406102605120541661444a565b61493f565b604051908152f35b34610a57576020600319360112610a57576001600160a01b0361372d613a5f565b6137356142cb565b166102605152600e60205261026051604081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905580f35b34610a575761377f36613aea565b90336102605152602092600e84526137a060ff60406102605120541661444a565b6102605152600483526102605190600c60408320019167ffffffffffffffff84116110ee57506137d08383614575565b906102605152610260519280842090845b8481106137ec578580f35b833583820155928101926001016137e1565b34610a57576020600319360112610a57576004356102605152600b60205260206040610260512054604051908152f35b34610a57576040600319360112610a5757613847613a75565b336102605152600e60205261386560ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b03600a604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a5757602080600319360112610a5757600435336102605152600e82526138e460ff60406102605120541661444a565b806102605152600b82526139086102605160408082205491600c86522054906145f6565b1561397857600c610d6692826102605152600b815261393661026051604080822054918585522054906145f6565b926102605152526040610260512061394f82825461443d565b90556102605180808093730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b6064826040519062461bcd60e51b82526004820152601f60248201527f4d61726b6574706c6163653a204e6f2045544820546f205769746864726177006044820152fd5b34610a57576139ca36613ad0565b9091336102605152600e6020526139ea60ff60406102605120541661444a565b610260515260096020526102605191604083209060018201555580f35b34613a5a576060600319360112613a5a57613a20613a5f565b60443567ffffffffffffffff8111613a5a57602091613a46613a50923690600401613a9f565b91602435906146cd565b6040519015158152f35b600080fd5b600435906001600160a01b0382168203613a5a57565b602435906001600160a01b0382168203613a5a57565b35906001600160a01b0382168203613a5a57565b9181601f84011215613a5a5782359167ffffffffffffffff8311613a5a576020808501948460051b010111613a5a57565b6003196060910112613a5a57600435906024359060443590565b906040600319830112613a5a57600435916024359067ffffffffffffffff8211613a5a57613b1a91600401613a9f565b9091565b610140810190811067ffffffffffffffff821117610a2857604052565b610180810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857604052565b610280810190811067ffffffffffffffff821117610a2857604052565b6102c0810190811067ffffffffffffffff821117610a2857604052565b6040810190811067ffffffffffffffff821117610a2857604052565b90601f601f19910116810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857601f01601f191660200190565b81601f82011215613a5a57803590613c1882613be5565b92613c266040519485613bc2565b82845260208383010111613a5a57816000926020809301838601378301015290565b67ffffffffffffffff8111610a285760051b60200190565b9291613c6b82613c48565b91613c796040519384613bc2565b829481845260208094019160051b8101928311613a5a57905b828210613c9f5750505050565b81358152908301908301613c92565b9080601f83011215613a5a57816020613cc993359101613c60565b90565b91906101c0928381830312613a5a5760405167ffffffffffffffff94810185811182821017610a285760405280948235818111613a5a5784613d0f918501613c01565b8252602090818401358284015260408401356040840152606084013560608401526080840135608084015260a084013560a084015260c084013560c084015260e084013560e08401526101008085013590840152610120613d71818601613a8b565b90840152610140613d83818601613a8b565b9084015261016080850135828111613a5a5786613da1918701613cae565b9084015261018080850135828111613a5a5786613dbf918701613cae565b908401526101a09384810135918211613a5a57019380601f86011215613a5a578435613dea81613c48565b95613df86040519788613bc2565b818752838088019260051b820101928311613a5a578301905b828210613e2057505050500152565b81358152908301908301613e11565b60c0600319820112613a5a576004359160243591604435916064356001600160a01b0381168103613a5a579167ffffffffffffffff91608435838111613a5a5782613e7c91600401613a9f565b9390939260a435918211613a5a57613b1a91600401613a9f565b6003196040910112613a5a576004359060243590565b91909161018081840312613a5a5760405190613ec782613b3b565b819381359067ffffffffffffffff8211613a5a57613ee6918301613c01565b8252613ef460208201613a8b565b6020830152613f0560408201613a8b565b6040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e083015261010080820135908301526101208082013590830152610140808201359083015261016080910135910152565b90815180825260208080930193019160005b828110613f89575050505090565b835185529381019392810192600101613f7b565b919082519283825260005b848110613fc9575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201613fa8565b906140c06140ac614098614084613ffd86516102c0808852870190613f9d565b6020870151602087015260408701516040870152606087015160608701526080870151608087015260a087015160a087015260c087015160c087015260e087015160e087015261010080880151908701526001600160a01b0361012081818a0151169088015261014090818901511690870152610160808801519087830390880152613f69565b610180808701519086830390870152613f69565b6101a0808601519085830390860152613f69565b6101c0808501519084830390850152613f69565b916101e080820151908301526102008082015190830152610220808201519083015261024080820151908301526102608082015190830152610280808201511515908301526102a080910151151591015290565b90600182811c9216801561415d575b602083101461412e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614123565b906040519182600082549261417b84614114565b9081845260019485811690816000146141ea57506001146141a7575b50506141a592500383613bc2565b565b9093915060005260209081600020936000915b8183106141d25750506141a593508201013880614197565b855488840185015294850194879450918301916141ba565b90506141a59550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013880614197565b80548210156142445760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b34613a5a576080600319360112613a5a576004356001600160a01b0381168103613a5a5760643567ffffffffffffffff8111613a5a576020916142bd613a50923690600401613a9f565b916044359060243590614834565b6001600160a01b036000541633036142df57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b600260015414614334576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60001981146143875760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156142445760051b0190565b356001600160a01b0381168103613a5a5790565b91908110156142445760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215613a5a57019081359167ffffffffffffffff8311613a5a576020018260051b36038113613a5a579190565b9190820180921161438757565b1561445157565b608460405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574706c616365207c206f6e6c7941646d696e207c2043616c6c657260448201527f204973204e6f742041646d696e000000000000000000000000000000000000006064820152fd5b8181106144c6575050565b600081556001016144bb565b156144d957565b606460405162461bcd60e51b815260206004820152601c60248201527f4d61726b6574706c6163653a2053616c65204e6f7420416374697665000000006044820152fd5b9061452782613c48565b6145346040519182613bc2565b828152601f196145448294613c48565b0190602036910137565b80518210156142445760209160051b010190565b8181029291811591840414171561438757565b680100000000000000008211610a285780549180825582811061459757505050565b60009182526020822092830192015b8281106145b257505050565b8181556001016145a6565b90680100000000000000008111610a28578154908083558181106145e057505050565b6141a592600052602060002091820191016144bb565b9190820391821161438757565b3d1561462e573d9061461482613be5565b916146226040519384613bc2565b82523d6000602084013e565b606090565b1561463a57565b606460405162461bcd60e51b815260206004820152602060248201527f4d61726b6574706c6163653a20455448205769746864726177204661696c65646044820152fd5b9060405191828154918282526020928383019160005283600020936000905b8282106146b3575050506141a592500383613bc2565b85548452600195860195889550938101939091019061469d565b613cc9939261471d916040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b1682526014815261471281613ba6565b519020933691613c60565b929091906000915b845183101561477257614738838661454e565b5190600082821015614760575060005260205261475a60406000205b92614378565b91614725565b60409161475a93825260205220614754565b915092501490565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b168252601481526147be81613ba6565b5190209360005b876000526008825282600020548110156148225760048252614803866147f183600b876000200161422c565b90549060031b1c61471d368989613c60565b6148155761481090614378565b6147c5565b9650505050505060019190565b505050505050905060009062010f2c90565b909392604051947fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602087019360601b168352603486015260348552606085019185831067ffffffffffffffff841117610a2857613cc99561471d93604052519020933691613c60565b604051906148ab82613b89565b816102a060609182815260009283602083015283604083015283818301528360808301528360a08301528360c08301528360e08301528361010083015283610120830152836101408301528061016083015280610180830152806101a08301526101c0820152826101e082015282610200820152826102208201528261024082015282610260820152826102808201520152565b9161016083019182515191610180850192818451518092149182614e60575b505015614df65760005b818110614d4d5750600392835495866000526004936020918583526040600020815194855167ffffffffffffffff96878211614c2e5781906149aa8554614114565b601f8111614d1d575b508790601f8311600114614ca757600092614c9c575b50506000198260011b928c1b1c19161782555b848301519960019a8b8401556040840151600284015560608401518a84015560808401518984015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840155600983016001600160a01b03908161012087015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600a8501916101408701511690825416179055600b8301905190815191888311614c6e578790614a9c8484614575565b0190600052866000208c60005b848110614c5c575050505050600c8201905190815191878311614c2e578690614ad28484614575565b0190600052856000208b60005b848110614c1c575050505050600d6101a0910191015190815191858311614bee578490614b0c84846145bd565b0190600052836000208960005b848110614bdc57505050505087600052600882526040600020928411614bae57614b4384846145bd565b9160005280600020908660005b858110614b9c575050505050508154928301809311614b6e57505590565b6011907f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b82853595019481850155018790614b50565b6041857f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b86845194019381840155018a90614b19565b6041887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b88845194019381840155018c90614adf565b60418a7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b89845194019381840155018d90614aa9565b60418b7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b0151905038806149c9565b92601f198d91169186600052896000209260005b8b828210614cfb57505094848060019710614ce0575b5050505050811b0182556149dc565b6000199260f8920151931b161c19169055388b818084614cd1565b91929596935093600182918786015181550195019301908e9295949391614cbb565b614d47908660005289600020601f850160051c8101918b86106110e457601f0160051c01906144bb565b386149b3565b606480614d5b8385876143b6565b35111580614de2575b15614d785750614d7390614378565b614968565b6084907f7374204265203c3d203130302026203e203000000000000000000000000000006040519162461bcd60e51b835260206004840152603260248401527f4d61726b6574706c6163653a20446973636f756e7420416d6f756e7473204d756044840152820152fd5b50614dee8284866143b6565b351515614d64565b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20416c6c204172726179204c656e67746873204d60448201527f757374204d6174636800000000000000000000000000000000000000000000006064820152fd5b149050813861495e565b15614e7157565b606460405162461bcd60e51b815260206004820152601560248201527f4d61726b6574706c6163653a20454f41204f6e6c7900000000000000000000006044820152fd5b90816020910312613a5a57518015158103613a5a5790565b15614ed457565b606460405162461bcd60e51b815260206004820152601d60248201527f4d61726b6574706c6163653a2053616c65204e6f7420537461727465640000006044820152fd5b989495979392919096976001600160a01b0396614f388888163214614e6a565b8693888116615aca575b50614f6c906000958c87526004602052614f656006604089200154421015614ecd565b858d61477a565b999015615a3d57614f9d918b86526004602052614f8f8b600c604089200161422c565b90549060031b1c8486614834565b156159ad5788835260046020526064614fe2614fc0896001604088200154614562565b8b86526008602052614fd58b6040882061422c565b90549060031b1c90614562565b04840361594357888352600d60205285604084209216918284526020526040832088845260205261501760408420548861443d565b116158d957878252600d60205260408220908252602052604081208682526020526040812061504786825461443d565b90555b868152600760205261506085604083205461443d565b878252600460205260056040832001541061586f57868152600760205261508b85604083205461443d565b8782526007602052604082205560046020526003806040832001549081156000146151c0575050868152600460205283600960408320015416803b156151bc576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602481018790529082908290604490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499979593608099979593615187936151a2575b505b888152600f602052818120868616825260205281812061517488825461443d565b9055888152600b6020522091825461443d565b905560405194855216602084015260408301526060820152a1565b6151ab90613b58565b38615151565b6040513d84823e3d90fd5b5080fd5b6001918083036152ae57505050805b85811061520b575091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b878252600460205260408220600886600983015416910154813b156152aa576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260248101919091529083908290604490829084905af1801561529f579061528b92916152905750614378565b6151cf565b61529990613b58565b386112f2565b6040513d85823e3d90fd5b8380fd5b6002810361537f57505050868152600460205260408120600485600983015416910154813b1561537b576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810191909152604481018790529082908290606490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795936080999795936151879361536c575b50615153565b61537590613b58565b38615366565b8280fd5b949897969594808203615488575082825b6153cc575b505050956080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499615153565b888452600460205260408420600d810190815483101561548157828860096153f7930154169261422c565b905490841b1c813b1561547d576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b038d1660048201526024810191909152604481018990529085908290606490829084905af18015615472579061546c92916152905750614378565b82615390565b6040513d87823e3d90fd5b8580fd5b5050615395565b929998939290506004810361559a57505085885260046020526004604089200154885b8581106154e9575050906080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999a615153565b878a52600460208181526040808d206009015490517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0388169381019390935260248301859052829060449082908f908b165af1801561558f57615560575b5061555b90614378565b6154ab565b602090813d8311615588575b6155768183613bc2565b810103126155845738615551565b8980fd5b503d61556c565b6040513d8d823e3d90fd5b6005819a939495969798999a146000146156a657505086815260046020526040812084600982015416600786600a8401541692015491835b88811061562c57505050509160809593916151876040858a7f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d49b999752600460205260078282200161562588825461443d565b9055615153565b615636818561443d565b833b1561547d57604051907f23b872dd00000000000000000000000000000000000000000000000000000000825283600483015289891660248301526044820152858160648183885af1801561569b579061569692916152905750614378565b6155d2565b6040513d88823e3d90fd5b60060361580557878252600460205260408220908560098301541690600883015492015482156157d8578290049189845260046020526004604085200154845b89811061572657505050505091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b855b83811061573e575061573990614378565b6156e6565b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602481018490526020816044818a8a5af180156157cd5761579e575b5061579990614378565b615728565b602090813d83116157c6575b6157b48183613bc2565b810103126157c2573861578f565b8680fd5b503d6157aa565b6040513d8a823e3d90fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20496e636f72726563742053616c6520436f6e6660448201527f696775726174696f6e00000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a204e6f7420456e6f756768204e465473204c656660448201527f7420466f722053616c65000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152604060248201527f4d61726b6574706c6163653a204465736972656420507572636861736520416d60448201527f6f756e74204578636565647320507572636861736520416c6c6f636174696f6e6064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a20496e636f7272656374204272696768744c697360448201527f74204554482053656e74000000000000000000000000000000000000000000006064820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b505050508681526004602052615a5a856001604084200154614562565b821461504a57608460405162461bcd60e51b815260206004820152602660248201527f4d61726b6574706c6163653a20496e636f72726563742045544820416d6f756e60448201527f742053656e7400000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115615b5b57600091615b3d575b5015614f42579350614f6c614f42565b615b55915060203d81116134ac5761349e8183613bc2565b38615b2d565b6040513d6000823e3d90fd5b15615b6e57565b606460405162461bcd60e51b815260206004820152600a60248201527f53616c6520456e646564000000000000000000000000000000000000000000006044820152fd5b9492959190969396615bc261489e565b5085600052600460205260406000209560056001880154970154906007602052615bf1604060002054836145f6565b9381600052600b60205260406000205493600f60205260406000206001600160a01b0382166000526020526040600020546104205260009760006103e052836000526004602052615c49600b6040600020015461451d565b9c60005b856000526004602052600b60406000200154811015615c9557808f6124d18f936064615c89615c90966008602052614fd584604060002061422c565b049261454e565b615c4d565b50615cad9192939495979a9d989b96999c848761477a565b9a90806103a052615e68575b5050505090600d9291600052600460205260406000209160028301546104005260038301549060048401549060068501546007860154916008870154936001600160a01b03600989015416956001600160a01b03600a8a01541697615d24604051806103c052613b89565b615d2d8a614167565b6103c0515260206103c05101526104005160406103c051015260606103c051015260806103c051015260a06103c051015260c06103c051015260e06103c05101526101006103c05101526101206103c05101526101406103c0510152615d95600b820161467e565b6101606103c0510152615daa600c820161467e565b6101806103c05101526040519081928391016020815493848152019060005260206000209260005b818110615e4f575050615de792500382613bc2565b6101a06103c05101526101c06103c05101526101e06103c05101526102006103c05101526102206103c05101526102406103c0510152610420516102606103c05101526103a05115156102806103c05101526103e05115156102a06103c05101526103c05190565b8454835260019485019486945060209093019201615dd2565b615e9491856000526004602052615e868c600c60406000200161422c565b90549060031b1c8585614834565b6103e05282600052600d6020526001600160a01b036040600020911660005260205260406000208860005260205260406000205490818111615ed8575b8080615cb9565b615ee39299506145f6565b963880615ed156fea26469706673582212200832c781463a02ce7cecfad20d2d917d7d42c61ef1e42bd17611136d9d474f5164736f6c63430008130033
Deployed Bytecode
0x610440604052600436101561001357600080fd5b60006102605260003560e01c80630404157314613a075780630a595192146139bc5780630ade686b146138b25780630c0d44751461382e57806312cb2565146137fe578063145e28701461377157806316ffa2e21461370c578063171459a61461369057806319f656861461362a5780631ae3b93a14613513578063228dd2b5146134b35780632dbef8e91461292a57806333b005d0146128e75780634314d55f146125f657806343fa0329146125915780634710a06c1461254a5780634852590e146123de5780634a850fbd146123975780634ab4e832146123325780634d1280e1146122eb5780634ec7a65b146120cd57806350fe6add1461206857806352d635f614611fdb57806358e2b34c14611fa95780635a23785d14611e865780635b80402814611e655780635fc99e3014611e215780636213195814611dbc5780636569f4c714611d8c578063665ccfaa14611d455780636915fed614611cfe5780636a95cc0814611cd2578063715018a614611c595780637826817d14611bf45780637b0c805614611b675780637bfd7f2214611add578063800c42d114611a595780638da5cb5b14611a305780639366ca6b146119c8578063953ba9ee146119635780639e05fd301461191c578063a038ad6e146118b7578063a297684314611869578063a761f7a1146117a5578063b7e96e6014611760578063ba0eebe41461173f578063bae24f91146116f8578063c4e5ae72146116b1578063c5f44dd41461165f578063cc557cab14611547578063cd5936cb146114e3578063d002ae641461148d578063d13091f91461142e578063d347ab2f1461135e578063d63fe42a14611317578063d93c9c4f1461111e578063e204591c14610db7578063e857270514610b6e578063ea0fd98514610d70578063ec38035414610d1a578063eef8959814610ccd578063f2fde38b14610bd8578063f3290bfe14610b73578063f7e8528a14610b6e578063f8a5bd2914610b27578063f8dec46d14610a8e578063fb61f5a914610a5e5763ff6014ba1461030f57600080fd5b34610a5757610100600319360112610a5757610329613a75565b60843567ffffffffffffffff8111610a5757610349903690600401613a9f565b60a49291923567ffffffffffffffff8111610a575761036c903690600401613a9f565b610120526103605260c43567ffffffffffffffff8111610a5757610394903690600401613a9f565b60805260e43567ffffffffffffffff8111610a57576103b7903690600401613a9f565b919060a0526040516103c881613b6c565b6102605181526102605160208201526102605160408201526102605160608201526102605160808201526102605160a08201526102605160c08201526102605160e08201526102605161010082015261026051610120820152610260516101408201526102605161016082015261026051610180820152610260516101a0820152610260516101c0820152610260516101e08201526102605161020082015261026051610220820152610260516102408201526102608051910152610260518061016052806101c05260043590526005602052600b604061026051206104b46040518061034052613b3b565b6104bd81614167565b61034051526001600160a01b0360018201541660206103405101526001600160a01b0360028201541660406103405101526003810154606061034051015260048101546080610340510152600581015460a0610340510152600681015460c0610340510152600781015460e061034051015260088101546101006103405101526009810154610120610340510152600a81015461014061034051015201546101606103405101526004356102605152600660205260096040610260512061058a6040518061010052613b1e565b60ff8154161515610100515260018101546020610100510152600281015460406101005101526003810154606061010051015260048101546080610100510152600581015460a0610100510152600681015460c0610100510152600781015460e061010051015260088101546101008051015201546101206101005101526004356102605152600a602052604061026051206001600160a01b038516600052602052604060002060405190816102005281606081011067ffffffffffffffff606084011117610a2857816060600293016040528154905260018101546020610200510152015460406102005101526107de61069460606103405101516020610100510151906145f6565b61010051604001516102205261020051519093906044358110610a13575061026051610160525b610200516020015160643581106109fe5750610260516101c0525b610340519560a08701516102405260c0870151610140526107b460608801519461075f60e08a0151986101206101008c01519b01519b604061020051805161038052602081015160c05260a06101005160608101516102a05260808101516102805201516103005201516101e052600435610260515260096020526040610260512054866146cd565b60e0526004356102605152600960205261078b61012051610360516001604061026051200154866146cd565b6102e0526004356102605152600960205260805190600260406102605120015460443585614834565b6102c0526004356102605152600960205260a0519060036040610260512001549060643590614834565b610320526107f2604051806101a052613b6c565b610220516101a051526102405160206101a05101526101405160406101a051015260606101a051015260806101a051015260a06101a051015260c06101a051015260e06101a0510152610160516101006101a05101526101c0516101206101a0510152610380516101406101a051015260c0516101606101a05101526102a0516101806101a0510152610280516101a080510152610300516101c06101a05101526101e0516101e06101a051015260e05115156102006101a05101526102e05115156102206101a05101526102c05115156102406101a05101526103205115156102606101a051015261028060405161022051815260206101a0510151602082015260406101a0510151604082015260606101a0510151606082015260806101a0510151608082015260a06101a051015160a082015260c06101a051015160c082015260e06101a051015160e08201526101006101a05101516101008201526101206101a05101516101208201526101406101a05101516101408201526101606101a05101516101608201526101806101a05101516101808201526101a0805101516101a08201526101c06101a05101516101c08201526101e06101a05101516101e08201526102006101a051015115156102008201526102206101a051015115156102208201526102406101a051015115156102408201526102606101a05101511515610260820152f35b610a0a906064356145f6565b6101c0526106d6565b610a1f906044356145f6565b610160526106bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6102605180fd5b34610a57576020600319360112610a57576004356102605152600760205260206040610260512054604051908152f35b34610a57576020600319360112610a5757600435610260515260066020526101406040610260512060ff8154169060018101549060028101546003820154600483015460058401549060068501549260078601549460096008880154970154976040519915158a5260208a015260408901526060880152608087015260a086015260c085015260e0840152610100830152610120820152f35b34610a5757610b3536613e96565b90336102605152600e602052610b5460ff60406102605120541661444a565b610260515260046020526102605190600360408320015580f35b614273565b34610a5757610b8136613e96565b90336102605152600e602052610ba060ff60406102605120541661444a565b8061026051526006602052610bbe60ff6040610260512054166144d2565b610260515260056020526102605190600760408320015580f35b34610a57576020600319360112610a5757610bf1613a5f565b610bf96142cb565b6001600160a01b03809116908115610c6357600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36102605180f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b34610a57576040600319360112610a5757610ce6613a75565b6004356102605152600f6020526001600160a01b036040610260512091166000526020526020604060002054604051908152f35b34610a57576102605180600319360112610d6d57610d366142cb565b610d666102605180808047730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b50614633565b6102605180f35b80fd5b34610a5757610d7e36613e96565b90336102605152600e602052610d9d60ff60406102605120541661444a565b610260515260056020526102605190600b60408320015580f35b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757610de9903690600401613eac565b9060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610a5757604051916080830183811083821117610a28576040526024358352604435602084015260643560408401526084356060840152336102605152600e602052610e6560ff60406102605120541661444a565b600254610260515260056020526102605191604083209282519081519283116110ee5750610e938454614114565b601f81116110ad575b50610260519084602092601f851160011461103e5750509180600b9492610160946102605192611033575b50506000198260011b9260031b1c19161784555b600184016001600160a01b039081602084015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a850155015191015560025461026051526006602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556002549052600960205260036060604061026051209280518455602081015160018501556040810151600285015501519101556110296002547fa78c547613f6306e7a70d1bd161c18a496cae1eeb8d4f9e58b60d69ad72ddf586020604051838152a1614378565b6002556102605180f35b015190508780610ec7565b5261026051602081209291905b601f1985168110611095575092600b94926001926101609583601f1981161061107c575b505050811b018455610edb565b015160001960f88460031b161c1916905587808061106f565b9192602060018192868501518155019401920161104b565b6110de9085610260515260206102605120601f850160051c810191602086106110e4575b601f0160051c01906144bb565b85610e9c565b90915081906110d1565b7f4e487b710000000000000000000000000000000000000000000000000000000090526041600452602461026051fd5b34610a575760a0600319360112610a575767ffffffffffffffff600435818111610a5757611150903690600401613a9f565b91602435818111610a5757611169903690600401613a9f565b604435838111610a5757611181903690600401613a9f565b919093606435818111610a575761119c903690600401613a9f565b9091608435908111610a57576111b6903690600401613a9f565b9490936111c28a613c48565b996111d06040519b8c613bc2565b808b52601f196111df82613c48565b01610260515b8181106112ff5750508a610260515b82811061127d575060405160209182820192808352815180945260408301938160408260051b86010193019161026051955b8287106112335785850386f35b90919293828061126d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a600196030186528851613fdd565b9601920196019592919092611226565b6112f2816112f8936112e28f8f908f908f908f908f908f8f8f8f926112cb8d6112d2946112c56112c0838099976112b982809a6112da9e6143b6565b359f6143b6565b6143c6565b9c6143b6565b35956143da565b9590946143da565b959094615bb2565b6112ec838361454e565b5261454e565b50614378565b8b906111f4565b808d6020809361130d61489e565b92010152016111e5565b34610a575761132536613e96565b90336102605152600e60205261134460ff60406102605120541661444a565b610260515260046020526102605190600260408320015580f35b34610a57576020600319360112610a5757600435610260515260056020526113ee6040610260512061138f81614167565b906001600160a01b03908160018201541691600282015416906003810154600482015460058301546006840154600785015491600886015493600987015495600b600a890154980154986040519c8d9c8d610180908181520190613f9d565b9a60208d015260408c015260608b015260808a015260a089015260c088015260e08701526101008601526101208501526101408401526101608301520390f35b34610a57576080600319360112610a5757336102605152600e60205261145d60ff60406102605120541661444a565b60043561026051526005602052610260516040812060243560098201556044356007820155600860643591015580f35b34610a57576060600319360112610a57576114a6613a75565b60443567ffffffffffffffff8111610a57576040916114cc6114d5923690600401613a9f565b9160043561477a565b825191151582526020820152f35b34610a575760a0600319360112610a5757336102605152600e60205261151260ff60406102605120541661444a565b600435610260515260096020526102605160408120602435815560643560018201556044356002820155600360843591015580f35b34610a57576060600319360112610a575767ffffffffffffffff600435602435828111610a575761157c903690600401613a9f565b9290604435828111610a5757611596903690600401613a9f565b939091336102605152602095600e87526115b960ff60406102605120541661444a565b826102605152600487526102605191600b6040842001928683116110ee57506115e28284614575565b9161026051526102605191878320835b83811061164d5750505050526004845261026051600c60408220019284116110ee575061161f8383614575565b906102605152610260519280842090845b84811061163b578580f35b83358382015592810192600101611630565b823582820155918901916001016115f2565b34610a57576020600319360112610a5757600435610260515260096020526080604061026051208054906001810154906003600282015491015491604051938452602084015260408301526060820152f35b34610a57576116bf36613e96565b90336102605152600e6020526116de60ff60406102605120541661444a565b610260515260046020526102605190600660408320015580f35b34610a575761170636613e96565b90336102605152600e60205261172560ff60406102605120541661444a565b610260515260046020526102605190600560408320015580f35b34610a57576102605180600319360112610d6d576020600354604051908152f35b34610a575761176e36613e96565b90610260515260086020526102605160408120908154831015610d6d576020611797848461422c565b90546040519160031b1c8152f35b34610a57576020600319360112610a57576004356102605152600460205261182f604061026051206117d681614167565b906001810154906002810154906003810154600482015460058301546006840154906007850154926008860154946001600160a01b03600a8160098a01541698015416976040519b8c9b8c6101608091528d0190613f9d565b9960208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301520390f35b34610a575761187736613ad0565b9091336102605152600e60205261189760ff60406102605120541661444a565b610260515260096020526002610260519260408420906003820155015580f35b34610a57576118c536613e96565b90336102605152600e6020526118e460ff60406102605120541661444a565b806102605152600660205261190260ff6040610260512054166144d2565b610260515260056020526102605190600660408320015580f35b34610a575761192a36613e96565b90336102605152600e60205261194960ff60406102605120541661444a565b610260515260046020526102605190600760408320015580f35b34610a575761197136613e96565b90336102605152600e60205261199060ff60406102605120541661444a565b80610260515260066020526119ae60ff6040610260512054166144d2565b610260515260056020526102605190600360408320015580f35b34610a57576020600319360112610a57576001600160a01b036119e9613a5f565b6119f16142cb565b166102605152600e602052610260516040812060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905580f35b34610a57576102605180600319360112610d6d576001600160a01b036020915416604051908152f35b34610a57576040600319360112610a5757611a72613a75565b336102605152600e602052611a9060ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b036009604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a575760a0600319360112610a5757611af6613a75565b67ffffffffffffffff606435818111610a5757611b17903690600401613a9f565b92608435928311610a5757611b6393611b37611b4f943690600401613a9f565b939092611b4261489e565b5060443590600435615bb2565b604051918291602083526020830190613fdd565b0390f35b34610a5757611b7536613aea565b90336102605152602092600e8452611b9660ff60406102605120541661444a565b6102605152600483526102605190600d60408320019167ffffffffffffffff84116110ee5750611bc683836145bd565b906102605152610260519280842090845b848110611be2578580f35b83358382015592810192600101611bd7565b34610a5757611c0236613e96565b90336102605152600e602052611c2160ff60406102605120541661444a565b8061026051526006602052611c3f60ff6040610260512054166144d2565b610260515260056020526102605190600460408320015580f35b34610a57576102605180600319360112610d6d57611c756142cb565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a36102605180f35b34610a57576102605180600319360112610d6d5760206040516d76a84fef008cdabe6409d2fe638b8152f35b34610a5757611d0c36613e96565b90336102605152600e602052611d2b60ff60406102605120541661444a565b610260515260046020526102605190600860408320015580f35b34610a5757611d5336613e96565b90336102605152600e602052611d7260ff60406102605120541661444a565b610260515260046020526102605190600160408320015580f35b34610a57576020600319360112610a57576004356102605152600c60205260206040610260512054604051908152f35b34610a57576020600319360112610a575760043561026051526004602052611e1360406102605120611b63611dff600c611df8600b850161467e565b930161467e565b604051938493604085526040850190613f69565b908382036020850152613f69565b34610a5757611e2f36613e96565b90336102605152600e602052611e4e60ff60406102605120541661444a565b610260515260096020526102605190604082205580f35b34610a57576102605180600319360112610d6d576020600254604051908152f35b34610a5757611e9436613aea565b90336102605152602092600e8452611eb560ff60406102605120541661444a565b610260515b838110611f1d57506102605152600883526102605190604082209167ffffffffffffffff84116110ee5750611eef83836145bd565b906102605152610260519280842090845b848110611f0b578580f35b83358382015592810192600101611f00565b606480611f2b8387876143b6565b3511611f405750611f3b90614378565b611eba565b857f6f756e74730000000000000000000000000000000000000000000000000000006084926040519262461bcd60e51b84526004840152602560248401527f4d61726b6574706c6163653a20496e76616c696420446973636f756e7420416d6044840152820152fd5b611fd0611fb536613e2f565b94611fc7979697949194939293614323565b33973497614f18565b600180556102605180f35b34610a5757611fe936613aea565b90336102605152602092600e845261200a60ff60406102605120541661444a565b6102605152600483526102605190600b60408320019167ffffffffffffffff84116110ee575061203a8383614575565b906102605152610260519280842090845b848110612056578580f35b8335838201559281019260010161204b565b34610a575761207636613e96565b90336102605152600e60205261209560ff60406102605120541661444a565b80610260515260066020526120b360ff6040610260512054166144d2565b610260515260056020526102605190600560408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff602435818111610a57576120ff903690600401613eac565b3361026051526020600e815261211e60ff60406102605120541661444a565b6004356102605152600581526102605192604084209383519081519283116110ee575061214b8554614114565b601f81116122b7575b5061026051908391601f8411600114612249575091806101609492600b9694610260519261223e575b50506000198260011b9260031b1c19161785555b600185016001600160a01b03809284015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c0810151600685015560e0810151600785015561010081015160088501556101208101516009850155610140810151600a85015501519101556102605180f35b01519050878061217d565b919086601f19851693526102605192858420935b8181106122a05750926001928592600b9896610160989610612287575b505050811b018555612191565b015160001960f88460031b161c1916905587808061227a565b92938660018192878601518155019501930161225d565b6122e590866102605152846102605120601f850160051c8101918686106110e457601f0160051c01906144bb565b85612154565b34610a57576122f936613e96565b90336102605152600e60205261231860ff60406102605120541661444a565b610260515260096020526102605190600360408320015580f35b34610a575761234036613e96565b90336102605152600e60205261235f60ff60406102605120541661444a565b806102605152600660205261237d60ff6040610260512054166144d2565b610260515260056020526102605190600860408320015580f35b34610a57576123a536613e96565b90336102605152600e6020526123c460ff60406102605120541661444a565b610260515260046020526102605190600460408320015580f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a575736602382011215610a575780600401359161241c83613c48565b9261242a6040519485613bc2565b8084526020928385016024809360051b83010191368311610a5757838101915b838310612524575050505035908111610a575761246b903690600401613a9f565b929092336102605152600e835261248b60ff60406102605120541661444a565b612495825161451d565b91610260515b81518110156124dc57806124c76124b56124d7938561454e565b516124c183878b6143da565b9161493f565b6124d1828761454e565b52614378565b61249b565b5050509060405191818392830181845282518091528160408501930191610260515b82811061250d57505050500390f35b8351855286955093810193928101926001016124fe565b8235868111610a5757879161253f8392883691870101613ccc565b81520192019161244a565b34610a575761255836613e96565b90336102605152600e60205261257760ff60406102605120541661444a565b610260515260056020526102605190600a60408320015580f35b34610a575761259f36613e96565b90336102605152600e6020526125be60ff60406102605120541661444a565b80610260515260066020526125dc60ff6040610260512054166144d2565b610260515260056020526102605190600960408320015580f35b60e0600319360112610a575767ffffffffffffffff600435818111610a5757612623903690600401613a9f565b919061018052602435818111610a5757612641903690600401613a9f565b604435838111610a5757612659903690600401613a9f565b606492919235858111610a5757612674903690600401613a9f565b608435878111610a575761268c903690600401613a9f565b9260a435898111610a57576126a5903690600401613a9f565b92909160c4359a8b11610a57576126c18c9b3690600401613a9f565b99909a6126cc614323565b89610260519d14806128de575b806128d5575b806128cc575b806128c3575b806128ba575b156128515799979593918d9b9997959391610260519b5b8d8d1061278b578e340361272157600180556102605180f35b608460405162461bcd60e51b815260206004820152603a60248201527f4d61726b6574706c6163653a20606d73672e76616c756560202620604d65737360448201527f61676556616c7565736020496e70757420496e636f72726563740000000000006064820152fd5b909192939495969798999a9b9c809e8d8f8e8e818f8f8f8f8f8f8f908f8f928f8d94928580948180948161018051916127c3926143b6565b359f6127ce926143b6565b359b6127d9926143b6565b35976127e4926143b6565b6127ed906143c6565b966127f7926143da565b936128039291936143da565b9490938b8b3399612813926143b6565b359661281e99614f18565b612827926143b6565b356128319161443d565b9d61283b90614378565b9c9b9a99989796959493929190509d9c9d612708565b608460405162461bcd60e51b8152602060048201526024808201527f4d61726b6574706c6163653a20496e636f7272656374204172726179204c656e60448201527f67746873000000000000000000000000000000000000000000000000000000006064820152fd5b508a86146126f1565b508588146126eb565b508787146126e5565b508689146126df565b50888a146126d9565b34610a57576020600319360112610a57576001600160a01b03612908613a5f565b166102605152600e602052602060ff6040610260512054166040519015158152f35b61293336613e2f565b909295939694612941614323565b849361294e333214614e6a565b866102605152600560205261296f6009604061026051200154421015614ecd565b33986001600160a01b038116613411575b50866102605152600660205260406102605120926009604051946129a386613b1e565b60ff8154161515865260018101546020870152600281015460408701526003810154606087015260048101546080870152600581015460a0870152600681015460c0870152600781015460e0870152600881015461010087015201546101208501528761026051526005602052604061026051209860405195612a2587613b3b565b612a2e8b614167565b87526001600160a01b0360018c01541660208801526001600160a01b0360028c015416604088015260038b01546060880152600b60048c01549b8c60808a0152600581015460a08a0152600681015460c08a0152600781015460e08a015260088101546101008a015260098101546101208a0152600a8101546101408a01520154610160880152612ac76102605199602088015161443d565b60608801518091116133f9575b5061010087015142116133915760e0870151421161314457612b09918a6102605152600960205260406102605120548d6146cd565b1561308e57612b2f9188610260515260096020526002604061026051200154848c614834565b1561304a57856102605152600a6020526102605160408120906001600160a01b038a169052602052612b6b84600260406102605120015461443d565b1161300657846102605152600a6020526102605160408120906001600160a01b038916905260205260406102605120612ba584825461443d565b9055846102605152600660205260036040610260512001612bc784825461443d565b90557fcbd36e4b86009c473bacdb97bc58ae30b265d96734b308ad24c36382379f94356102605180a15b612bff8360a0840151614562565b955b8311612f9c57612c18836020612c2493015161443d565b60608301511015615b67565b81151580612f93575b612c3690615b67565b843410612f4f57843411612eb1575b61014081015180612dc55750604001516001600160a01b031694853b15610a5757604051957fe0d92a76000000000000000000000000000000000000000000000000000000008752610260516004880152336024880152826044880152866064816102605180945af1948515612db7577fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9660a096612da8575b505b846102605152600660205260016040610260512001612d0184825461443d565b9055846102605152600660205260066040610260512001612d2384825461443d565b90558461026051526006602052612d456002604061026051200191825461443d565b9055836102605152600a6020526001600160a01b036040610260512091166000526020526002604060002001612d7c82825461443d565b9055604051928352336020840152604083015234606083015215156080820152a1600180556102605180f35b612db190613b58565b87612cdf565b6040513d61026051823e3d90fd5b939592949193600114612e01575b509160a093917fd5d459cc9b45dfab2f92481f9ea36d39dde808a205e3a267e0ceff084ac80a0a9593612ce1565b610260515b848110612e135750612dd3565b60408281015161016084015191517f891407c000000000000000000000000000000000000000000000000000000000815233600482015260248101929092526102605160209183916044918391906001600160a01b03165af18015612db757612e86575b50612e8190614378565b612e06565b602090813d8311612eaa575b612e9c8183613bc2565b81010312610a575787612e77565b503d612e92565b612ebb85346145f6565b6102605180808084335af1612ece614603565b5015612f0b576040805133815260208101929092527fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065191a1612c45565b606460405162461bcd60e51b815260206004820152601a60248201527f4d61726b6574706c6163653a20526566756e64206661696c65640000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601260248201527f496e76616c69642045544820416d6f756e7400000000000000000000000000006044820152fd5b50841515612c2d565b608460405162461bcd60e51b815260206004820152603e60248201527f496e76616c6964204465736972656420507572636861736520416d6f756e742e60448201527f204d757374204265203c3d204d6178205075726368617365204c696d697400006064820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f416c6c2046756c6c2053657420416c6c6f636174696f6e2055736564000000006044820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642046756c6c2053657420416d6f756e742050726f6f660000006044820152fd5b60c460405162461bcd60e51b815260206004820152606760248201527f46756c6c205365742057696e646f773a204e6f7420456c696769626c6520466f60448201527f722050726573616c652057696e646f77204f7220426c6f636b2050656e64696e60648201527f672c20506c656173652054727920416761696e20496e2041204665772053656360848201527f6f6e64732e2e2e0000000000000000000000000000000000000000000000000060a4820152fd5b613164918a6102605152600960205260016040610260512001548d6146cd565b156132db5761318a9188610260515260096020526003604061026051200154848c614834565b1561329757856102605152600a6020526102605160408120906001600160a01b038a1690526020526131c684600160406102605120015461443d565b1161325357846102605152600a6020526102605160408120906001600160a01b03891690526020526002604061026051200161320384825461443d565b905584610260515260066020526004604061026051200161322584825461443d565b90557f77f1809049936567b54d52228d4d8a59319ce7e2d559dab971b18249c7195a0b6102605180a1612bf1565b606460405162461bcd60e51b815260206004820152601b60248201527f416c6c20436974697a656e20416c6c6f636174696f6e205573656400000000006044820152fd5b606460405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420436974697a656e20416d6f756e742050726f6f66000000006044820152fd5b60c460405162461bcd60e51b815260206004820152606660248201527f436974697a656e2057696e646f773a204e6f7420456c696769626c6520466f7260448201527f2050726573616c652057696e646f77204f7220426c6f636b2050656e64696e6760648201527f2c20506c656173652054727920416761696e20496e204120466577205365636f60848201527f6e64732e2e2e000000000000000000000000000000000000000000000000000060a4820152fd5b50505050509492506133a78260c0830151614562565b948461026051526006602052600560406102605120016133c884825461443d565b90556001937f5097e51fc343963a2820a2e342a74873349a82c853e17dca54fb14846bec0a436102605180a1612c01565b61340a9198506020870151906145f6565b968c612ad4565b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038b81166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115612db7576102605191613484575b501561298057985089612980565b6134a6915060203d6020116134ac575b61349e8183613bc2565b810190614eb5565b8b613476565b503d613494565b34610a57576060600319360112610a57576134cc613a75565b6004356102605152600d602052610260516001600160a01b036040822092169052602052610260516040812090604435905260205260206040610260512054604051908152f35b34610a57576040600319360112610a57576004356001600160a01b038116809103610a5757602435906135446142cb565b81151580613620575b156135dc576102605180809381935af1613565614603565b5015613572576102605180f35b608460405162461bcd60e51b815260206004820152602f60248201527f556e61626c6520746f2057697468647261772c20526563697069656e74204d6160448201527f79204861766520526576657274656400000000000000000000000000000000006064820152fd5b606460405162461bcd60e51b815260206004820152600e60248201527f496e76616c696420416d6f756e740000000000000000000000000000000000006044820152fd5b504782111561354d565b34610a57576040600319360112610a5757613643613a75565b6004356102605152600a602052610260516001600160a01b036040822092169052602052606060406102605120805490600260018201549101549060405192835260208301526040820152f35b34610a57576040600319360112610a575767ffffffffffffffff600435818111610a57576136c2903690600401613ccc565b90602435908111610a57576020916136e1613704923690600401613a9f565b91336102605152600e85526136ff60ff60406102605120541661444a565b61493f565b604051908152f35b34610a57576020600319360112610a57576001600160a01b0361372d613a5f565b6137356142cb565b166102605152600e60205261026051604081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905580f35b34610a575761377f36613aea565b90336102605152602092600e84526137a060ff60406102605120541661444a565b6102605152600483526102605190600c60408320019167ffffffffffffffff84116110ee57506137d08383614575565b906102605152610260519280842090845b8481106137ec578580f35b833583820155928101926001016137e1565b34610a57576020600319360112610a57576004356102605152600b60205260206040610260512054604051908152f35b34610a57576040600319360112610a5757613847613a75565b336102605152600e60205261386560ff60406102605120541661444a565b6004356102605152600460205261026051906001600160a01b03600a604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b34610a5757602080600319360112610a5757600435336102605152600e82526138e460ff60406102605120541661444a565b806102605152600b82526139086102605160408082205491600c86522054906145f6565b1561397857600c610d6692826102605152600b815261393661026051604080822054918585522054906145f6565b926102605152526040610260512061394f82825461443d565b90556102605180808093730bc56e3c1397e4570069e89c07936a5c6020e3be5af1610d60614603565b6064826040519062461bcd60e51b82526004820152601f60248201527f4d61726b6574706c6163653a204e6f2045544820546f205769746864726177006044820152fd5b34610a57576139ca36613ad0565b9091336102605152600e6020526139ea60ff60406102605120541661444a565b610260515260096020526102605191604083209060018201555580f35b34613a5a576060600319360112613a5a57613a20613a5f565b60443567ffffffffffffffff8111613a5a57602091613a46613a50923690600401613a9f565b91602435906146cd565b6040519015158152f35b600080fd5b600435906001600160a01b0382168203613a5a57565b602435906001600160a01b0382168203613a5a57565b35906001600160a01b0382168203613a5a57565b9181601f84011215613a5a5782359167ffffffffffffffff8311613a5a576020808501948460051b010111613a5a57565b6003196060910112613a5a57600435906024359060443590565b906040600319830112613a5a57600435916024359067ffffffffffffffff8211613a5a57613b1a91600401613a9f565b9091565b610140810190811067ffffffffffffffff821117610a2857604052565b610180810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857604052565b610280810190811067ffffffffffffffff821117610a2857604052565b6102c0810190811067ffffffffffffffff821117610a2857604052565b6040810190811067ffffffffffffffff821117610a2857604052565b90601f601f19910116810190811067ffffffffffffffff821117610a2857604052565b67ffffffffffffffff8111610a2857601f01601f191660200190565b81601f82011215613a5a57803590613c1882613be5565b92613c266040519485613bc2565b82845260208383010111613a5a57816000926020809301838601378301015290565b67ffffffffffffffff8111610a285760051b60200190565b9291613c6b82613c48565b91613c796040519384613bc2565b829481845260208094019160051b8101928311613a5a57905b828210613c9f5750505050565b81358152908301908301613c92565b9080601f83011215613a5a57816020613cc993359101613c60565b90565b91906101c0928381830312613a5a5760405167ffffffffffffffff94810185811182821017610a285760405280948235818111613a5a5784613d0f918501613c01565b8252602090818401358284015260408401356040840152606084013560608401526080840135608084015260a084013560a084015260c084013560c084015260e084013560e08401526101008085013590840152610120613d71818601613a8b565b90840152610140613d83818601613a8b565b9084015261016080850135828111613a5a5786613da1918701613cae565b9084015261018080850135828111613a5a5786613dbf918701613cae565b908401526101a09384810135918211613a5a57019380601f86011215613a5a578435613dea81613c48565b95613df86040519788613bc2565b818752838088019260051b820101928311613a5a578301905b828210613e2057505050500152565b81358152908301908301613e11565b60c0600319820112613a5a576004359160243591604435916064356001600160a01b0381168103613a5a579167ffffffffffffffff91608435838111613a5a5782613e7c91600401613a9f565b9390939260a435918211613a5a57613b1a91600401613a9f565b6003196040910112613a5a576004359060243590565b91909161018081840312613a5a5760405190613ec782613b3b565b819381359067ffffffffffffffff8211613a5a57613ee6918301613c01565b8252613ef460208201613a8b565b6020830152613f0560408201613a8b565b6040830152606081013560608301526080810135608083015260a081013560a083015260c081013560c083015260e081013560e083015261010080820135908301526101208082013590830152610140808201359083015261016080910135910152565b90815180825260208080930193019160005b828110613f89575050505090565b835185529381019392810192600101613f7b565b919082519283825260005b848110613fc9575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201613fa8565b906140c06140ac614098614084613ffd86516102c0808852870190613f9d565b6020870151602087015260408701516040870152606087015160608701526080870151608087015260a087015160a087015260c087015160c087015260e087015160e087015261010080880151908701526001600160a01b0361012081818a0151169088015261014090818901511690870152610160808801519087830390880152613f69565b610180808701519086830390870152613f69565b6101a0808601519085830390860152613f69565b6101c0808501519084830390850152613f69565b916101e080820151908301526102008082015190830152610220808201519083015261024080820151908301526102608082015190830152610280808201511515908301526102a080910151151591015290565b90600182811c9216801561415d575b602083101461412e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691614123565b906040519182600082549261417b84614114565b9081845260019485811690816000146141ea57506001146141a7575b50506141a592500383613bc2565b565b9093915060005260209081600020936000915b8183106141d25750506141a593508201013880614197565b855488840185015294850194879450918301916141ba565b90506141a59550602093507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013880614197565b80548210156142445760005260206000200190600090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b34613a5a576080600319360112613a5a576004356001600160a01b0381168103613a5a5760643567ffffffffffffffff8111613a5a576020916142bd613a50923690600401613a9f565b916044359060243590614834565b6001600160a01b036000541633036142df57565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b600260015414614334576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b60001981146143875760010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908110156142445760051b0190565b356001600160a01b0381168103613a5a5790565b91908110156142445760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215613a5a57019081359167ffffffffffffffff8311613a5a576020018260051b36038113613a5a579190565b9190820180921161438757565b1561445157565b608460405162461bcd60e51b815260206004820152602d60248201527f4d61726b6574706c616365207c206f6e6c7941646d696e207c2043616c6c657260448201527f204973204e6f742041646d696e000000000000000000000000000000000000006064820152fd5b8181106144c6575050565b600081556001016144bb565b156144d957565b606460405162461bcd60e51b815260206004820152601c60248201527f4d61726b6574706c6163653a2053616c65204e6f7420416374697665000000006044820152fd5b9061452782613c48565b6145346040519182613bc2565b828152601f196145448294613c48565b0190602036910137565b80518210156142445760209160051b010190565b8181029291811591840414171561438757565b680100000000000000008211610a285780549180825582811061459757505050565b60009182526020822092830192015b8281106145b257505050565b8181556001016145a6565b90680100000000000000008111610a28578154908083558181106145e057505050565b6141a592600052602060002091820191016144bb565b9190820391821161438757565b3d1561462e573d9061461482613be5565b916146226040519384613bc2565b82523d6000602084013e565b606090565b1561463a57565b606460405162461bcd60e51b815260206004820152602060248201527f4d61726b6574706c6163653a20455448205769746864726177204661696c65646044820152fd5b9060405191828154918282526020928383019160005283600020936000905b8282106146b3575050506141a592500383613bc2565b85548452600195860195889550938101939091019061469d565b613cc9939261471d916040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602082019260601b1682526014815261471281613ba6565b519020933691613c60565b929091906000915b845183101561477257614738838661454e565b5190600082821015614760575060005260205261475a60406000205b92614378565b91614725565b60409161475a93825260205220614754565b915092501490565b9392909160408051936020947fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008682019260601b168252601481526147be81613ba6565b5190209360005b876000526008825282600020548110156148225760048252614803866147f183600b876000200161422c565b90549060031b1c61471d368989613c60565b6148155761481090614378565b6147c5565b9650505050505060019190565b505050505050905060009062010f2c90565b909392604051947fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602087019360601b168352603486015260348552606085019185831067ffffffffffffffff841117610a2857613cc99561471d93604052519020933691613c60565b604051906148ab82613b89565b816102a060609182815260009283602083015283604083015283818301528360808301528360a08301528360c08301528360e08301528361010083015283610120830152836101408301528061016083015280610180830152806101a08301526101c0820152826101e082015282610200820152826102208201528261024082015282610260820152826102808201520152565b9161016083019182515191610180850192818451518092149182614e60575b505015614df65760005b818110614d4d5750600392835495866000526004936020918583526040600020815194855167ffffffffffffffff96878211614c2e5781906149aa8554614114565b601f8111614d1d575b508790601f8311600114614ca757600092614c9c575b50506000198260011b928c1b1c19161782555b848301519960019a8b8401556040840151600284015560608401518a84015560808401518984015560a0840151600584015560c0840151600684015560e084015160078401556101008401516008840155600983016001600160a01b03908161012087015116907fffffffffffffffffffffffff00000000000000000000000000000000000000009182825416179055600a8501916101408701511690825416179055600b8301905190815191888311614c6e578790614a9c8484614575565b0190600052866000208c60005b848110614c5c575050505050600c8201905190815191878311614c2e578690614ad28484614575565b0190600052856000208b60005b848110614c1c575050505050600d6101a0910191015190815191858311614bee578490614b0c84846145bd565b0190600052836000208960005b848110614bdc57505050505087600052600882526040600020928411614bae57614b4384846145bd565b9160005280600020908660005b858110614b9c575050505050508154928301809311614b6e57505590565b6011907f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b82853595019481850155018790614b50565b6041857f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b86845194019381840155018a90614b19565b6041887f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b88845194019381840155018c90614adf565b60418a7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b89845194019381840155018d90614aa9565b60418b7f4e487b71000000000000000000000000000000000000000000000000000000006000525260246000fd5b0151905038806149c9565b92601f198d91169186600052896000209260005b8b828210614cfb57505094848060019710614ce0575b5050505050811b0182556149dc565b6000199260f8920151931b161c19169055388b818084614cd1565b91929596935093600182918786015181550195019301908e9295949391614cbb565b614d47908660005289600020601f850160051c8101918b86106110e457601f0160051c01906144bb565b386149b3565b606480614d5b8385876143b6565b35111580614de2575b15614d785750614d7390614378565b614968565b6084907f7374204265203c3d203130302026203e203000000000000000000000000000006040519162461bcd60e51b835260206004840152603260248401527f4d61726b6574706c6163653a20446973636f756e7420416d6f756e7473204d756044840152820152fd5b50614dee8284866143b6565b351515614d64565b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20416c6c204172726179204c656e67746873204d60448201527f757374204d6174636800000000000000000000000000000000000000000000006064820152fd5b149050813861495e565b15614e7157565b606460405162461bcd60e51b815260206004820152601560248201527f4d61726b6574706c6163653a20454f41204f6e6c7900000000000000000000006044820152fd5b90816020910312613a5a57518015158103613a5a5790565b15614ed457565b606460405162461bcd60e51b815260206004820152601d60248201527f4d61726b6574706c6163653a2053616c65204e6f7420537461727465640000006044820152fd5b989495979392919096976001600160a01b0396614f388888163214614e6a565b8693888116615aca575b50614f6c906000958c87526004602052614f656006604089200154421015614ecd565b858d61477a565b999015615a3d57614f9d918b86526004602052614f8f8b600c604089200161422c565b90549060031b1c8486614834565b156159ad5788835260046020526064614fe2614fc0896001604088200154614562565b8b86526008602052614fd58b6040882061422c565b90549060031b1c90614562565b04840361594357888352600d60205285604084209216918284526020526040832088845260205261501760408420548861443d565b116158d957878252600d60205260408220908252602052604081208682526020526040812061504786825461443d565b90555b868152600760205261506085604083205461443d565b878252600460205260056040832001541061586f57868152600760205261508b85604083205461443d565b8782526007602052604082205560046020526003806040832001549081156000146151c0575050868152600460205283600960408320015416803b156151bc576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602481018790529082908290604490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499979593608099979593615187936151a2575b505b888152600f602052818120868616825260205281812061517488825461443d565b9055888152600b6020522091825461443d565b905560405194855216602084015260408301526060820152a1565b6151ab90613b58565b38615151565b6040513d84823e3d90fd5b5080fd5b6001918083036152ae57505050805b85811061520b575091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b878252600460205260408220600886600983015416910154813b156152aa576040517f86a4fd730000000000000000000000000000000000000000000000000000000081526001600160a01b038716600482015260248101919091529083908290604490829084905af1801561529f579061528b92916152905750614378565b6151cf565b61529990613b58565b386112f2565b6040513d85823e3d90fd5b8380fd5b6002810361537f57505050868152600460205260408120600485600983015416910154813b1561537b576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810191909152604481018790529082908290606490829084905af180156151b15760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795936080999795936151879361536c575b50615153565b61537590613b58565b38615366565b8280fd5b949897969594808203615488575082825b6153cc575b505050956080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d499615153565b888452600460205260408420600d810190815483101561548157828860096153f7930154169261422c565b905490841b1c813b1561547d576040517fb35fadc20000000000000000000000000000000000000000000000000000000081526001600160a01b038d1660048201526024810191909152604481018990529085908290606490829084905af18015615472579061546c92916152905750614378565b82615390565b6040513d87823e3d90fd5b8580fd5b5050615395565b929998939290506004810361559a57505085885260046020526004604089200154885b8581106154e9575050906080959493929161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999a615153565b878a52600460208181526040808d206009015490517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0388169381019390935260248301859052829060449082908f908b165af1801561558f57615560575b5061555b90614378565b6154ab565b602090813d8311615588575b6155768183613bc2565b810103126155845738615551565b8980fd5b503d61556c565b6040513d8d823e3d90fd5b6005819a939495969798999a146000146156a657505086815260046020526040812084600982015416600786600a8401541692015491835b88811061562c57505050509160809593916151876040858a7f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d49b999752600460205260078282200161562588825461443d565b9055615153565b615636818561443d565b833b1561547d57604051907f23b872dd00000000000000000000000000000000000000000000000000000000825283600483015289891660248301526044820152858160648183885af1801561569b579061569692916152905750614378565b6155d2565b6040513d88823e3d90fd5b60060361580557878252600460205260408220908560098301541690600883015492015482156157d8578290049189845260046020526004604085200154845b89811061572657505050505091608095939161518760407f2d422c18b05e66a0b22c1c2b24e242e6c19cff65d89543692b3348f7f7ea18d4999795615153565b855b83811061573e575061573990614378565b6156e6565b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602481018490526020816044818a8a5af180156157cd5761579e575b5061579990614378565b615728565b602090813d83116157c6575b6157b48183613bc2565b810103126157c2573861578f565b8680fd5b503d6157aa565b6040513d8a823e3d90fd5b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526012600452fd5b608460405162461bcd60e51b815260206004820152602960248201527f4d61726b6574706c6163653a20496e636f72726563742053616c6520436f6e6660448201527f696775726174696f6e00000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a204e6f7420456e6f756768204e465473204c656660448201527f7420466f722053616c65000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152604060248201527f4d61726b6574706c6163653a204465736972656420507572636861736520416d60448201527f6f756e74204578636565647320507572636861736520416c6c6f636174696f6e6064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574706c6163653a20496e636f7272656374204272696768744c697360448201527f74204554482053656e74000000000000000000000000000000000000000000006064820152fd5b60a460405162461bcd60e51b815260206004820152604e60248201527f44757463684d61726b6574706c6163653a20496e76616c6964204d617820416d60448201527f6f756e74204d65726b6c652050726f6f6620466f722050726f7669646564204d60648201527f65726b6c65205072696f726974790000000000000000000000000000000000006084820152fd5b505050508681526004602052615a5a856001604084200154614562565b821461504a57608460405162461bcd60e51b815260206004820152602660248201527f4d61726b6574706c6163653a20496e636f72726563742045544820416d6f756e60448201527f742053656e7400000000000000000000000000000000000000000000000000006064820152fd5b6040517f9c395bc20000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152821660248201526020816044816d76a84fef008cdabe6409d2fe638b5afa908115615b5b57600091615b3d575b5015614f42579350614f6c614f42565b615b55915060203d81116134ac5761349e8183613bc2565b38615b2d565b6040513d6000823e3d90fd5b15615b6e57565b606460405162461bcd60e51b815260206004820152600a60248201527f53616c6520456e646564000000000000000000000000000000000000000000006044820152fd5b9492959190969396615bc261489e565b5085600052600460205260406000209560056001880154970154906007602052615bf1604060002054836145f6565b9381600052600b60205260406000205493600f60205260406000206001600160a01b0382166000526020526040600020546104205260009760006103e052836000526004602052615c49600b6040600020015461451d565b9c60005b856000526004602052600b60406000200154811015615c9557808f6124d18f936064615c89615c90966008602052614fd584604060002061422c565b049261454e565b615c4d565b50615cad9192939495979a9d989b96999c848761477a565b9a90806103a052615e68575b5050505090600d9291600052600460205260406000209160028301546104005260038301549060048401549060068501546007860154916008870154936001600160a01b03600989015416956001600160a01b03600a8a01541697615d24604051806103c052613b89565b615d2d8a614167565b6103c0515260206103c05101526104005160406103c051015260606103c051015260806103c051015260a06103c051015260c06103c051015260e06103c05101526101006103c05101526101206103c05101526101406103c0510152615d95600b820161467e565b6101606103c0510152615daa600c820161467e565b6101806103c05101526040519081928391016020815493848152019060005260206000209260005b818110615e4f575050615de792500382613bc2565b6101a06103c05101526101c06103c05101526101e06103c05101526102006103c05101526102206103c05101526102406103c0510152610420516102606103c05101526103a05115156102806103c05101526103e05115156102a06103c05101526103c05190565b8454835260019485019486945060209093019201615dd2565b615e9491856000526004602052615e868c600c60406000200161422c565b90549060031b1c8585614834565b6103e05282600052600d6020526001600160a01b036040600020911660005260205260406000208860005260205260406000205490818111615ed8575b8080615cb9565b615ee39299506145f6565b963880615ed156fea26469706673582212200832c781463a02ce7cecfad20d2d917d7d42c61ef1e42bd17611136d9d474f5164736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.