Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,735 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
_Live Mint Artis... | 17738004 | 541 days ago | IN | 0 ETH | 0.05595432 | ||||
_Live Mint Artis... | 17375550 | 592 days ago | IN | 0 ETH | 0.01062494 | ||||
_Live Mint Artis... | 17242119 | 611 days ago | IN | 0 ETH | 0.12635002 | ||||
_Live Mint Artis... | 17242112 | 611 days ago | IN | 0 ETH | 0.82456454 | ||||
_Live Mint Artis... | 17242109 | 611 days ago | IN | 0 ETH | 0.72656206 | ||||
_Live Mint Artis... | 17242101 | 611 days ago | IN | 0 ETH | 1.11212022 | ||||
_Live Mint Artis... | 17241916 | 611 days ago | IN | 0 ETH | 0.01715666 | ||||
_Live Mint Artis... | 17241907 | 611 days ago | IN | 0 ETH | 0.5217726 | ||||
_Live Mint Artis... | 17241901 | 611 days ago | IN | 0 ETH | 0.23923971 | ||||
_Live Mint Artis... | 17241897 | 611 days ago | IN | 0 ETH | 1.59435133 | ||||
_Live Mint Artis... | 17241874 | 611 days ago | IN | 0 ETH | 1.68554811 | ||||
_Live Mint Artis... | 17241873 | 611 days ago | IN | 0 ETH | 1.2371665 | ||||
_Live Mint Artis... | 17241862 | 611 days ago | IN | 0 ETH | 1.29658438 | ||||
_Live Mint Artis... | 17241856 | 611 days ago | IN | 0 ETH | 0.71965356 | ||||
_Live Mint Artis... | 17241770 | 611 days ago | IN | 0 ETH | 0.01209156 | ||||
_Live Mint Artis... | 17241763 | 611 days ago | IN | 0 ETH | 0.02371851 | ||||
_Live Mint Artis... | 17241745 | 611 days ago | IN | 0 ETH | 0.04325878 | ||||
_Live Mint Artis... | 17238117 | 611 days ago | IN | 0 ETH | 0.02984367 | ||||
_Live Mint Artis... | 17237490 | 611 days ago | IN | 0 ETH | 0.03770853 | ||||
_Live Mint Artis... | 17237155 | 612 days ago | IN | 0 ETH | 0.03352524 | ||||
_Live Mint Artis... | 17237148 | 612 days ago | IN | 0 ETH | 0.02512383 | ||||
_Live Mint Artis... | 17237140 | 612 days ago | IN | 0 ETH | 0.03037368 | ||||
_Live Mint Artis... | 17236116 | 612 days ago | IN | 0 ETH | 0.02575555 | ||||
_Live Mint Artis... | 17235859 | 612 days ago | IN | 0 ETH | 0.03272306 | ||||
_Live Mint Artis... | 17235853 | 612 days ago | IN | 0 ETH | 0.04292717 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LiveMintTokyo
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 { IERC721 } from "@openzeppelin/contracts/interfaces/IERC721.sol"; import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import { IMinter } from "./IMinter.sol"; import { IMP } from "./IMP.sol"; import { IGT } from "./IGT.sol"; import { LaunchpadEnabled } from "./LaunchpadEnabled.sol"; contract LiveMintTokyo is Ownable, ReentrancyGuard, LaunchpadEnabled { struct City { string _Name; // _Name uint _QRCurrentIndex; // _QRCurrentIndex (Should be Always Be 333 + (333 * (City# % 6)) address _ERC20; // _ERC20 bytes32 _Root; // _Root } struct Artist { address _MintPass; // _MintPass address _Minter; // _Minter address _PolyptychSource; // _PolyptychSource uint _MaxSupply; // _MaxSupply uint _MintPassProjectID; // _MintPassProjectID uint _ArtBlocksProjectID; // _ArtBlocksProjectID uint _PolyStart; // _PolyStart uint _PolyEnd; // _PolyEnd } struct User { bool _Eligible; // _Eligible uint _Allocation; // _Allocation } /*-------------------*/ /* STATE VARIABLES */ /*-------------------*/ bytes32 private constant _AUTHORIZED = keccak256("AUTHORIZED"); // Authorized Role bytes32 private constant _MINTER_ROLE = keccak256("MINTER_ROLE"); // Minter Role address private constant _DN = 0x00000000000076A84feF008CDAbe6409d2FE638B; // delegate.cash Delegation Registry address private constant _GOLDEN_TOKEN = 0x985e1932FFd2aA4bC9cE611DFe12816A248cD2cE; // Golden Token Address address private constant _CITIZEN_MINTER = 0xDd06d8483868Cd0C5E69C24eEaA2A5F2bEaFd42b; // ArtBlocks Minter Contract address private constant _BRT_MULTISIG = 0xB96E81f80b3AEEf65CB6d0E280b15FD5DBE71937; // BRT Multisig address public _Pindar; // Pindar Van Arman's Custom Minter Contract uint public _CurrentCityIndex = 6; // Current City Index uint public _UniqueArtistsInvoked; // Unique Artists Invoked /*-------------------*/ /* MAPPINGS */ /*-------------------*/ mapping(uint => Artist) public Artists; // [ArtistID] => Artist mapping(uint => City) public Cities; // [CityIndex] => City Struct mapping(uint => mapping(address => bool)) public _QRRedeemed; // [CityIndex][Wallet] => If User Has Redeemed QR mapping(uint => mapping(address => uint)) public _QRAllocation; // [CityIndex][Wallet] => Wallet's QR Code Allocation mapping(uint => mapping(uint => address)) public _BrightListCitizen; // [CityIndex][TicketID] => Address Of CryptoCitizen Minting Recipient mapping(uint => mapping(uint => address)) public _BrightListArtist; // [ArtistID][TicketID] => Address Of Artist NFT Recipient mapping(uint => mapping(uint => string)) public _DataArtists; // [ArtistID][TicketID] => Artist Data mapping(uint => mapping(uint => string)) public _DataCitizens; // [CityIndex][TicketID] => Data For Golden Token Checkins mapping(uint => mapping(uint => uint)) public _MintedTokenIDCitizen; // [CityIndex][TicketID] => MintedTokenID mapping(uint => mapping(uint => uint)) public _MintedTokenIDArtist; // [ArtistID][TicketID] => MintedTokenID mapping(uint => mapping(uint => bool)) public _MintedArtist; // [ArtistID][TicketID] => If Minted mapping(uint => mapping(uint => bool)) public _MintedCitizen; // [CityIndex][TicketID] => If Golden Ticket ID Has Minted Or Not mapping(uint => mapping(uint => uint)) public _ArtBlocksProjectID; // [ArtistID][TicketID] => ArtBlocksProjectID mapping(address => bytes32) public Role; // [Wallet] => BRT Minter Role mapping(uint => uint) public AmountRemaining; // [ArtistID] => Mints Remaining /*-------------------*/ /* EVENTS */ /*-------------------*/ /** * @dev Emitted When `Redeemer` IRL-mints CryptoCitizen Corresponding To Their Redeemed `TicketID`. **/ event LiveMintComplete(address Redeemer, uint TicketID, uint TokenID, string Data); /** * @dev Emitted When `Redeemer` IRL-mints A Artist NFT Corresponding To Their Redeemed `TicketID`. */ event LiveMintCompleteArtist(address Recipient, uint ArtistID, uint TicketID, uint MintedWorkTokenID); /** * @dev Emitted When `Redeemer` Redeems Golden Token Corresponding To `TicketID` **/ event QRRedeemed(address Redeemer, uint TicketID, string Data, string Type); /** * @dev Emitted When A Contract Is Authorized */ event AuthorizedContract(address NewAddress); /** * @dev Emitted When A Contract Is Deauthorized */ event DeauthorizedContract(address NewAddress); /*-------------------*/ /* CONSTRUCTOR */ /*-------------------*/ constructor() { Cities[0]._Name = "CryptoGalacticans"; Cities[1]._Name = "CryptoVenetians"; Cities[2]._Name = "CryptoNewYorkers"; Cities[3]._Name = "CryptoBerliners"; Cities[4]._Name = "CryptoLondoners"; Cities[5]._Name = "CryptoMexas"; Cities[6]._Name = "CryptoTokyites"; Cities[6]._QRCurrentIndex = 333; Cities[6]._Root = 0x255b8b82ee0d1823cdc3cf859efacfee1111414bacab649a7e8bea9cd48a0ed3; Cities[7]._Name = "CryptoCitizen City #8"; Cities[7]._QRCurrentIndex = 666; Cities[8]._Name = "CryptoCitizen City #9"; Cities[8] ._QRCurrentIndex = 999; Cities[9]._Name = "CryptoCitizen City #10"; Cities[10]._QRCurrentIndex = 1332; Role[0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700] = _AUTHORIZED; // `operator.brightmoments.eth` Role[0x1A0a3E3AE390a0710f8A6d00587082273eA8F6C9] = _MINTER_ROLE; // BRT Minter #1 Role[0x4d8013b0c264034CBf22De9DF33e22f58D52F207] = _MINTER_ROLE; // BRT Minter #2 Role[0x4D9A8CF2fE52b8D49C7F7EAA87b2886c2bCB4160] = _MINTER_ROLE; // BRT Minter #3 Role[0x124fd966A0D83aA020D3C54AE2c9f4800b46F460] = _MINTER_ROLE; // BRT Minter #4 Role[0x100469feA90Ac1Fe1073E1B2b5c020A8413635c4] = _MINTER_ROLE; // BRT Minter #5 Role[0x756De4236373fd17652b377315954ca327412bBA] = _MINTER_ROLE; // BRT Minter #6 Role[0xc5Dfba6ef7803665C1BDE478B51Bd7eB257A2Cb9] = _MINTER_ROLE; // BRT Minter #7 Role[0xFBF32b29Bcf8fEe32d43a4Bfd3e7249daec457C0] = _MINTER_ROLE; // BRT Minter #8 Role[0xF2A15A83DEE7f03C70936449037d65a1C100FF27] = _MINTER_ROLE; // BRT Minter #9 Role[0x1D2BAB965a4bB72f177Cd641C7BacF3d8257230D] = _MINTER_ROLE; // BRT Minter #10 Role[0x2e51E8b950D72BDf003b58E357C2BA28FB77c7fB] = _MINTER_ROLE; // BRT Minter #11 Role[0x8a7186dECb91Da854090be8226222eA42c5eeCb6] = _MINTER_ROLE; // BRT Minter #12 } /*---------------------*/ /* QR REDEMPTION */ /*---------------------*/ /** * @dev Redeems Spot For IRL Minting */ function RedeemQR(string[] calldata Data, string[] calldata Type, bytes32[] calldata Proof, address Vault, uint Amount) external nonReentrant { address Recipient = msg.sender; if(Vault != address(0)) { if(IDelegationRegistry(_DN).checkDelegateForAll(msg.sender, Vault)) { Recipient = Vault; } } require(readQREligibility(Recipient, Proof), "LiveMint: User Is Not Eligible To Redeem QR"); if(_QRAllocation[_CurrentCityIndex][Recipient] == 0) // User Is Able To Redeem Explicitly 1 QR Code { require(!_QRRedeemed[_CurrentCityIndex][Recipient], "LiveMint: User Has Already Redeemed"); _DataCitizens[_CurrentCityIndex][Cities[_CurrentCityIndex]._QRCurrentIndex] = Data[0]; _BrightListCitizen[_CurrentCityIndex][Cities[_CurrentCityIndex]._QRCurrentIndex] = Recipient; emit QRRedeemed(Recipient, Cities[_CurrentCityIndex]._QRCurrentIndex, Data[0], Type[0]); Cities[_CurrentCityIndex]._QRCurrentIndex++; } else // User Is Able To Redeem More Than 1 QR Code Because Their QRAllocation > 0 { require(Amount <= _QRAllocation[_CurrentCityIndex][Recipient], "LiveMint: Amount Must Be Less Than Or Equal To QRAllocation"); uint _CurrentQR = Cities[_CurrentCityIndex]._QRCurrentIndex; uint _Limit = Amount + _CurrentQR; uint _Counter; _QRAllocation[_CurrentCityIndex][Recipient] -= Amount; Cities[_CurrentCityIndex]._QRCurrentIndex = _Limit; for(_CurrentQR; _CurrentQR < _Limit; _CurrentQR++) { _DataCitizens[_CurrentCityIndex][_CurrentQR] = Data[_Counter]; _BrightListCitizen[_CurrentCityIndex][_CurrentQR] = Recipient; emit QRRedeemed(Recipient, _CurrentQR, Data[_Counter], Type[_Counter]); _Counter++; } } _QRRedeemed[_CurrentCityIndex][Recipient] = true; } /*--------------------*/ /* LIVE MINTING */ /*--------------------*/ /** * @dev Batch Mints Verified Users On The Brightlist CryptoCitizens * note: { For CryptoCitizen Cities } */ function _LiveMintCitizen(uint[] calldata TicketIDs) external onlyMinter { address Recipient; uint MintedWorkTokenID; for(uint TicketID; TicketID < TicketIDs.length; TicketID++) { require(!_MintedCitizen[_CurrentCityIndex][TicketIDs[TicketID]], "LiveMint: Golden Token Already Minted"); if(_BrightListCitizen[_CurrentCityIndex][TicketIDs[TicketID]] != address(0)) { Recipient = _BrightListCitizen[_CurrentCityIndex][TicketIDs[TicketID]]; } else if (TicketIDs[TicketID] < 333) { Recipient = IGT(_GOLDEN_TOKEN)._LiveMintBurn(TicketIDs[TicketID]); } else { revert("LiveMint: Invalid TicketID"); } require(Recipient != address(0), "LiveMint: Invalid Recipient"); _MintedCitizen[_CurrentCityIndex][TicketIDs[TicketID]] = true; MintedWorkTokenID = IMinter(_CITIZEN_MINTER).purchaseTo(Recipient, _CurrentCityIndex); _MintedTokenIDCitizen[_CurrentCityIndex][TicketIDs[TicketID]] = MintedWorkTokenID; emit LiveMintComplete(Recipient, TicketIDs[TicketID], MintedWorkTokenID, _DataCitizens[_CurrentCityIndex][TicketIDs[TicketID]]); } } /** * @dev Burns Artist Mint Pass In Exchange For The Minted Work * note: { For Instances Where Multiple Artists Share The Same Mint Pass & Return (Recipient, ArtBlocksProjectID) } */ function _LiveMintArtist(uint ArtistID, uint[] calldata TicketIDs) external onlyMinter { address Recipient; address MintPass = Artists[ArtistID]._MintPass; address Minter = Artists[ArtistID]._Minter; uint ArtBlocksProjectID; uint MintedWorkTokenID; uint TicketID; require(AmountRemaining[ArtistID] > 0, "LiveMint: ArtistID Mint Limit Reached"); require(TicketIDs.length <= AmountRemaining[ArtistID], "LiveMint: TicketID Length Exceeds ArtistID Mint Limit"); AmountRemaining[ArtistID] = AmountRemaining[ArtistID] - TicketIDs.length; for(uint x; x < TicketIDs.length; x++) { TicketID = TicketIDs[x]; require(!_MintedArtist[ArtistID][TicketID], "LiveMint: Artist Mint Pass Already Minted"); _MintedArtist[ArtistID][TicketID] = true; (Recipient, ArtBlocksProjectID) = IMP(MintPass)._LiveMintBurn(TicketID); if(ArtBlocksProjectID == 100) { MintedWorkTokenID = IMinter(_Pindar).purchaseTo(Recipient); } // Pindar Custom Contract else { MintedWorkTokenID = IMinter(Minter).purchaseTo(Recipient, ArtBlocksProjectID); } // Pre-Defined Minter Contract _MintedTokenIDArtist[ArtistID][TicketID] = MintedWorkTokenID; emit LiveMintCompleteArtist(Recipient, ArtistID, TicketID, MintedWorkTokenID); } } /** * @dev Burns Artist Mint Pass In Exchange For The Minted Work * note: { For Instances Where Multiple Artists Share The Same Mint Pass & Return (Recipient, ArtBlocksProjectID) } */ function _LiveMintArtistBatch(uint[] calldata ArtistIDs, uint[][] calldata TicketIDs) external onlyMinter { address Recipient; address MintPass; address Minter; uint ArtBlocksProjectID; uint MintedWorkTokenID; uint TicketID; uint ActiveArtistID; for(uint ArtistIDIndex; ArtistIDIndex < ArtistIDs.length; ArtistIDIndex++) { ActiveArtistID = ArtistIDs[ArtistIDIndex]; MintPass = Artists[ActiveArtistID]._MintPass; Minter = Artists[ActiveArtistID]._Minter; for(uint TicketIDIndex; TicketIDIndex < TicketIDs[ArtistIDIndex].length; TicketIDIndex++) { TicketID = TicketIDs[ArtistIDIndex][TicketIDIndex]; require(!_MintedArtist[ActiveArtistID][TicketID], "LiveMint: Artist Mint Pass Already Minted"); _MintedArtist[ActiveArtistID][TicketID] = true; (Recipient, ArtBlocksProjectID) = IMP(MintPass)._LiveMintBurn(TicketID); if(ArtBlocksProjectID == 100) { MintedWorkTokenID = IMinter(_Pindar).purchaseTo(Recipient); } else { MintedWorkTokenID = IMinter(Minter).purchaseTo(Recipient, ArtBlocksProjectID); } _MintedTokenIDArtist[ActiveArtistID][TicketID] = MintedWorkTokenID; emit LiveMintCompleteArtist(Recipient, ActiveArtistID, TicketID, MintedWorkTokenID); } } } /*-------------------*/ /* OWNER FUNCTIONS */ /*-------------------*/ /** * @dev Grants Address BRT Minter Role **/ function __AddMinter(address Minter) external onlyOwner { Role[Minter] = _MINTER_ROLE; } /** * @dev Deactivates Address From BRT Minter Role **/ function __RemoveMinter(address Minter) external onlyOwner { Role[Minter] = 0x0; } /** * @dev Changes Mint Pass Address For Artist LiveMints */ function __ChangeMintPass(uint ProjectID, address Contract) external onlyOwner { Artists[ProjectID]._MintPass = Contract; } /** * @dev Changes Merkle Root For Citizen LiveMints */ function __ChangeRootCitizen(bytes32 NewRoot) external onlyOwner { Cities[_CurrentCityIndex]._Root = NewRoot; } /** * @dev Overwrites QR Allocation */ function __QRAllocationsOverwrite(address[] calldata Addresses, uint[] calldata Amounts) external onlyOwner { require(Addresses.length == Amounts.length, "LiveMint: Input Arrays Must Match"); for(uint x; x < Addresses.length; x++) { _QRAllocation[_CurrentCityIndex][Addresses[x]] = Amounts[x]; } } /** * @dev Increments QR Allocations */ function __QRAllocationsIncrement(address[] calldata Addresses, uint[] calldata Amounts) external onlyOwner { require(Addresses.length == Amounts.length, "LiveMint: Input Arrays Must Match"); for(uint x; x < Addresses.length; x++) { _QRAllocation[_CurrentCityIndex][Addresses[x]] += Amounts[x]; } } /** * @dev Mints To Multisig */ function __QRAllocationsSetNoShow(uint[] calldata TicketIDs) external onlyOwner { for(uint TicketIndex; TicketIndex < TicketIDs.length; TicketIndex++) { require(!_MintedCitizen[_CurrentCityIndex][TicketIDs[TicketIndex]], "LiveMint: Ticket ID Already Minted"); _BrightListCitizen[_CurrentCityIndex][TicketIDs[TicketIndex]] = _BRT_MULTISIG; } } /** * @dev Changes QR Current Index */ function __ChangeQRIndex(uint NewIndex) external onlyOwner { Cities[_CurrentCityIndex]._QRCurrentIndex = NewIndex; } /** * @dev Changes Pindar's Minter Address */ function __ChangePindarAddress(address NewAddress) external onlyOwner { _Pindar = NewAddress; } /** * @dev Batch Approves BRT For Purchasing */ function __BatchApproveERC20(address[] calldata ERC20s, address[] calldata Operators) external onlyOwner { require(ERC20s.length == Operators.length, "LiveMint: Arrays Must Be Equal Length"); for(uint x; x < ERC20s.length; x++) { IERC20(ERC20s[x]).approve(Operators[x], 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); } } /** * @dev Instantiates New City * note: CityIndex Always Corresponds To ArtBlocks ProjectID */ function __NewCity ( string calldata Name, uint CityIndex, uint QRIndex, address ERC20 ) external onlyOwner { Cities[CityIndex] = City( Name, QRIndex, ERC20, 0x6942069420694206942069420694206942069420694206942069420694206942 ); } /** * @dev Overrides An Artist */ function __OverrideArtist(uint ArtistID, Artist memory NewArtist) external onlyOwner { Artists[ArtistID] = NewArtist; } /** * @dev Instantiates A New City */ function __NewCityStruct(uint CityIndex, City memory NewCity) external onlyOwner { Cities[CityIndex] = NewCity; } /** * @dev Returns An Artist Struct */ function __NewArtistStruct(uint ArtistID, Artist memory NewArtist) external onlyOwner { Artists[ArtistID] = NewArtist; } /** * @dev Changes The Minter Address For An Artist */ function __NewArtistMinter(uint ArtistID, address Minter) external onlyOwner { Artists[ArtistID]._Minter = Minter; } /** * @dev Withdraws Any Ether Mistakenly Sent to Contract to Multisig **/ function __WithdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } /** * @dev Withdraws ERC20 Tokens to Multisig **/ function __WithdrawERC20(address TokenAddress) external onlyOwner { IERC20 erc20Token = IERC20(TokenAddress); uint balance = erc20Token.balanceOf(address(this)); require(balance > 0, "LiveMint: 0 ERC20 Balance At `TokenAddress`"); erc20Token.transfer(msg.sender, balance); } /** * @dev Withdraws Any NFT Mistakenly Sent To This Contract. */ function __WithdrawERC721(address ContractAddress, address Recipient, uint TokenID) external onlyOwner { IERC721(ContractAddress).transferFrom(address(this), Recipient, TokenID); } /** * @dev Authorizes A Contract To Mint */ function ____AuthorizeContract(address NewAddress) external onlyOwner { Role[NewAddress] = _AUTHORIZED; emit AuthorizedContract(NewAddress); } /** * @dev Deauthorizes A Contract From Minting */ function ___DeauthorizeContract(address NewAddress) external onlyOwner { Role[NewAddress] = 0x0; emit DeauthorizedContract(NewAddress); } /*-------------------*/ /* PUBLIC VIEW */ /*-------------------*/ /** * @dev Returns A User's QR Allocation Amount, Or 0 If Not Eligible */ function readEligibility(address Recipient, bytes32[] memory Proof) public view returns(uint) { bool Eligible = readQREligibility(Recipient, Proof); if(!Eligible) { return 0; } else if(Eligible && _QRAllocation[_CurrentCityIndex][Recipient] > 0) { return _QRAllocation[_CurrentCityIndex][Recipient]; } else if(Eligible) { return 1; } else { return 0; } } /** * @dev Returns If User Is Eligible To Redeem QR Code */ function readQREligibility(address Recipient, bytes32[] memory Proof) public view returns(bool) { bytes32 Leaf = keccak256(abi.encodePacked(Recipient)); bool BrightListEligible = MerkleProof.verify(Proof, Cities[_CurrentCityIndex]._Root, Leaf); if( (BrightListEligible && !_QRRedeemed[_CurrentCityIndex][Recipient]) || (BrightListEligible && _QRAllocation[_CurrentCityIndex][Recipient] > 0) ) { return true; } else { return false; } } /** * @dev Returns An Array Of Unminted Golden Tokens */ function readCitizenUnmintedTicketIDs() public view returns(uint[] memory) { uint[] memory UnmintedTokenIDs = new uint[](1000); uint Counter; uint CityIDBuffer = _CurrentCityIndex % 6 * 333; uint _TokenID; for(uint TokenID; TokenID < 1000; TokenID++) { _TokenID = TokenID + CityIDBuffer; if ( !_MintedCitizen[_CurrentCityIndex][_TokenID] && _BrightListCitizen[_CurrentCityIndex][_TokenID] != address(0) ) { UnmintedTokenIDs[Counter] = _TokenID; Counter++; } } uint[] memory FormattedUnMintedTokenIDs = new uint[](Counter); uint Found; for(uint FormattedTokenID; FormattedTokenID < Counter; FormattedTokenID++) { if(UnmintedTokenIDs[FormattedTokenID] != 0 || (UnmintedTokenIDs[FormattedTokenID] == 0 && FormattedTokenID == 0)) { FormattedUnMintedTokenIDs[Found] = UnmintedTokenIDs[FormattedTokenID]; Found++; } } return FormattedUnMintedTokenIDs; } /** * @dev Returns An Array Of Unminted Golden Tokens */ function readCitizenMintedTicketIDs(uint CityID) public view returns(uint[] memory) { uint[] memory MintedTokenIDs = new uint[](1000); uint Counter; uint CityIDBuffer = (CityID % 6) * 333; uint _TicketID; for(uint TicketID; TicketID < 1000; TicketID++) { _TicketID = TicketID + CityIDBuffer; if(_MintedCitizen[CityID][_TicketID]) { MintedTokenIDs[Counter] = _TicketID; Counter++; } } uint[] memory FormattedMintedTokenIDs = new uint[](Counter); uint Found; for(uint FormattedTokenID; FormattedTokenID < Counter; FormattedTokenID++) { if(MintedTokenIDs[FormattedTokenID] != 0 || (MintedTokenIDs[FormattedTokenID] == 0 && FormattedTokenID == 0)) { FormattedMintedTokenIDs[Found] = MintedTokenIDs[FormattedTokenID]; Found++; } } return FormattedMintedTokenIDs; } /** * @dev Returns A 2d Array Of Checked In & Unminted TicketIDs Awaiting A Mint */ function readCitizenCheckedInTicketIDs() public view returns(uint[] memory TokenIDs) { uint[] memory _TokenIDs = new uint[](1000); uint CityIDBuffer = (_CurrentCityIndex % 6) * 333; uint _TicketID; uint Counter; for(uint TicketID; TicketID < 1000; TicketID++) { _TicketID = TicketID + CityIDBuffer; if( !_MintedCitizen[_CurrentCityIndex][_TicketID] && _BrightListCitizen[_CurrentCityIndex][_TicketID] != address(0) ) { _TokenIDs[Counter] = _TicketID; Counter++; } } uint[] memory FormattedCheckedInTickets = new uint[](Counter); uint Found; for(uint x; x < Counter; x++) { if(_TokenIDs[x] != 0 || (_TokenIDs[x] == 0 && x == 0)) { FormattedCheckedInTickets[Found] = _TokenIDs[x]; Found++; } } return FormattedCheckedInTickets; } /** * @dev Returns A 2d Array Of Minted ArtistIDs */ function readArtistUnmintedTicketIDs(uint[] calldata ArtistIDs, uint Range) public view returns(uint[][] memory TokenIDs) { uint[][] memory _TokenIDs = new uint[][](ArtistIDs.length); uint Index; for(uint ArtistID; ArtistID < ArtistIDs.length; ArtistID++) { address _Mintpass = Artists[ArtistID]._MintPass; uint[] memory UnmintedArtistTokenIDs = new uint[](Range); uint Counter; for(uint TokenID; TokenID < Range; TokenID++) { bool TicketIDBurned; try IERC721(_Mintpass).ownerOf(TokenID) { } // checks if token is burned catch { TicketIDBurned = true; } if( !_MintedArtist[ArtistIDs[ArtistID]][TokenID] && ( _BrightListArtist[ArtistIDs[ArtistID]][TokenID] != address(0) || TicketIDBurned == false ) ) { UnmintedArtistTokenIDs[Counter] = TokenID; Counter++; } } uint[] memory FormattedUnMintedArtistIDs = new uint[](Counter); uint Found; for(uint x; x < Counter; x++) { if(UnmintedArtistTokenIDs[x] != 0 || (UnmintedArtistTokenIDs[x] == 0 && x == 0)) { FormattedUnMintedArtistIDs[Found] = UnmintedArtistTokenIDs[x]; Found++; } } _TokenIDs[Index] = FormattedUnMintedArtistIDs; Index++; } return (_TokenIDs); } /** * @dev Returns A 2d Array Of Minted ArtistIDs */ function readArtistMintedTicketIDs(uint[] calldata ArtistIDs, uint Range) public view returns(uint[][] memory TokenIDs) { uint[][] memory _TokenIDs = new uint[][](ArtistIDs.length); uint Index; for(uint ArtistID; ArtistID < ArtistIDs.length; ArtistID++) { uint[] memory MintedTokenIDs = new uint[](Range); uint Counter; for(uint TokenID; TokenID < Range; TokenID++) { if(_MintedArtist[ArtistIDs[ArtistID]][TokenID]) { MintedTokenIDs[Counter] = TokenID; Counter++; } } uint[] memory FormattedMintedTokenIDs = new uint[](Counter); uint Found; for(uint x; x < Counter; x++) { if(MintedTokenIDs[x] != 0 || (MintedTokenIDs[x] == 0 && x == 0)) { FormattedMintedTokenIDs[Found] = MintedTokenIDs[x]; Found++; } } _TokenIDs[Index] = FormattedMintedTokenIDs; Index++; } return (_TokenIDs); } /** * @dev Returns Original Recipients Of CryptoCitizens */ function readCitizenBrightList(uint CityIndex) public view returns(address[] memory Recipients) { address[] memory _Recipients = new address[](1000); uint Start = (CityIndex % 6) * 333; for(uint x; x < 1000; x++) { _Recipients[x] = _BrightListCitizen[CityIndex][Start+x]; } return _Recipients; } /** * @dev Returns Original Recipient Of Artist NFTs */ function readArtistBrightList(uint ArtistID, uint Range) public view returns(address[] memory Recipients) { address[] memory _Recipients = new address[](Range); for(uint x; x < Range; x++) { _Recipients[x] = _BrightListArtist[ArtistID][x]; } return _Recipients; } /** * @dev Returns The City Struct At Index Of `CityIndex` */ function readCitizenCity(uint CityIndex) public view returns(City memory) { return Cities[CityIndex]; } /** * @dev Returns The Artist Struct At Index Of `ArtistID` */ function readArtist(uint ArtistID) public view returns(Artist memory) { return Artists[ArtistID]; } /** * @dev Returns A Minted Work TokenID Corresponding To The Input Artist TicketID */ function readArtistMintedTokenID(uint ArtistID, uint TicketID) external view returns (uint) { if(!_MintedArtist[ArtistID][TicketID]) { return 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; } else { return _MintedTokenIDArtist[ArtistID][TicketID]; } } /** * @dev Returns A Minted Citizen TokenID Corresponding To Input TicketID */ function readCitizenMintedTokenID(uint CityIndex, uint TicketID) external view returns(uint) { if(!_MintedCitizen[CityIndex][TicketID]) { return type(uint).max; } else { return _MintedTokenIDCitizen[CityIndex][TicketID]; } } /*-------------------------*/ /* LAUNCHPAD */ /*-------------------------*/ /** * @dev Initializes A LiveMint Artist */ function __InitLiveMint(Artist memory _Params) external onlyAdmin returns (uint) { AmountRemaining[_UniqueArtistsInvoked] = _Params._MaxSupply; Artists[_UniqueArtistsInvoked] = _Params; _UniqueArtistsInvoked++; return _UniqueArtistsInvoked - 1; } /*-------------------------*/ /* ACCESS MODIFIERS */ /*-------------------------*/ /** * @dev Access Modifier That Allows Only BrightListed BRT Minters **/ modifier onlyMinter() { require(Role[msg.sender] == _MINTER_ROLE, "LiveMint | onlyMinter | Caller Is Not Approved BRT Minter"); _; } /** * @dev Access Modifier That Allows Only Authorized Contracts */ modifier onlyAdmin() { require(Role[msg.sender] == _AUTHORIZED || msg.sender == _LAUNCHPAD || msg.sender == owner(), "LiveMint | onlyAdmin | Caller Is Not Approved Admin"); _; } } interface IDelegationRegistry { /** * @dev Checks If A Vault Has Delegated To The Delegate */ function checkDelegateForAll(address delegate, address delegator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC20.sol) pragma solidity ^0.8.0; import "../token/ERC20/IERC20.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; import "../token/ERC721/IERC721.sol";
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.19; interface IGT { /** * @dev { Golden Token Burn } */ function _LiveMintBurn(uint TicketID) external returns (address Recipient); }
// 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); }
// SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.19; interface IMP { /** * @dev { For Instances Where Golden Token Or Artists Have A Bespoke Mint Pass Contract } */ function _LiveMintBurn(uint TicketID) external returns (address Recipient, uint ArtistID); }
//SPDX-License-Identifier: MIT /** * @dev @brougkr */ pragma solidity 0.8.19; abstract contract LaunchpadEnabled { /** * @dev The Launchpad Address */ address public _LAUNCHPAD = 0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700; /** * @dev Updates The Launchpad Address From Launchpad (batch upgrade) */ function _____NewLaunchpadAddress(address NewAddress) external onlyLaunchpad { _LAUNCHPAD = NewAddress; } /** * @dev Access Control Needed For A Contract To Be Able To Use The Launchpad */ modifier onlyLaunchpad() { require(_LAUNCHPAD == msg.sender, "onlyLaunchpad: Caller Is Not Launchpad"); _; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 10000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewAddress","type":"address"}],"name":"AuthorizedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"NewAddress","type":"address"}],"name":"DeauthorizedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"TicketID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TokenID","type":"uint256"},{"indexed":false,"internalType":"string","name":"Data","type":"string"}],"name":"LiveMintComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"ArtistID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"TicketID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"MintedWorkTokenID","type":"uint256"}],"name":"LiveMintCompleteArtist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"Redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"TicketID","type":"uint256"},{"indexed":false,"internalType":"string","name":"Data","type":"string"},{"indexed":false,"internalType":"string","name":"Type","type":"string"}],"name":"QRRedeemed","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"AmountRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Artists","outputs":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_PolyptychSource","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Cities","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"address","name":"_ERC20","type":"address"},{"internalType":"bytes32","name":"_Root","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"Data","type":"string[]"},{"internalType":"string[]","name":"Type","type":"string[]"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"RedeemQR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"Role","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_ArtBlocksProjectID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_BrightListArtist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_BrightListCitizen","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_CurrentCityIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_DataArtists","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_DataCitizens","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LAUNCHPAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"_LiveMintArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256[][]","name":"TicketIDs","type":"uint256[][]"}],"name":"_LiveMintArtistBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"_LiveMintCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedArtist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedCitizen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedTokenIDArtist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"_MintedTokenIDCitizen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_Pindar","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_QRAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_QRRedeemed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_UniqueArtistsInvoked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Minter","type":"address"}],"name":"__AddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"ERC20s","type":"address[]"},{"internalType":"address[]","name":"Operators","type":"address[]"}],"name":"__BatchApproveERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ProjectID","type":"uint256"},{"internalType":"address","name":"Contract","type":"address"}],"name":"__ChangeMintPass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"__ChangePindarAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"NewIndex","type":"uint256"}],"name":"__ChangeQRIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"NewRoot","type":"bytes32"}],"name":"__ChangeRootCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_PolyptychSource","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintTokyo.Artist","name":"_Params","type":"tuple"}],"name":"__InitLiveMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"address","name":"Minter","type":"address"}],"name":"__NewArtistMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_PolyptychSource","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintTokyo.Artist","name":"NewArtist","type":"tuple"}],"name":"__NewArtistStruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"Name","type":"string"},{"internalType":"uint256","name":"CityIndex","type":"uint256"},{"internalType":"uint256","name":"QRIndex","type":"uint256"},{"internalType":"address","name":"ERC20","type":"address"}],"name":"__NewCity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"},{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"address","name":"_ERC20","type":"address"},{"internalType":"bytes32","name":"_Root","type":"bytes32"}],"internalType":"struct LiveMintTokyo.City","name":"NewCity","type":"tuple"}],"name":"__NewCityStruct","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_PolyptychSource","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintTokyo.Artist","name":"NewArtist","type":"tuple"}],"name":"__OverrideArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"},{"internalType":"uint256[]","name":"Amounts","type":"uint256[]"}],"name":"__QRAllocationsIncrement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"Addresses","type":"address[]"},{"internalType":"uint256[]","name":"Amounts","type":"uint256[]"}],"name":"__QRAllocationsOverwrite","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"__QRAllocationsSetNoShow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Minter","type":"address"}],"name":"__RemoveMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"TokenAddress","type":"address"}],"name":"__WithdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ContractAddress","type":"address"},{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"uint256","name":"TokenID","type":"uint256"}],"name":"__WithdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__WithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"___DeauthorizeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"____AuthorizeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"_____NewLaunchpadAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"}],"name":"readArtist","outputs":[{"components":[{"internalType":"address","name":"_MintPass","type":"address"},{"internalType":"address","name":"_Minter","type":"address"},{"internalType":"address","name":"_PolyptychSource","type":"address"},{"internalType":"uint256","name":"_MaxSupply","type":"uint256"},{"internalType":"uint256","name":"_MintPassProjectID","type":"uint256"},{"internalType":"uint256","name":"_ArtBlocksProjectID","type":"uint256"},{"internalType":"uint256","name":"_PolyStart","type":"uint256"},{"internalType":"uint256","name":"_PolyEnd","type":"uint256"}],"internalType":"struct LiveMintTokyo.Artist","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256","name":"Range","type":"uint256"}],"name":"readArtistBrightList","outputs":[{"internalType":"address[]","name":"Recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256","name":"Range","type":"uint256"}],"name":"readArtistMintedTicketIDs","outputs":[{"internalType":"uint256[][]","name":"TokenIDs","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ArtistID","type":"uint256"},{"internalType":"uint256","name":"TicketID","type":"uint256"}],"name":"readArtistMintedTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ArtistIDs","type":"uint256[]"},{"internalType":"uint256","name":"Range","type":"uint256"}],"name":"readArtistUnmintedTicketIDs","outputs":[{"internalType":"uint256[][]","name":"TokenIDs","type":"uint256[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"}],"name":"readCitizenBrightList","outputs":[{"internalType":"address[]","name":"Recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readCitizenCheckedInTicketIDs","outputs":[{"internalType":"uint256[]","name":"TokenIDs","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"}],"name":"readCitizenCity","outputs":[{"components":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"address","name":"_ERC20","type":"address"},{"internalType":"bytes32","name":"_Root","type":"bytes32"}],"internalType":"struct LiveMintTokyo.City","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityID","type":"uint256"}],"name":"readCitizenMintedTicketIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"CityIndex","type":"uint256"},{"internalType":"uint256","name":"TicketID","type":"uint256"}],"name":"readCitizenMintedTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readCitizenUnmintedTicketIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"}],"name":"readEligibility","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"Proof","type":"bytes32[]"}],"name":"readQREligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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
60406080815234620004a057600080546001600160a01b03198082163390811784556013926001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a360019081805573e06f5fae754e81bc050215ff89b03d9e9ff20700809160025416176002556006600455838052610534600792602093808552878720620000a46200009d8254620004a5565b82620004e2565b60227043727970746f47616c6163746963616e7360781b019055818752808552878720620000d76200009d8254620004a5565b601e6e43727970746f56656e657469616e7360881b01905560028752808552878720620001096200009d8254620004a5565b856f43727970746f4e6577596f726b65727360801b019055600387528085528787206200013b6200009d8254620004a5565b601e6e43727970746f4265726c696e65727360881b019055600487528085528787206200016d6200009d8254620004a5565b601e6e43727970746f4c6f6e646f6e65727360881b019055600587528085528787206200019f6200009d8254620004a5565b60166a43727970746f4d6578617360a81b01905560068752808552878720620001cd6200009d8254620004a5565b601c6d43727970746f546f6b796974657360901b019055600687528085527f255b8b82ee0d1823cdc3cf859efacfee1111414bacab649a7e8bea9cd48a0ed3600389892061014d858201550155808752878720620002306200009d8254620004a5565b602a7f43727970746f436974697a656e2043697479202338000000000000000000000001905580875280855261029a828989200155600887528787206200027c6200009d8254620004a5565b602a7f43727970746f436974697a656e20436974792023390000000000000000000000019055600887528085526103e782898920015560098752878720620002c96200009d8254620004a5565b602c7f43727970746f436974697a656e20436974792023313000000000000000000000019055600a8752845286862001558352527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60782822055731a0a3e3ae390a0710f8a6d00587082273ea8f6c98152817f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6918282822055734d8013b0c264034cbf22de9df33e22f58d52f20781528282822055734d9a8cf2fe52b8d49c7f7eaa87b2886c2bcb41608152828282205573124fd966a0d83aa020d3c54ae2c9f4800b46f4608152828282205573100469fea90ac1fe1073e1b2b5c020a8413635c48152828282205573756de4236373fd17652b377315954ca327412bba8152828282205573c5dfba6ef7803665c1bde478b51bd7eb257a2cb98152828282205573fbf32b29bcf8fee32d43a4bfd3e7249daec457c08152828282205573f2a15a83dee7f03c70936449037d65a1c100ff2781528282822055731d2bab965a4bb72f177cd641c7bacf3d8257230d81528282822055732e51e8b950d72bdf003b58e357c2ba28fb77c7fb81528282822055738a7186decb91da854090be8226222ea42c5eecb6815220555161467290816200051d8239f35b600080fd5b90600182811c92168015620004d7575b6020831014620004c157565b634e487b7160e01b600052602260045260246000fd5b91607f1691620004b5565b601f8211620004ef575050565b6000908152601f60208220920160051c8201915b8281106200051057505050565b8181556001016200050356fe6080604052600436101561001257600080fd5b600060e08135811c90816304bb3cbf146138cd578163070e1119146138685781630b779fdc1461381157816316065c231461374a578163173fc0091461374a5781631b18ed39146132d95781632165f3991461327e57816322f040991461325157816325709be214613227578163273c42ca146131f55781632cc2bb601461306f5781633477a5c714612f905781633538896614612bf35781633a7ce96814612bbd5781633be4c93914612b37578163401e994d14612a755781634090b2a41461291d5781634723facf146128e45781634c644a6e146128b75781634f4feff91461246e57816354d6e36c1461243357816358c47362146123fd5781635de87228146123b05781635f814b3d146123925781636c081a7a146121635781636dfd5a8c1461201d578163715018a614611fab5781637328fcca14611f79578163765b8b5114611f525781637f01a15814611eed5781638429228714611ea55781638833a35414611de057816389f2d07214611dbc5781638d38237414611c215781638da5cb5b14611bfb57816391f2b07814611b7e5781639adf3f9514611b645781639ea801a1146119d55781639f55aac414611971578163a0cad211146118e8578163a6a09bbe146118a2578163abe0a8d314611884578163ae556f9a14611806578163af8e8409146117b2578163b07fee6a14611780578163b2a5249a14611543578163b4f1699a14610cdb578163b5a9b3e914610c74578163b95247ab14610c42578163befe160a14610b0d578163c001ecef14610919578163c87301641461081257508063d4322d7d146107da578063d90afeb1146107ad578063dc4a42b214610793578063dd30ae1a14610636578063e14826b2146104d2578063ebb1708e146103fc578063ef7cbedf146103da578063f2fde38b146102e85763feab9794146102bf57600080fd5b346102e557806003193601126102e55760206001600160a01b0360035416604051908152f35b80fd5b50346102e55760206003193601126102e557610302613952565b61030a613ede565b6001600160a01b0380911690811561037057600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346102e55760206103f46103ee36613d90565b9061434a565b604051908152f35b50346102e5576020806003193601126104ce576040519160043561041f84613a56565b6103e892838552617d00368287013761014d60068306818102939181159185041417156104a157835b858110610461576040518061045d89826139aa565b0390f35b61049c90828652600a84526040862061047a8287613f4e565b875284526001600160a01b03604087205416610496828a614520565b52613f97565b610448565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b5080fd5b50346102e5576104e136613de4565b9092916104ed84614565565b92809181925b868410610508576040518061045d8882613e17565b61051185614534565b8390845b8781106105cb575061052682614534565b9185865b8281106105645750505050816105589161054761055e948a614520565b526105528189614520565b50613f97565b93613f97565b926104f3565b61056e8185614520565b51158015906105b0575b61058b575b61058690613f97565b61052a565b906105a86105869161059d8487614520565b516104968289614520565b91905061057d565b506105bb8185614520565b5115801561057857508015610578565b6105e0878b87949c95979b999b9a969a6141b0565b3586526020601081526040872090828852528960ff60408820541661061a575b5061060a90613f97565b9890939198979597969296610515565b858261049661060a949861062d94614520565b94905089610600565b50346102e55761064536613b97565b929190610650613ede565b838203610729578492835b838110610666578480f35b6001600160a01b0390858261068461067f8489886141b0565b614336565b1661069361067f848b896141b0565b93604051947f095ea7b300000000000000000000000000000000000000000000000000000000865216600485015260001960248501528360448160209485945af192831561071e576106eb936106f0575b5050613f97565b61065b565b8161070f92903d10610717575b6107078183613a73565b810190613f36565b5038806106e4565b503d6106fd565b6040513d89823e3d90fd5b608460405162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20417272617973204d75737420426520457175616c204c60448201527f656e6774680000000000000000000000000000000000000000000000000000006064820152fd5b50346102e55760206103f46107a736613994565b906145f5565b50346102e55760406020916107c136613994565b908252600e845282822090825283522054604051908152f35b50346102e55760206003193601126102e55760406020916001600160a01b03610801613952565b168152601383522054604051908152f35b9050346104ce5760206003193601126104ce576040826101009383835161083881613a39565b82815282602082015282858201528260608201528260808201528260a08201528260c0820152015260043581526006602052209060405161087881613a39565b6001600160a01b0392838154169384835280600183015416906020840191825280600284015416906040850191825260038401549060608601918252600485015492608087019384528160058701549560a0890196875289600760068a01549960c08c019a8b52015499019889526040519a8b52511660208a0152511660408801525160608701525160808601525160a08501525160c08401525190820152f35b82346102e557600319906040823601126102e55760243567ffffffffffffffff92838211610b095760809082360301126104ce576040519061095a826139ee565b8060040135848111610b0557810136602382011215610b0557610987903690602460048201359101613e97565b825260209384830190602483013582526044830135916001600160a01b03918284168403610b00576040860193845260646060870195013585526109c9613ede565b600435875260078852604087209551978851918211610ad3576109f6826109f08954613c22565b8961408e565b80601f8311600114610a6a5750819088996003989992610a5f575b50506000198260011b92881b1c19161786555b516001860155600285019151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790555191015580f35b015190508980610a11565b9198601f198a16888a52838a20938a905b828210610abb57505091600193918b60039a9b9c9410610aa3575b505050811b018655610a24565b015160001960f8848b1b161c19169055898080610a96565b80600186978294978701518155019601940190610a7b565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600080fd5b8380fd5b8280fd5b82346102e5576020806003193601126104ce5760043560405192610b3084613a56565b6103e8808552617d00368587013781926006810661014d908181029181830414901517156104a157835b838110610bf25750505050610b6e82614534565b93815b838110610b8b576040518581528061045d81880189613b63565b610b958183614520565b5115801590610bd7575b610bb2575b610bad90613f97565b610b71565b91610bcf610bad91610bc48585614520565b51610496828a614520565b929050610ba4565b50610be28183614520565b51158015610b9f57508015610b9f565b610bfc8282613f4e565b8386526011885260408620818752885260ff604087205416610c28575b50610c2390613f97565b610b5a565b86610c3b91610496610c2394998c614520565b9590610c19565b82346102e55760206003193601126102e557610c5c613ede565b60045481526007602052600435600160408320015580f35b82346102e55760406003193601126102e557610c8e613968565b610c96613ede565b600435825260066020526001600160a01b036001604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b82346102e55760a06003193601126102e55760043567ffffffffffffffff81116104ce57610d0d903690600401613b32565b60243567ffffffffffffffff8111610b0557610d2d903690600401613b32565b9260443567ffffffffffffffff811161153f57610d4e903690600401613b32565b9490610d5861397e565b956002600154146114fb57600260015533966001600160a01b03811680611465575b5050610d9191610d8b913691613d42565b866143d6565b156113fb576004548087526009602052604087206001600160a01b038716600052602052604060002054156000146110c257506004548087526008602052604087206001600160a01b03871660005260205260ff6040600020541661105857610dfa8584613fa6565b90918852600d602052604088206007602052600160408a2001548952602052604088209167ffffffffffffffff821161102b57610e4182610e3b8554613c22565b8561408e565b8890601f8311600114610f9c579180610f2094927fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c989796948c92610f91575b50506000198260011b9260031b1c19161790555b6004548852600a602052604088206007602052600160408a2001548952602052604088206001600160a01b0388167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610f12610f0a60045497888b526007602052600160408c20015495613fa6565b929095613fa6565b916040519586958a87614103565b0390a18252600760205260016040832001610f3b8154613f97565b90555b600454825260086020526001600160a01b03604083209116600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556001805580f35b013590508b80610e81565b838a5260208a20918a5b601f1985168110611013575092610f2094926001927fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c9998979583601f19811610610ff9575b505050811b019055610e95565b60001960f88560031b161c199101351690558b8080610fec565b90926020600181928686013581550194019101610fa6565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b608460405162461bcd60e51b815260206004820152602360248201527f4c6976654d696e743a20557365722048617320416c726561647920526564656560448201527f6d656400000000000000000000000000000000000000000000000000000000006064820152fd5b929091938387526009602052604087206001600160a01b038716600052602052604060002054608435116113915783875260076020526040872060010154939461110e85608435613f4e565b95889089526009602052604089206001600160a01b038916600052602052604060002061113e6084358254613f8a565b90556004548952600760205286600160408b2001555b8686106111675750505050505050610f3e565b61117281848461402e565b6004548b52600d60205260408b20888c5260205260408b209167ffffffffffffffff8211611364578686868e868f9897968d968f9882610e3b6111b59254613c22565b8390601f831160011461129f578a61128e9c97611280976040886112889f9e9c98887fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c9f9b998799611269996112719c92611294575b50506000198260011b9260031b1c19161790555b6004548152600a6020528181208d8252602052206001600160a01b038b167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561402e565b94909361402e565b92909160405196879687614103565b0390a1613f97565b95613f97565b94611154565b01359050388061120b565b83859c9a9b9c526020852091855b601f198516811061133157509b809a9761128097604061128e9f986112889f9c9860017fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c9f9b998799611269996112719c83601f19811610611317575b505050811b01905561121f565b60001960f88560031b161c1991013516905538808061130a565b975098506001939a508891929950809750602095508594500135815501940191018e8c968f968d968d968d968d966112ad565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b608460405162461bcd60e51b815260206004820152603b60248201527f4c6976654d696e743a20416d6f756e74204d757374204265204c65737320546860448201527f616e204f7220457175616c20546f205152416c6c6f636174696f6e00000000006064820152fd5b608460405162461bcd60e51b815260206004820152602b60248201527f4c6976654d696e743a2055736572204973204e6f7420456c696769626c65205460448201527f6f2052656465656d2051520000000000000000000000000000000000000000006064820152fd5b604051907f9c395bc200000000000000000000000000000000000000000000000000000000825289600483015260248201526020816044816d76a84fef008cdabe6409d2fe638b5afa9081156114f0578a916114d2575b506114c8575b80610d7a565b9650610d916114c2565b6114ea915060203d8111610717576107078183613a73565b8a6114bc565b6040513d8c823e3d90fd5b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b8580fd5b82346102e55761155236613de4565b90929161155e84614565565b92809181925b868410611579576040518061045d8882613e17565b83835260066020526001600160a01b0360408420541661159886614534565b8491855b8881106116315750506115ae82614534565b9185865b8281106115d5575050505081610558916105476115cf948a614520565b92611564565b6115df8185614520565b5115801590611616575b6115fc575b6115f790613f97565b6115b2565b9061160e6115f79161059d8487614520565b9190506115ee565b506116218185614520565b511580156115e9575080156115e9565b869a929a999799989498959395508a876040517f6352211e000000000000000000000000000000000000000000000000000000008152836004820152602081602481885afa908161173c575b50611737575060015b6116918c86886141b0565b358952601060205260408920838a5260205260ff60408a2054161590816116f0575b506116d4575b506116c390613f97565b99919998969897939794929461159c565b86826104966116c394996116e794614520565b9590508a6116b9565b90506116fd8c86886141b0565b358952600b60205260408920838a526020526001600160a01b0360408a205416159081159161172e575b508d6116b3565b9050158d611727565b611686565b909192506020813d602011611778575b8161175960209383613a73565b81010312611774579061176d8e93926141c0565b508e61167d565b8980fd5b3d915061174c565b82346102e55760206003193601126102e55761179a613ede565b60045481526007602052600435600360408320015580f35b82346102e5576117eb6117f2604061045d936117cd36613994565b908252600d6020528282209082526020522060405192838092613c75565b0382613a73565b604051918291602083526020830190613be2565b82346102e55760206003193601126102e5576040611870916004358152600760205220604051906118428261183b8184613c75565b0383613a73565b60018101549060036001600160a01b0360028301541691015490604051948594608086526080860190613be2565b926020850152604084015260608301520390f35b82346102e557806003193601126102e5576020600554604051908152f35b82346102e557806003193601126102e5576118bb613ede565b80808080478181156118df575b3390f1156118d35780f35b604051903d90823e3d90fd5b506108fc6118c8565b82346102e5576118f736613b97565b611902939193613ede565b61190d8184146142c5565b845b83811061191a578580f35b8061192961196c9284886141b0565b35600454885260206009815260408920906001600160a01b0361195061067f868b8b6141b0565b16600052526119656040600020918254613f4e565b9055613f97565b61190f565b82346102e55760406003193601126102e55761198b613968565b611993613ede565b600435825260066020526001600160a01b036040832091167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b82346102e5576020806003193601126104ce576001600160a01b036119f8613952565b611a00613ede565b166040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528281602481855afa908115611b59578491611b2c575b508015611ac2576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101919091529082908290604490829087905af18015611ab757611a9a578280f35b81611ab092903d10610717576107078183613a73565b5081808280f35b6040513d85823e3d90fd5b6084836040519062461bcd60e51b82526004820152602b60248201527f4c6976654d696e743a20302045524332302042616c616e63652041742060546f60448201527f6b656e41646472657373600000000000000000000000000000000000000000006064820152fd5b90508281813d8311611b52575b611b438183613a73565b81010312610b00575184611a43565b503d611b39565b6040513d86823e3d90fd5b82346102e55760206103f4611b7836613994565b906145ae565b82346102e557611b8d36613b97565b611b98939193613ede565b611ba38184146142c5565b845b838110611bb0578580f35b80611bbf611bf69284886141b0565b35600454885260206009815260408920906001600160a01b03611be661067f868b8b6141b0565b1660005252604060002055613f97565b611ba5565b82346102e557806003193601126102e5576001600160a01b036020915416604051908152f35b82346102e55760806003193601126102e5576004359067ffffffffffffffff8083116104ce57366023840112156104ce57826004013590808211610b09573660248386010111610b0957611c96611c7661397e565b94611c7f613ede565b60405193611c8c856139ee565b6024369201613e97565b825260209384830190604435825260408401916001600160a01b03809216835260608501937f69420694206942069420694206942069420694206942069420694206942069428552602435875260078852604087209551978851918211610ad357611d05826109f08954613c22565b80601f8311600114611d6c5750819088996003989992610a5f5750506000198260011b92881b1c1916178655516001860155600285019151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790555191015580f35b9198601f198a16888a52838a20938a905b828210611da457505091600193918b60039a9b9c9410610aa357505050811b018655610a24565b80600186978294978701518155019601940190611d7d565b82346102e5576020611dd6611dd036613d90565b906143d6565b6040519015158152f35b82346102e55760206003193601126102e557611dfa613952565b600254906001600160a01b033381841603611e3b577fffffffffffffffffffffffff0000000000000000000000000000000000000000911691161760025580f35b608460405162461bcd60e51b815260206004820152602660248201527f6f6e6c794c61756e63687061643a2043616c6c6572204973204e6f74204c617560448201527f6e636870616400000000000000000000000000000000000000000000000000006064820152fd5b82346102e55760406003193601126102e5576001600160a01b036040611ec9613968565b92600435815260096020522091166000526020526020604060002054604051908152f35b82346102e55760206003193601126102e5577fdce35c6ead5e97f9a12a9dfe363465b6f62c5fab770d14f46f89c82c58819cc660206001600160a01b03611f32613952565b611f3a613ede565b1680845260138252836040812055604051908152a180f35b82346102e557806003193601126102e55760206001600160a01b0360025416604051908152f35b82346102e55760ff6040602092611f8f36613994565b9082526011855282822090825284522054166040519015158152f35b82346102e557806003193601126102e557611fc4613ede565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b82346102e5576020806003193601126104ce5760043567ffffffffffffffff8111610b0957612050903690600401613b32565b90612059613ede565b835b828110612066578480f35b600454808652601185526040862061207f8386866141b0565b358752855260ff6040872054166120f957906120f4918652600a8552604086206120aa8286866141b0565b35875285526040862073b96e81f80b3aeef65cb6d0e280b15fd5dbe719377fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055613f97565b61205b565b6084856040519062461bcd60e51b82526004820152602260248201527f4c6976654d696e743a205469636b657420494420416c7265616479204d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b9050346104ce576101006003193601126104ce576040519161218483613a39565b6001600160a01b03926004358481168103610b005781526024358481168103610b00576020938483019182526044358681168103610b0057604084019081526060840160643581526080850190608435825260a086019260a435845260c087019460c435865287019560e435875233895260138a527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60760408a2054148015612385575b8015612379575b1561230f5760079798999a83516005548c5260148d5260408c20556005548b5260068c528060408c209a5116917fffffffffffffffffffffffff000000000000000000000000000000000000000092838c5416178b558160018c019151168382541617905560028a0192511690825416179055516003870155516004860155516005850155516006840155519101556122c8600554613f97565b908160055560001982019182116122e25750604051908152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b60848a6040519062461bcd60e51b82526004820152603360248201527f4c6976654d696e74207c206f6e6c7941646d696e207c2043616c6c657220497360448201527f204e6f7420417070726f7665642041646d696e000000000000000000000000006064820152fd5b508a895416331461222e565b508a600254163314612227565b82346102e557806003193601126102e5576020600454604051908152f35b82346102e55760406003193601126102e5576001600160a01b0360406123d4613968565b9260043581526008602052209116600052602052602060ff604060002054166040519015158152f35b82346102e5576001600160a01b03604060209261241936613994565b908252600a85528282209082528452205416604051908152f35b82346102e55760206003193601126102e5576001600160a01b03612455613952565b61245d613ede565b168152601360205280604081205580f35b82346102e5576020806003193601126104ce5760043567ffffffffffffffff8111610b09576124a1903690600401613b32565b90338452601383526124d87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660408620541461413f565b835b8281106124e5578480f35b60045490818652601191828652604087206125018387876141b0565b358852865260ff60408820541661284d578652600a808652604087206125288387876141b0565b358852865260408720546001600160a01b0391908216156127455760045488528652604087206125598387876141b0565b358852865280604088205416905b8116928315612701576126089187916004548a5282526040892061258c8589896141b0565b358a5282526040808a2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556004805491517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0390931690830152602482015291829081906044820190565b03818a73dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af190811561071e5787916126d2575b507fff14a599c69a8ecfb96ffaa8bcd7cbf9b3b189ab8f5aca1c4d016335e234e199906126cd936004548952600e88526040892061266f8589896141b0565b358a5288528160408a20556112806126888589896141b0565b35926004548b52600d8a5260408b206126a2878b8b6141b0565b358c528a5260408b209060405194859485528b85015260408401526080806060850152830190613c75565b6124da565b90508581813d83116126fa575b6126e98183613a73565b81010312610b0057516126cd612630565b503d6126df565b6064876040519062461bcd60e51b82526004820152601b60248201527f4c6976654d696e743a20496e76616c696420526563697069656e7400000000006044820152fd5b5061014d6127548387876141b0565b351015612809576127668286866141b0565b35604051907f6d325d31000000000000000000000000000000000000000000000000000000008252600482015286816024818b73985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af19081156127fe5788916127c5575b5090612567565b90508681813d83116127f7575b6127dc8183613a73565b810103126127f3576127ed906141c0565b886127be565b8780fd5b503d6127d2565b6040513d8a823e3d90fd5b6064866040519062461bcd60e51b82526004820152601a60248201527f4c6976654d696e743a20496e76616c6964205469636b657449440000000000006044820152fd5b6084866040519062461bcd60e51b82526004820152602560248201527f4c6976654d696e743a20476f6c64656e20546f6b656e20416c7265616479204d60448201527f696e7465640000000000000000000000000000000000000000000000000000006064820152fd5b82346102e55760406020916128cb36613994565b908252600f845282822090825283522054604051908152f35b82346102e5576117eb6117f2604061045d936128ff36613994565b908252600c6020528282209082526020522060405192838092613c75565b82346102e557806003193601126102e5576040519061293b82613a56565b6103e8808352602091617d00368486013780916004546006810661014d908181029181830414901517156104a157835b8381106129f8575050505061297f82614534565b93815b83811061299c576040518581528061045d81880189613b63565b6129a68183614520565b51158015906129dd575b6129c3575b6129be90613f97565b612982565b916129d56129be91610bc48585614520565b9290506129b5565b506129e88183614520565b511580156129b0575080156129b0565b612a028282613f4e565b8386526011885260408620818752885260ff6040872054161580612a4f575b612a35575b50612a3090613f97565b61296b565b86612a4891610496612a3094998c614520565b9590612a26565b50838652600a88526040862081875288526001600160a01b036040872054161515612a21565b82346102e5576020806003193601126104ce5760408260809360608351612a9b816139ee565b8181528286820152828582015201526004358152600783522060405191612ac1836139ee565b604051612ad2816117eb8186613c75565b83526001820154918184019283526001600160a01b0390612b1f600383600284015416926040880193845201549360608701948552604051978897828952519188015260a0870190613be2565b93516040860152511660608401525160808301520390f35b9050346104ce5760206003193601126104ce576040610100926004358152600660205220906001600160a01b03908183541692826001820154169260028201541660038201546004830154906005840154926007600686015495015496604051988952602089015260408801526060870152608086015260a085015260c0840152820152f35b82346102e5576001600160a01b036040602092612bd936613994565b908252600b85528282209082528452205416604051908152f35b82346102e557612c0236613b97565b929190913385526013602052612c3d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660408720541461413f565b845b828110612c4a578580f35b612c59818484989697986141b0565b3595868552600660205260408520936001600160a01b036001818754169601541693865b612c8885858b614262565b9050811015612f7657612ca681612ca087878d614262565b906141b0565b35908a895260108060205260408a20838b52602052612ccc60ff60408c205416156141d4565b8b8a5260205260408920828a526020526040892060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051917f6d325d310000000000000000000000000000000000000000000000000000000083528060048401526040836024818d8d5af180156114f0578a938b91612f41575b5060648103612e7557508960206001600160a01b03600354166024604051809481937fd15776560000000000000000000000000000000000000000000000000000000083526001600160a01b038a1660048401525af1908115612e6a578d92918c918291612e2f575b5060407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad9493612e2a9793611280939283915b878152600f602052818120848252602052205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b612c7d565b92935050506020813d602011612e62575b81612e4d60209383613a73565b81010312610b0057518c91908b906040612db8565b3d9150612e40565b6040513d8d823e3d90fd5b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260248101919091526020816044818e8d5af1908115612e6a578d92918c918291612f06575b5060407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad9493612e2a979361128093928391612deb565b92935050506020813d602011612f39575b81612f2460209383613a73565b81010312610b0057518c91908b906040612ecf565b3d9150612f17565b9050612f6691935060403d604011612f6f575b612f5e8183613a73565b810190614245565b9290928d612d4f565b503d612f54565b509450925094939550612f8890613f97565b919091612c3f565b82346102e55760606003193601126102e557612faa613952565b81612fb3613968565b91612fbc613ede565b6001600160a01b0380911692833b15610b09576064908360405195869485937f23b872dd00000000000000000000000000000000000000000000000000000000855230600486015216602484015260443560448401525af1801561306457613022575080f35b67ffffffffffffffff81116130375760405280f35b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6040513d84823e3d90fd5b82346102e557806003193601126102e5576040519061308d82613a56565b6103e8808352602091617d00368486013760045461014d6006820681810294929181159186041417156131c8578293835b83811061314b57505050506130d282614534565b93815b8381106130ef576040518581528061045d81880189613b63565b6130f98183614520565b5115801590613130575b613116575b61311190613f97565b6130d5565b9161312861311191610bc48585614520565b929050613108565b5061313b8183614520565b5115801561310357508015613103565b6131558282613f4e565b8386526011885260408620818752885260ff60408720541615806131a2575b613188575b5061318390613f97565b6130be565b8661319b9161049661318394998c614520565b9590613179565b50838652600a88526040862081875288526001600160a01b036040872054161515613174565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b82346102e55760ff604060209261320b36613994565b9082526010855282822090825284522054166040519015158152f35b82346102e55760206003193601126102e55760406020916004358152601483522054604051908152f35b82346102e557604060209161326536613994565b9082526012845282822090825283522054604051908152f35b82346102e55760206003193601126102e5576001600160a01b036132a0613952565b6132a8613ede565b16815260136020527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6604082205580f35b82346102e55760406003193601126102e557602490600435823567ffffffffffffffff8111610b0957613310903690600401613b32565b91909133845260206013815261334b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660408720541461413f565b8285526006815260408520916001600160a01b038084541695816001809601541690601485526040892054156136e15786895260148552604089205484116136785790889991878a98999a52601486526133a98560408a2054613f8a565b898952601487526040892055875b8581106133c2578880f35b806133cf8a9288856141b0565b358b83526010808a52604084208285528a526133f260ff604086205416156141d4565b8c84528952604083208184528952604083208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905560408d878251809681937f6d325d310000000000000000000000000000000000000000000000000000000083528660048401525af1908115612e6a57898c9283958491613653575b50606481036135885750886003541688604051809581937fd15776560000000000000000000000000000000000000000000000000000000083528d8a1660048401525af190811561357d578a8d928f948491613541575b509261353c96926112809260407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad97969384925b888252600f81528282209085835252205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b6133b7565b93505090925081813d8311613576575b61355b8183613a73565b8101031261357257518c918c918b9061353c6134cb565b8b80fd5b503d613551565b6040513d8e823e3d90fd5b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602481019190915292839060449082908a5af190811561357d578a8d928f94849161361b575b509261353c96926112809260407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad97969384926134ff565b93505090925081813d831161364c575b6136358183613a73565b8101031261357257518c918c918b9061353c6135e3565b503d61362b565b905061366f91955060403d604011612f6f57612f5e8183613a73565b94909438613474565b60848560358c6040519262461bcd60e51b845260048401528201527f4c6976654d696e743a205469636b65744944204c656e6774682045786365656460448201527f73204172746973744944204d696e74204c696d697400000000000000000000006064820152fd5b60848560258c6040519262461bcd60e51b845260048401528201527f4c6976654d696e743a204172746973744944204d696e74204c696d697420526560448201527f61636865640000000000000000000000000000000000000000000000000000006064820152fd5b82346102e5576101206003193601126102e55761380e61376936613a96565b613771613ede565b6004356000526006602052600760e06040600020926001600160a01b03808251167fffffffffffffffffffffffff00000000000000000000000000000000000000009081875416178655600186018260208501511682825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c081015160068501550151910155565b80f35b82346102e55760206003193601126102e5576001600160a01b03613833613952565b61383b613ede565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035580f35b82346102e55761387736613994565b909161388282614534565b92815b83811061389a576040518061045d87826139aa565b6138c8908284526020600b81526040852090828652526001600160a01b036040852054166104968288614520565b613885565b82346102e55760206003193601126102e5577f2c74592fddad593c2c4403101ce9b30930711ab87571268ddd1e1989ee1d791760206001600160a01b03613912613952565b61391a613ede565b16808452601382527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6076040852055604051908152a180f35b600435906001600160a01b0382168203610b0057565b602435906001600160a01b0382168203610b0057565b606435906001600160a01b0382168203610b0057565b6003196040910112610b00576004359060243590565b6020908160408183019282815285518094520193019160005b8281106139d1575050505090565b83516001600160a01b0316855293810193928101926001016139c3565b6080810190811067ffffffffffffffff821117613a0a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610100810190811067ffffffffffffffff821117613a0a57604052565b617d20810190811067ffffffffffffffff821117613a0a57604052565b90601f601f19910116810190811067ffffffffffffffff821117613a0a57604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc610100910112610b005760405190613ace82613a39565b816001600160a01b036024358181168103610b005782526044358181168103610b005760208301526064359081168103610b00576040820152608435606082015260a435608082015260c43560a082015260e43560c082015260e061010435910152565b9181601f84011215610b005782359167ffffffffffffffff8311610b00576020808501948460051b010111610b0057565b90815180825260208080930193019160005b828110613b83575050505090565b835185529381019392810192600101613b75565b6040600319820112610b005767ffffffffffffffff91600435838111610b005782613bc491600401613b32565b93909392602435918211610b0057613bde91600401613b32565b9091565b919082519283825260005b848110613c0e575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201613bed565b90600182811c92168015613c6b575b6020831014613c3c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613c31565b9060009291805491613c8683613c22565b918282526001938481169081600014613ce85750600114613ca8575b50505050565b90919394506000526020928360002092846000945b838610613cd4575050505001019038808080613ca2565b805485870183015294019385908201613cbd565b91505060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009193501683830152151560051b01019038808080613ca2565b67ffffffffffffffff8111613a0a5760051b60200190565b9291613d4d82613d2a565b91613d5b6040519384613a73565b829481845260208094019160051b8101928311610b0057905b828210613d815750505050565b81358152908301908301613d74565b906040600319830112610b00576004356001600160a01b0381168103610b0057916024359067ffffffffffffffff8211610b005780602383011215610b0057816024613de193600401359101613d42565b90565b6040600319820112610b00576004359067ffffffffffffffff8211610b0057613e0f91600401613b32565b909160243590565b602080820190808352835180925260408301928160408460051b8301019501936000915b848310613e4b5750505050505090565b9091929394958480613e87837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528a51613b63565b9801930193019194939290613e3b565b92919267ffffffffffffffff8211613a0a5760405191613ec16020601f19601f8401160184613a73565b829481845281830111610b00578281602093846000960137010152565b6001600160a01b03600054163303613ef257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b90816020910312610b0057518015158103610b005790565b91908201809211613f5b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211613f5b57565b6000198114613f5b5760010190565b9015613fff578035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b0057019081359167ffffffffffffffff8311610b00576020018236038113610b00579190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015613fff5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b0057019081359167ffffffffffffffff8311610b00576020018236038113610b00579190565b90601f811161409c57505050565b600091825260208220906020601f850160051c830194106140d8575b601f0160051c01915b8281106140cd57505050565b8181556001016140c1565b90925082906140b8565b601f8260209493601f19938186528686013760008582860101520116010190565b94929093614131926001600160a01b03613de1989616875260208701526080604087015260808601916140e2565b9260608185039101526140e2565b1561414657565b608460405162461bcd60e51b815260206004820152603960248201527f4c6976654d696e74207c206f6e6c794d696e746572207c2043616c6c6572204960448201527f73204e6f7420417070726f76656420425254204d696e746572000000000000006064820152fd5b9190811015613fff5760051b0190565b51906001600160a01b0382168203610b0057565b156141db57565b608460405162461bcd60e51b815260206004820152602960248201527f4c6976654d696e743a20417274697374204d696e74205061737320416c72656160448201527f6479204d696e74656400000000000000000000000000000000000000000000006064820152fd5b9190826040910312610b0057602061425c836141c0565b92015190565b9190811015613fff5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b0057019081359167ffffffffffffffff8311610b00576020018260051b36038113610b00579190565b156142cc57565b608460405162461bcd60e51b815260206004820152602160248201527f4c6976654d696e743a20496e70757420417272617973204d757374204d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152fd5b356001600160a01b0381168103610b005790565b9061435590826143d6565b80614361575050600090565b80806143a8575b15614397575060045460005260096020526001600160a01b036040600020911660005260205260406000205490565b1590506143a357600190565b600090565b50600454600052600960205260406000206001600160a01b0383166000526020526040600020541515614368565b9091604090815192602093848101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1682526014815284810181811067ffffffffffffffff821117613a0a57855251902093600454926000938085526007835260038686200154969385945b895186101561448a5761445a868b614520565b51908181101561447a578752845261447487872095613f97565b94614447565b9087528452614474878720611288565b9195979298509295935014938493846144f9575b85156144b7575b5050505050600014613de15750600190565b90919293809550946144d2575b5050505038808080806144a5565b8552600981528285206001600160a01b0390921685525282205415159050388080806144c4565b808752600882528387206001600160a01b038416885282528387205460ff1615955061449e565b8051821015613fff5760209160051b010190565b9061453e82613d2a565b61454b6040519182613a73565b828152601f1961455b8294613d2a565b0190602036910137565b9061456f82613d2a565b61457c6040519182613a73565b828152601f1961458c8294613d2a565b019060005b82811061459d57505050565b806060602080938501015201614591565b9060009082825260106020526040822081835260205260ff604083205416156000146145dd5750505060001990565b6040928252600f602052828220908252602052205490565b9060009082825260116020526040822081835260205260ff604083205416156000146146245750505060001990565b6040928252600e60205282822090825260205220549056fea264697066735822122059927135faf2c60aabf347cfd0766f32905dc1d9b47f1f2614ff958346434c5c64736f6c63430008130033
Deployed Bytecode
0x6080604052600436101561001257600080fd5b600060e08135811c90816304bb3cbf146138cd578163070e1119146138685781630b779fdc1461381157816316065c231461374a578163173fc0091461374a5781631b18ed39146132d95781632165f3991461327e57816322f040991461325157816325709be214613227578163273c42ca146131f55781632cc2bb601461306f5781633477a5c714612f905781633538896614612bf35781633a7ce96814612bbd5781633be4c93914612b37578163401e994d14612a755781634090b2a41461291d5781634723facf146128e45781634c644a6e146128b75781634f4feff91461246e57816354d6e36c1461243357816358c47362146123fd5781635de87228146123b05781635f814b3d146123925781636c081a7a146121635781636dfd5a8c1461201d578163715018a614611fab5781637328fcca14611f79578163765b8b5114611f525781637f01a15814611eed5781638429228714611ea55781638833a35414611de057816389f2d07214611dbc5781638d38237414611c215781638da5cb5b14611bfb57816391f2b07814611b7e5781639adf3f9514611b645781639ea801a1146119d55781639f55aac414611971578163a0cad211146118e8578163a6a09bbe146118a2578163abe0a8d314611884578163ae556f9a14611806578163af8e8409146117b2578163b07fee6a14611780578163b2a5249a14611543578163b4f1699a14610cdb578163b5a9b3e914610c74578163b95247ab14610c42578163befe160a14610b0d578163c001ecef14610919578163c87301641461081257508063d4322d7d146107da578063d90afeb1146107ad578063dc4a42b214610793578063dd30ae1a14610636578063e14826b2146104d2578063ebb1708e146103fc578063ef7cbedf146103da578063f2fde38b146102e85763feab9794146102bf57600080fd5b346102e557806003193601126102e55760206001600160a01b0360035416604051908152f35b80fd5b50346102e55760206003193601126102e557610302613952565b61030a613ede565b6001600160a01b0380911690811561037057600054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b608460405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50346102e55760206103f46103ee36613d90565b9061434a565b604051908152f35b50346102e5576020806003193601126104ce576040519160043561041f84613a56565b6103e892838552617d00368287013761014d60068306818102939181159185041417156104a157835b858110610461576040518061045d89826139aa565b0390f35b61049c90828652600a84526040862061047a8287613f4e565b875284526001600160a01b03604087205416610496828a614520565b52613f97565b610448565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b5080fd5b50346102e5576104e136613de4565b9092916104ed84614565565b92809181925b868410610508576040518061045d8882613e17565b61051185614534565b8390845b8781106105cb575061052682614534565b9185865b8281106105645750505050816105589161054761055e948a614520565b526105528189614520565b50613f97565b93613f97565b926104f3565b61056e8185614520565b51158015906105b0575b61058b575b61058690613f97565b61052a565b906105a86105869161059d8487614520565b516104968289614520565b91905061057d565b506105bb8185614520565b5115801561057857508015610578565b6105e0878b87949c95979b999b9a969a6141b0565b3586526020601081526040872090828852528960ff60408820541661061a575b5061060a90613f97565b9890939198979597969296610515565b858261049661060a949861062d94614520565b94905089610600565b50346102e55761064536613b97565b929190610650613ede565b838203610729578492835b838110610666578480f35b6001600160a01b0390858261068461067f8489886141b0565b614336565b1661069361067f848b896141b0565b93604051947f095ea7b300000000000000000000000000000000000000000000000000000000865216600485015260001960248501528360448160209485945af192831561071e576106eb936106f0575b5050613f97565b61065b565b8161070f92903d10610717575b6107078183613a73565b810190613f36565b5038806106e4565b503d6106fd565b6040513d89823e3d90fd5b608460405162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20417272617973204d75737420426520457175616c204c60448201527f656e6774680000000000000000000000000000000000000000000000000000006064820152fd5b50346102e55760206103f46107a736613994565b906145f5565b50346102e55760406020916107c136613994565b908252600e845282822090825283522054604051908152f35b50346102e55760206003193601126102e55760406020916001600160a01b03610801613952565b168152601383522054604051908152f35b9050346104ce5760206003193601126104ce576040826101009383835161083881613a39565b82815282602082015282858201528260608201528260808201528260a08201528260c0820152015260043581526006602052209060405161087881613a39565b6001600160a01b0392838154169384835280600183015416906020840191825280600284015416906040850191825260038401549060608601918252600485015492608087019384528160058701549560a0890196875289600760068a01549960c08c019a8b52015499019889526040519a8b52511660208a0152511660408801525160608701525160808601525160a08501525160c08401525190820152f35b82346102e557600319906040823601126102e55760243567ffffffffffffffff92838211610b095760809082360301126104ce576040519061095a826139ee565b8060040135848111610b0557810136602382011215610b0557610987903690602460048201359101613e97565b825260209384830190602483013582526044830135916001600160a01b03918284168403610b00576040860193845260646060870195013585526109c9613ede565b600435875260078852604087209551978851918211610ad3576109f6826109f08954613c22565b8961408e565b80601f8311600114610a6a5750819088996003989992610a5f575b50506000198260011b92881b1c19161786555b516001860155600285019151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790555191015580f35b015190508980610a11565b9198601f198a16888a52838a20938a905b828210610abb57505091600193918b60039a9b9c9410610aa3575b505050811b018655610a24565b015160001960f8848b1b161c19169055898080610a96565b80600186978294978701518155019601940190610a7b565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600080fd5b8380fd5b8280fd5b82346102e5576020806003193601126104ce5760043560405192610b3084613a56565b6103e8808552617d00368587013781926006810661014d908181029181830414901517156104a157835b838110610bf25750505050610b6e82614534565b93815b838110610b8b576040518581528061045d81880189613b63565b610b958183614520565b5115801590610bd7575b610bb2575b610bad90613f97565b610b71565b91610bcf610bad91610bc48585614520565b51610496828a614520565b929050610ba4565b50610be28183614520565b51158015610b9f57508015610b9f565b610bfc8282613f4e565b8386526011885260408620818752885260ff604087205416610c28575b50610c2390613f97565b610b5a565b86610c3b91610496610c2394998c614520565b9590610c19565b82346102e55760206003193601126102e557610c5c613ede565b60045481526007602052600435600160408320015580f35b82346102e55760406003193601126102e557610c8e613968565b610c96613ede565b600435825260066020526001600160a01b036001604084200191167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b82346102e55760a06003193601126102e55760043567ffffffffffffffff81116104ce57610d0d903690600401613b32565b60243567ffffffffffffffff8111610b0557610d2d903690600401613b32565b9260443567ffffffffffffffff811161153f57610d4e903690600401613b32565b9490610d5861397e565b956002600154146114fb57600260015533966001600160a01b03811680611465575b5050610d9191610d8b913691613d42565b866143d6565b156113fb576004548087526009602052604087206001600160a01b038716600052602052604060002054156000146110c257506004548087526008602052604087206001600160a01b03871660005260205260ff6040600020541661105857610dfa8584613fa6565b90918852600d602052604088206007602052600160408a2001548952602052604088209167ffffffffffffffff821161102b57610e4182610e3b8554613c22565b8561408e565b8890601f8311600114610f9c579180610f2094927fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c989796948c92610f91575b50506000198260011b9260031b1c19161790555b6004548852600a602052604088206007602052600160408a2001548952602052604088206001600160a01b0388167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610f12610f0a60045497888b526007602052600160408c20015495613fa6565b929095613fa6565b916040519586958a87614103565b0390a18252600760205260016040832001610f3b8154613f97565b90555b600454825260086020526001600160a01b03604083209116600052602052604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556001805580f35b013590508b80610e81565b838a5260208a20918a5b601f1985168110611013575092610f2094926001927fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c9998979583601f19811610610ff9575b505050811b019055610e95565b60001960f88560031b161c199101351690558b8080610fec565b90926020600181928686013581550194019101610fa6565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b608460405162461bcd60e51b815260206004820152602360248201527f4c6976654d696e743a20557365722048617320416c726561647920526564656560448201527f6d656400000000000000000000000000000000000000000000000000000000006064820152fd5b929091938387526009602052604087206001600160a01b038716600052602052604060002054608435116113915783875260076020526040872060010154939461110e85608435613f4e565b95889089526009602052604089206001600160a01b038916600052602052604060002061113e6084358254613f8a565b90556004548952600760205286600160408b2001555b8686106111675750505050505050610f3e565b61117281848461402e565b6004548b52600d60205260408b20888c5260205260408b209167ffffffffffffffff8211611364578686868e868f9897968d968f9882610e3b6111b59254613c22565b8390601f831160011461129f578a61128e9c97611280976040886112889f9e9c98887fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c9f9b998799611269996112719c92611294575b50506000198260011b9260031b1c19161790555b6004548152600a6020528181208d8252602052206001600160a01b038b167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905561402e565b94909361402e565b92909160405196879687614103565b0390a1613f97565b95613f97565b94611154565b01359050388061120b565b83859c9a9b9c526020852091855b601f198516811061133157509b809a9761128097604061128e9f986112889f9c9860017fe7d6643cc84290c1210be3b0aeeb69be2975383f2f42e0f75a75e914b8e3c43c9f9b998799611269996112719c83601f19811610611317575b505050811b01905561121f565b60001960f88560031b161c1991013516905538808061130a565b975098506001939a508891929950809750602095508594500135815501940191018e8c968f968d968d968d968d966112ad565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b608460405162461bcd60e51b815260206004820152603b60248201527f4c6976654d696e743a20416d6f756e74204d757374204265204c65737320546860448201527f616e204f7220457175616c20546f205152416c6c6f636174696f6e00000000006064820152fd5b608460405162461bcd60e51b815260206004820152602b60248201527f4c6976654d696e743a2055736572204973204e6f7420456c696769626c65205460448201527f6f2052656465656d2051520000000000000000000000000000000000000000006064820152fd5b604051907f9c395bc200000000000000000000000000000000000000000000000000000000825289600483015260248201526020816044816d76a84fef008cdabe6409d2fe638b5afa9081156114f0578a916114d2575b506114c8575b80610d7a565b9650610d916114c2565b6114ea915060203d8111610717576107078183613a73565b8a6114bc565b6040513d8c823e3d90fd5b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b8580fd5b82346102e55761155236613de4565b90929161155e84614565565b92809181925b868410611579576040518061045d8882613e17565b83835260066020526001600160a01b0360408420541661159886614534565b8491855b8881106116315750506115ae82614534565b9185865b8281106115d5575050505081610558916105476115cf948a614520565b92611564565b6115df8185614520565b5115801590611616575b6115fc575b6115f790613f97565b6115b2565b9061160e6115f79161059d8487614520565b9190506115ee565b506116218185614520565b511580156115e9575080156115e9565b869a929a999799989498959395508a876040517f6352211e000000000000000000000000000000000000000000000000000000008152836004820152602081602481885afa908161173c575b50611737575060015b6116918c86886141b0565b358952601060205260408920838a5260205260ff60408a2054161590816116f0575b506116d4575b506116c390613f97565b99919998969897939794929461159c565b86826104966116c394996116e794614520565b9590508a6116b9565b90506116fd8c86886141b0565b358952600b60205260408920838a526020526001600160a01b0360408a205416159081159161172e575b508d6116b3565b9050158d611727565b611686565b909192506020813d602011611778575b8161175960209383613a73565b81010312611774579061176d8e93926141c0565b508e61167d565b8980fd5b3d915061174c565b82346102e55760206003193601126102e55761179a613ede565b60045481526007602052600435600360408320015580f35b82346102e5576117eb6117f2604061045d936117cd36613994565b908252600d6020528282209082526020522060405192838092613c75565b0382613a73565b604051918291602083526020830190613be2565b82346102e55760206003193601126102e5576040611870916004358152600760205220604051906118428261183b8184613c75565b0383613a73565b60018101549060036001600160a01b0360028301541691015490604051948594608086526080860190613be2565b926020850152604084015260608301520390f35b82346102e557806003193601126102e5576020600554604051908152f35b82346102e557806003193601126102e5576118bb613ede565b80808080478181156118df575b3390f1156118d35780f35b604051903d90823e3d90fd5b506108fc6118c8565b82346102e5576118f736613b97565b611902939193613ede565b61190d8184146142c5565b845b83811061191a578580f35b8061192961196c9284886141b0565b35600454885260206009815260408920906001600160a01b0361195061067f868b8b6141b0565b16600052526119656040600020918254613f4e565b9055613f97565b61190f565b82346102e55760406003193601126102e55761198b613968565b611993613ede565b600435825260066020526001600160a01b036040832091167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905580f35b82346102e5576020806003193601126104ce576001600160a01b036119f8613952565b611a00613ede565b166040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528281602481855afa908115611b59578491611b2c575b508015611ac2576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101919091529082908290604490829087905af18015611ab757611a9a578280f35b81611ab092903d10610717576107078183613a73565b5081808280f35b6040513d85823e3d90fd5b6084836040519062461bcd60e51b82526004820152602b60248201527f4c6976654d696e743a20302045524332302042616c616e63652041742060546f60448201527f6b656e41646472657373600000000000000000000000000000000000000000006064820152fd5b90508281813d8311611b52575b611b438183613a73565b81010312610b00575184611a43565b503d611b39565b6040513d86823e3d90fd5b82346102e55760206103f4611b7836613994565b906145ae565b82346102e557611b8d36613b97565b611b98939193613ede565b611ba38184146142c5565b845b838110611bb0578580f35b80611bbf611bf69284886141b0565b35600454885260206009815260408920906001600160a01b03611be661067f868b8b6141b0565b1660005252604060002055613f97565b611ba5565b82346102e557806003193601126102e5576001600160a01b036020915416604051908152f35b82346102e55760806003193601126102e5576004359067ffffffffffffffff8083116104ce57366023840112156104ce57826004013590808211610b09573660248386010111610b0957611c96611c7661397e565b94611c7f613ede565b60405193611c8c856139ee565b6024369201613e97565b825260209384830190604435825260408401916001600160a01b03809216835260608501937f69420694206942069420694206942069420694206942069420694206942069428552602435875260078852604087209551978851918211610ad357611d05826109f08954613c22565b80601f8311600114611d6c5750819088996003989992610a5f5750506000198260011b92881b1c1916178655516001860155600285019151167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790555191015580f35b9198601f198a16888a52838a20938a905b828210611da457505091600193918b60039a9b9c9410610aa357505050811b018655610a24565b80600186978294978701518155019601940190611d7d565b82346102e5576020611dd6611dd036613d90565b906143d6565b6040519015158152f35b82346102e55760206003193601126102e557611dfa613952565b600254906001600160a01b033381841603611e3b577fffffffffffffffffffffffff0000000000000000000000000000000000000000911691161760025580f35b608460405162461bcd60e51b815260206004820152602660248201527f6f6e6c794c61756e63687061643a2043616c6c6572204973204e6f74204c617560448201527f6e636870616400000000000000000000000000000000000000000000000000006064820152fd5b82346102e55760406003193601126102e5576001600160a01b036040611ec9613968565b92600435815260096020522091166000526020526020604060002054604051908152f35b82346102e55760206003193601126102e5577fdce35c6ead5e97f9a12a9dfe363465b6f62c5fab770d14f46f89c82c58819cc660206001600160a01b03611f32613952565b611f3a613ede565b1680845260138252836040812055604051908152a180f35b82346102e557806003193601126102e55760206001600160a01b0360025416604051908152f35b82346102e55760ff6040602092611f8f36613994565b9082526011855282822090825284522054166040519015158152f35b82346102e557806003193601126102e557611fc4613ede565b60006001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b82346102e5576020806003193601126104ce5760043567ffffffffffffffff8111610b0957612050903690600401613b32565b90612059613ede565b835b828110612066578480f35b600454808652601185526040862061207f8386866141b0565b358752855260ff6040872054166120f957906120f4918652600a8552604086206120aa8286866141b0565b35875285526040862073b96e81f80b3aeef65cb6d0e280b15fd5dbe719377fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055613f97565b61205b565b6084856040519062461bcd60e51b82526004820152602260248201527f4c6976654d696e743a205469636b657420494420416c7265616479204d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b9050346104ce576101006003193601126104ce576040519161218483613a39565b6001600160a01b03926004358481168103610b005781526024358481168103610b00576020938483019182526044358681168103610b0057604084019081526060840160643581526080850190608435825260a086019260a435845260c087019460c435865287019560e435875233895260138a527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60760408a2054148015612385575b8015612379575b1561230f5760079798999a83516005548c5260148d5260408c20556005548b5260068c528060408c209a5116917fffffffffffffffffffffffff000000000000000000000000000000000000000092838c5416178b558160018c019151168382541617905560028a0192511690825416179055516003870155516004860155516005850155516006840155519101556122c8600554613f97565b908160055560001982019182116122e25750604051908152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b60848a6040519062461bcd60e51b82526004820152603360248201527f4c6976654d696e74207c206f6e6c7941646d696e207c2043616c6c657220497360448201527f204e6f7420417070726f7665642041646d696e000000000000000000000000006064820152fd5b508a895416331461222e565b508a600254163314612227565b82346102e557806003193601126102e5576020600454604051908152f35b82346102e55760406003193601126102e5576001600160a01b0360406123d4613968565b9260043581526008602052209116600052602052602060ff604060002054166040519015158152f35b82346102e5576001600160a01b03604060209261241936613994565b908252600a85528282209082528452205416604051908152f35b82346102e55760206003193601126102e5576001600160a01b03612455613952565b61245d613ede565b168152601360205280604081205580f35b82346102e5576020806003193601126104ce5760043567ffffffffffffffff8111610b09576124a1903690600401613b32565b90338452601383526124d87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660408620541461413f565b835b8281106124e5578480f35b60045490818652601191828652604087206125018387876141b0565b358852865260ff60408820541661284d578652600a808652604087206125288387876141b0565b358852865260408720546001600160a01b0391908216156127455760045488528652604087206125598387876141b0565b358852865280604088205416905b8116928315612701576126089187916004548a5282526040892061258c8589896141b0565b358a5282526040808a2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556004805491517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0390931690830152602482015291829081906044820190565b03818a73dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af190811561071e5787916126d2575b507fff14a599c69a8ecfb96ffaa8bcd7cbf9b3b189ab8f5aca1c4d016335e234e199906126cd936004548952600e88526040892061266f8589896141b0565b358a5288528160408a20556112806126888589896141b0565b35926004548b52600d8a5260408b206126a2878b8b6141b0565b358c528a5260408b209060405194859485528b85015260408401526080806060850152830190613c75565b6124da565b90508581813d83116126fa575b6126e98183613a73565b81010312610b0057516126cd612630565b503d6126df565b6064876040519062461bcd60e51b82526004820152601b60248201527f4c6976654d696e743a20496e76616c696420526563697069656e7400000000006044820152fd5b5061014d6127548387876141b0565b351015612809576127668286866141b0565b35604051907f6d325d31000000000000000000000000000000000000000000000000000000008252600482015286816024818b73985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af19081156127fe5788916127c5575b5090612567565b90508681813d83116127f7575b6127dc8183613a73565b810103126127f3576127ed906141c0565b886127be565b8780fd5b503d6127d2565b6040513d8a823e3d90fd5b6064866040519062461bcd60e51b82526004820152601a60248201527f4c6976654d696e743a20496e76616c6964205469636b657449440000000000006044820152fd5b6084866040519062461bcd60e51b82526004820152602560248201527f4c6976654d696e743a20476f6c64656e20546f6b656e20416c7265616479204d60448201527f696e7465640000000000000000000000000000000000000000000000000000006064820152fd5b82346102e55760406020916128cb36613994565b908252600f845282822090825283522054604051908152f35b82346102e5576117eb6117f2604061045d936128ff36613994565b908252600c6020528282209082526020522060405192838092613c75565b82346102e557806003193601126102e5576040519061293b82613a56565b6103e8808352602091617d00368486013780916004546006810661014d908181029181830414901517156104a157835b8381106129f8575050505061297f82614534565b93815b83811061299c576040518581528061045d81880189613b63565b6129a68183614520565b51158015906129dd575b6129c3575b6129be90613f97565b612982565b916129d56129be91610bc48585614520565b9290506129b5565b506129e88183614520565b511580156129b0575080156129b0565b612a028282613f4e565b8386526011885260408620818752885260ff6040872054161580612a4f575b612a35575b50612a3090613f97565b61296b565b86612a4891610496612a3094998c614520565b9590612a26565b50838652600a88526040862081875288526001600160a01b036040872054161515612a21565b82346102e5576020806003193601126104ce5760408260809360608351612a9b816139ee565b8181528286820152828582015201526004358152600783522060405191612ac1836139ee565b604051612ad2816117eb8186613c75565b83526001820154918184019283526001600160a01b0390612b1f600383600284015416926040880193845201549360608701948552604051978897828952519188015260a0870190613be2565b93516040860152511660608401525160808301520390f35b9050346104ce5760206003193601126104ce576040610100926004358152600660205220906001600160a01b03908183541692826001820154169260028201541660038201546004830154906005840154926007600686015495015496604051988952602089015260408801526060870152608086015260a085015260c0840152820152f35b82346102e5576001600160a01b036040602092612bd936613994565b908252600b85528282209082528452205416604051908152f35b82346102e557612c0236613b97565b929190913385526013602052612c3d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660408720541461413f565b845b828110612c4a578580f35b612c59818484989697986141b0565b3595868552600660205260408520936001600160a01b036001818754169601541693865b612c8885858b614262565b9050811015612f7657612ca681612ca087878d614262565b906141b0565b35908a895260108060205260408a20838b52602052612ccc60ff60408c205416156141d4565b8b8a5260205260408920828a526020526040892060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051917f6d325d310000000000000000000000000000000000000000000000000000000083528060048401526040836024818d8d5af180156114f0578a938b91612f41575b5060648103612e7557508960206001600160a01b03600354166024604051809481937fd15776560000000000000000000000000000000000000000000000000000000083526001600160a01b038a1660048401525af1908115612e6a578d92918c918291612e2f575b5060407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad9493612e2a9793611280939283915b878152600f602052818120848252602052205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b612c7d565b92935050506020813d602011612e62575b81612e4d60209383613a73565b81010312610b0057518c91908b906040612db8565b3d9150612e40565b6040513d8d823e3d90fd5b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260248101919091526020816044818e8d5af1908115612e6a578d92918c918291612f06575b5060407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad9493612e2a979361128093928391612deb565b92935050506020813d602011612f39575b81612f2460209383613a73565b81010312610b0057518c91908b906040612ecf565b3d9150612f17565b9050612f6691935060403d604011612f6f575b612f5e8183613a73565b810190614245565b9290928d612d4f565b503d612f54565b509450925094939550612f8890613f97565b919091612c3f565b82346102e55760606003193601126102e557612faa613952565b81612fb3613968565b91612fbc613ede565b6001600160a01b0380911692833b15610b09576064908360405195869485937f23b872dd00000000000000000000000000000000000000000000000000000000855230600486015216602484015260443560448401525af1801561306457613022575080f35b67ffffffffffffffff81116130375760405280f35b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6040513d84823e3d90fd5b82346102e557806003193601126102e5576040519061308d82613a56565b6103e8808352602091617d00368486013760045461014d6006820681810294929181159186041417156131c8578293835b83811061314b57505050506130d282614534565b93815b8381106130ef576040518581528061045d81880189613b63565b6130f98183614520565b5115801590613130575b613116575b61311190613f97565b6130d5565b9161312861311191610bc48585614520565b929050613108565b5061313b8183614520565b5115801561310357508015613103565b6131558282613f4e565b8386526011885260408620818752885260ff60408720541615806131a2575b613188575b5061318390613f97565b6130be565b8661319b9161049661318394998c614520565b9590613179565b50838652600a88526040862081875288526001600160a01b036040872054161515613174565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b82346102e55760ff604060209261320b36613994565b9082526010855282822090825284522054166040519015158152f35b82346102e55760206003193601126102e55760406020916004358152601483522054604051908152f35b82346102e557604060209161326536613994565b9082526012845282822090825283522054604051908152f35b82346102e55760206003193601126102e5576001600160a01b036132a0613952565b6132a8613ede565b16815260136020527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6604082205580f35b82346102e55760406003193601126102e557602490600435823567ffffffffffffffff8111610b0957613310903690600401613b32565b91909133845260206013815261334b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a660408720541461413f565b8285526006815260408520916001600160a01b038084541695816001809601541690601485526040892054156136e15786895260148552604089205484116136785790889991878a98999a52601486526133a98560408a2054613f8a565b898952601487526040892055875b8581106133c2578880f35b806133cf8a9288856141b0565b358b83526010808a52604084208285528a526133f260ff604086205416156141d4565b8c84528952604083208184528952604083208a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905560408d878251809681937f6d325d310000000000000000000000000000000000000000000000000000000083528660048401525af1908115612e6a57898c9283958491613653575b50606481036135885750886003541688604051809581937fd15776560000000000000000000000000000000000000000000000000000000083528d8a1660048401525af190811561357d578a8d928f948491613541575b509261353c96926112809260407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad97969384925b888252600f81528282209085835252205560405194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b6133b7565b93505090925081813d8311613576575b61355b8183613a73565b8101031261357257518c918c918b9061353c6134cb565b8b80fd5b503d613551565b6040513d8e823e3d90fd5b6040517f891407c00000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602481019190915292839060449082908a5af190811561357d578a8d928f94849161361b575b509261353c96926112809260407f63e2ac9188fe2de978d4fb15017e0654ffd728f711404cb267e805ffdcf6b8ad97969384926134ff565b93505090925081813d831161364c575b6136358183613a73565b8101031261357257518c918c918b9061353c6135e3565b503d61362b565b905061366f91955060403d604011612f6f57612f5e8183613a73565b94909438613474565b60848560358c6040519262461bcd60e51b845260048401528201527f4c6976654d696e743a205469636b65744944204c656e6774682045786365656460448201527f73204172746973744944204d696e74204c696d697400000000000000000000006064820152fd5b60848560258c6040519262461bcd60e51b845260048401528201527f4c6976654d696e743a204172746973744944204d696e74204c696d697420526560448201527f61636865640000000000000000000000000000000000000000000000000000006064820152fd5b82346102e5576101206003193601126102e55761380e61376936613a96565b613771613ede565b6004356000526006602052600760e06040600020926001600160a01b03808251167fffffffffffffffffffffffff00000000000000000000000000000000000000009081875416178655600186018260208501511682825416179055600286019160408401511690825416179055606081015160038501556080810151600485015560a0810151600585015560c081015160068501550151910155565b80f35b82346102e55760206003193601126102e5576001600160a01b03613833613952565b61383b613ede565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035580f35b82346102e55761387736613994565b909161388282614534565b92815b83811061389a576040518061045d87826139aa565b6138c8908284526020600b81526040852090828652526001600160a01b036040852054166104968288614520565b613885565b82346102e55760206003193601126102e5577f2c74592fddad593c2c4403101ce9b30930711ab87571268ddd1e1989ee1d791760206001600160a01b03613912613952565b61391a613ede565b16808452601382527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6076040852055604051908152a180f35b600435906001600160a01b0382168203610b0057565b602435906001600160a01b0382168203610b0057565b606435906001600160a01b0382168203610b0057565b6003196040910112610b00576004359060243590565b6020908160408183019282815285518094520193019160005b8281106139d1575050505090565b83516001600160a01b0316855293810193928101926001016139c3565b6080810190811067ffffffffffffffff821117613a0a57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610100810190811067ffffffffffffffff821117613a0a57604052565b617d20810190811067ffffffffffffffff821117613a0a57604052565b90601f601f19910116810190811067ffffffffffffffff821117613a0a57604052565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc610100910112610b005760405190613ace82613a39565b816001600160a01b036024358181168103610b005782526044358181168103610b005760208301526064359081168103610b00576040820152608435606082015260a435608082015260c43560a082015260e43560c082015260e061010435910152565b9181601f84011215610b005782359167ffffffffffffffff8311610b00576020808501948460051b010111610b0057565b90815180825260208080930193019160005b828110613b83575050505090565b835185529381019392810192600101613b75565b6040600319820112610b005767ffffffffffffffff91600435838111610b005782613bc491600401613b32565b93909392602435918211610b0057613bde91600401613b32565b9091565b919082519283825260005b848110613c0e575050601f19601f8460006020809697860101520116010190565b602081830181015184830182015201613bed565b90600182811c92168015613c6b575b6020831014613c3c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613c31565b9060009291805491613c8683613c22565b918282526001938481169081600014613ce85750600114613ca8575b50505050565b90919394506000526020928360002092846000945b838610613cd4575050505001019038808080613ca2565b805485870183015294019385908201613cbd565b91505060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009193501683830152151560051b01019038808080613ca2565b67ffffffffffffffff8111613a0a5760051b60200190565b9291613d4d82613d2a565b91613d5b6040519384613a73565b829481845260208094019160051b8101928311610b0057905b828210613d815750505050565b81358152908301908301613d74565b906040600319830112610b00576004356001600160a01b0381168103610b0057916024359067ffffffffffffffff8211610b005780602383011215610b0057816024613de193600401359101613d42565b90565b6040600319820112610b00576004359067ffffffffffffffff8211610b0057613e0f91600401613b32565b909160243590565b602080820190808352835180925260408301928160408460051b8301019501936000915b848310613e4b5750505050505090565b9091929394958480613e87837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc086600196030187528a51613b63565b9801930193019194939290613e3b565b92919267ffffffffffffffff8211613a0a5760405191613ec16020601f19601f8401160184613a73565b829481845281830111610b00578281602093846000960137010152565b6001600160a01b03600054163303613ef257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b90816020910312610b0057518015158103610b005790565b91908201809211613f5b57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908203918211613f5b57565b6000198114613f5b5760010190565b9015613fff578035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b0057019081359167ffffffffffffffff8311610b00576020018236038113610b00579190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015613fff5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b0057019081359167ffffffffffffffff8311610b00576020018236038113610b00579190565b90601f811161409c57505050565b600091825260208220906020601f850160051c830194106140d8575b601f0160051c01915b8281106140cd57505050565b8181556001016140c1565b90925082906140b8565b601f8260209493601f19938186528686013760008582860101520116010190565b94929093614131926001600160a01b03613de1989616875260208701526080604087015260808601916140e2565b9260608185039101526140e2565b1561414657565b608460405162461bcd60e51b815260206004820152603960248201527f4c6976654d696e74207c206f6e6c794d696e746572207c2043616c6c6572204960448201527f73204e6f7420417070726f76656420425254204d696e746572000000000000006064820152fd5b9190811015613fff5760051b0190565b51906001600160a01b0382168203610b0057565b156141db57565b608460405162461bcd60e51b815260206004820152602960248201527f4c6976654d696e743a20417274697374204d696e74205061737320416c72656160448201527f6479204d696e74656400000000000000000000000000000000000000000000006064820152fd5b9190826040910312610b0057602061425c836141c0565b92015190565b9190811015613fff5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b0057019081359167ffffffffffffffff8311610b00576020018260051b36038113610b00579190565b156142cc57565b608460405162461bcd60e51b815260206004820152602160248201527f4c6976654d696e743a20496e70757420417272617973204d757374204d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152fd5b356001600160a01b0381168103610b005790565b9061435590826143d6565b80614361575050600090565b80806143a8575b15614397575060045460005260096020526001600160a01b036040600020911660005260205260406000205490565b1590506143a357600190565b600090565b50600454600052600960205260406000206001600160a01b0383166000526020526040600020541515614368565b9091604090815192602093848101907fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008360601b1682526014815284810181811067ffffffffffffffff821117613a0a57855251902093600454926000938085526007835260038686200154969385945b895186101561448a5761445a868b614520565b51908181101561447a578752845261447487872095613f97565b94614447565b9087528452614474878720611288565b9195979298509295935014938493846144f9575b85156144b7575b5050505050600014613de15750600190565b90919293809550946144d2575b5050505038808080806144a5565b8552600981528285206001600160a01b0390921685525282205415159050388080806144c4565b808752600882528387206001600160a01b038416885282528387205460ff1615955061449e565b8051821015613fff5760209160051b010190565b9061453e82613d2a565b61454b6040519182613a73565b828152601f1961455b8294613d2a565b0190602036910137565b9061456f82613d2a565b61457c6040519182613a73565b828152601f1961458c8294613d2a565b019060005b82811061459d57505050565b806060602080938501015201614591565b9060009082825260106020526040822081835260205260ff604083205416156000146145dd5750505060001990565b6040928252600f602052828220908252602052205490565b9060009082825260116020526040822081835260205260ff604083205416156000146146245750505060001990565b6040928252600e60205282822090825260205220549056fea264697066735822122059927135faf2c60aabf347cfd0766f32905dc1d9b47f1f2614ff958346434c5c64736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.