Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 949 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
__Withdraw Ether | 19785116 | 278 days ago | IN | 0 ETH | 0.00016965 | ||||
_Live Mint Citiz... | 19712171 | 289 days ago | IN | 0 ETH | 0.00924647 | ||||
_Live Mint Citiz... | 19712166 | 289 days ago | IN | 0 ETH | 0.01366747 | ||||
_Live Mint Citiz... | 19712154 | 289 days ago | IN | 0 ETH | 0.19983286 | ||||
Redeem QR | 19712144 | 289 days ago | IN | 0 ETH | 0.01857481 | ||||
__QR Allocations... | 19712140 | 289 days ago | IN | 0 ETH | 0.00057974 | ||||
__QR Allocations... | 19712133 | 289 days ago | IN | 0 ETH | 0.00058232 | ||||
__Change Roots | 19712129 | 289 days ago | IN | 0 ETH | 0.00062723 | ||||
_Live Mint Citiz... | 19712121 | 289 days ago | IN | 0 ETH | 0.0088045 | ||||
Redeem QR | 19712118 | 289 days ago | IN | 0 ETH | 0.00146593 | ||||
__Change Roots | 19712116 | 289 days ago | IN | 0 ETH | 0.00053213 | ||||
__QR Allocations... | 19712113 | 289 days ago | IN | 0 ETH | 0.00062496 | ||||
_Live Mint Citiz... | 19712093 | 289 days ago | IN | 0 ETH | 0.00956091 | ||||
_Live Mint Citiz... | 19712088 | 289 days ago | IN | 0 ETH | 0.00827934 | ||||
_Live Mint Citiz... | 19712078 | 289 days ago | IN | 0 ETH | 0.0092885 | ||||
_Live Mint Citiz... | 19712075 | 289 days ago | IN | 0 ETH | 0.02825323 | ||||
_Live Mint Citiz... | 19712069 | 289 days ago | IN | 0 ETH | 0.00970384 | ||||
Redeem QR | 19712067 | 289 days ago | IN | 0 ETH | 0.00357069 | ||||
__Change Roots | 19712061 | 289 days ago | IN | 0 ETH | 0.00073175 | ||||
_Live Mint Citiz... | 19712056 | 289 days ago | IN | 0 ETH | 0.00978301 | ||||
__QR Allocations... | 19712055 | 289 days ago | IN | 0 ETH | 0.00103734 | ||||
Redeem QR | 19712054 | 289 days ago | IN | 0.02 ETH | 0.00269135 | ||||
__Delegate QR | 19712041 | 289 days ago | IN | 0 ETH | 0.00055543 | ||||
__Delegate QR | 19712041 | 289 days ago | IN | 0 ETH | 0.00154805 | ||||
__Delegate QR | 19712037 | 289 days ago | IN | 0 ETH | 0.00172345 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LiveMintVenice
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 { 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"; contract LiveMintVenice is Ownable, ReentrancyGuard { struct City { string _Name; // _Name uint _QRCurrentIndex; // _QRCurrentIndex bytes32 _RootEligibility; // _RootEligibility bytes32 _RootAmount; // _RootAmount bool _RemoteMintingEnabledCitizens; // _RemoteMintingEnabledCitizen } /*-------------------*/ /* 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; // CryptoCitizen Minter Contract address private constant _BRT_MULTISIG = 0xB96E81f80b3AEEf65CB6d0E280b15FD5DBE71937; // BRT Multisig address private _FINALE_MINTER = 0x6b611F416C9ef3c704540Ce98CdC05B748Ef7C19; // Finale Minter uint private constant _CCI = 9; // CryptoCitizen City Index uint private _FMI = 0; // Finale Minter Index uint public _MaxQRDelegationsPerDay = 25; // Max QR Delegations Per Day bool public _QRDelegationsEnabled = true; // QR Delegations Enabled /*-------------------*/ /* MAPPINGS */ /*-------------------*/ 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 => bool)) public _MintedCitizen; // [CityIndex][TicketID] => If Golden Ticket ID Has Minted Or Not mapping(uint => mapping(address => uint)) public _QRsRedeemed; // [CityIndex][Wallet] => Amount Of QRs Redeemed mapping(uint => uint) public DailyCalls; // [Day] => Amount Of QR Delegations Made mapping(address => bytes32) public Role; // [Wallet] => BRT Minter Role /*-------------------*/ /* EVENTS */ /*-------------------*/ /** * @dev Emitted When `Redeemer` IRL-mints CryptoCitizen Corresponding To Their Redeemed `TicketID`. **/ event LiveMintComplete(address Redeemer, uint TicketID, uint TokenID, uint TokenID2); /** * @dev Emitted When A Finale Batch Mint Is Complete */ event LiveMintBatchComplete(address[] Recipients, uint[] TicketIDs, uint[] MintedWorkTokenIDs); /** * @dev Emitted When `Redeemer` Redeems Golden Token Corresponding To `TicketID` **/ event QRRedeemed(address Redeemer, uint TicketID); /** * @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[9]._Name = "CryptoVenezians"; Cities[9]._QRCurrentIndex = 1332; Role[0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700] = _AUTHORIZED; // `operator.brightmoments.eth` Role[0x18B7511938FBe2EE08ADf3d4A24edB00A5C9B783] = _AUTHORIZED; // `phil.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 _transferOwnership(0xe06F5FAE754e81Bc050215fF89B03d9e9FF20700); // `operator.brightmoments.eth` } /*---------------------*/ /* QR REDEMPTION */ /*---------------------*/ /** * @dev Redeems Spot(s) For IRL Minting * @param ProofEligibility Proof For Merkle Eligibility * @param ProofAmounts Proof For Merkle Amounts * @param Vault Address Of Vault For Merkle Eligibility (Delegate.xyz) * @param Amount Amount Of QR Codes To Redeem * note: Will Input ETH For Minting Gas Fee Coverage */ function RedeemQR ( bytes32[] calldata ProofEligibility, bytes32[] calldata ProofAmounts, address Vault, uint Amount ) external payable nonReentrant { address Recipient = msg.sender; if(Vault != address(0)) { if(IDelegationRegistry(_DN).checkDelegateForAll(msg.sender, Vault)) { Recipient = Vault; } } readQREligibility(Recipient, ProofEligibility, ProofAmounts, Amount); _QRsRedeemed[_CCI][Recipient] += Amount; if(_QRAllocation[_CCI][Recipient] == 0) // User Is Able To Redeem Explicitly 1 QR Code { require(!_QRRedeemed[_CCI][Recipient], "LiveMint: User Has Already Redeemed"); _BrightListCitizen[_CCI][Cities[_CCI]._QRCurrentIndex] = Recipient; emit QRRedeemed(Recipient, Cities[_CCI]._QRCurrentIndex); Cities[_CCI]._QRCurrentIndex++; } else // User Is Able To Redeem More Than 1 QR Code Because Their Allocation Is Greater Than 1 { require ( _QRsRedeemed[_CCI][Recipient] <= _QRAllocation[_CCI][Recipient], "LiveMint: User Has No Remaining Authorized QRs To Redeem" ); uint _CurrentQR = Cities[_CCI]._QRCurrentIndex; uint _Limit = Amount + _CurrentQR; uint _Counter; Cities[_CCI]._QRCurrentIndex = _Limit; for(_CurrentQR; _CurrentQR < _Limit; _CurrentQR++) { _BrightListCitizen[_CCI][_CurrentQR] = Recipient; emit QRRedeemed(Recipient, _CurrentQR); _Counter++; } } _QRRedeemed[_CCI][Recipient] = true; } /** * @dev Remote Mints GoldenTokens For Citizens * @param TicketIDs Array Of TicketIDs To Mint */ function RemoteMintCitizens(uint[] calldata TicketIDs) external nonReentrant { require(tx.origin == msg.sender, "LiveMint: msg.sender Must Be EOA"); require(Cities[_CCI]._RemoteMintingEnabledCitizens, "LiveMint: Remote Minting Of Citizens Not Active"); address Recipient; uint MintedWorkTokenID; uint AdditionalTokenID; for(uint TicketID; TicketID < TicketIDs.length; TicketID++) { require(TicketIDs[TicketID] < 1332, "LiveMint: Invalid Input TicketID, Must Be Golden Token"); require(!_MintedCitizen[_CCI][TicketIDs[TicketID]], "LiveMint: Golden Token Already Minted"); _MintedCitizen[_CCI][TicketIDs[TicketID]] = true; Recipient = IGT(_GOLDEN_TOKEN)._LiveMintBurn(TicketIDs[TicketID]); require(Recipient == msg.sender, "LiveMint: msg.sender Is Not Owner Of Golden Token"); MintedWorkTokenID = IMinter(_CITIZEN_MINTER).purchaseTo(Recipient, _CCI); AdditionalTokenID = IMinter(_FINALE_MINTER).purchaseTo(Recipient, _FMI); emit LiveMintComplete(Recipient, TicketIDs[TicketID], MintedWorkTokenID, AdditionalTokenID); } } /*--------------------*/ /* LIVE MINTING */ /*--------------------*/ /** * @dev Batch Mints Verified Users On The Brightlist CryptoCitizens * @param TicketIDs Array Of TicketIDs To Mint * note: { For CryptoCitizen Cities } */ function _LiveMintCitizen(uint[] calldata TicketIDs) external onlyMinter { address Recipient; uint MintedWorkTokenID; uint AdditionalTokenID; for(uint TicketID; TicketID < TicketIDs.length; TicketID++) { require(!_MintedCitizen[_CCI][TicketIDs[TicketID]], "LiveMint: Golden Token Already Minted"); if(_BrightListCitizen[_CCI][TicketIDs[TicketID]] != address(0)) { Recipient = _BrightListCitizen[_CCI][TicketIDs[TicketID]]; } else if (TicketIDs[TicketID] < 1332) { Recipient = IGT(_GOLDEN_TOKEN)._LiveMintBurn(TicketIDs[TicketID]); } else { revert("LiveMint: TicketID Is Not Eligible To Mint Citizen"); } _MintedCitizen[_CCI][TicketIDs[TicketID]] = true; MintedWorkTokenID = IMinter(_CITIZEN_MINTER).purchaseTo(Recipient, _CCI); // Citizen Mint AdditionalTokenID = IMinter(_FINALE_MINTER).purchaseTo(Recipient, _FMI); // Finale Mint emit LiveMintComplete(Recipient, TicketIDs[TicketID], MintedWorkTokenID, AdditionalTokenID); } } /** * @dev Batch Mints Verified Users On The Brightlist CryptoCitizens */ function _LiveMintCitizenBatch(uint[] calldata TicketIDs) external onlyMinter { address[] memory Recipients; uint[] memory MintedWorkTokenIDs; for(uint TicketID; TicketID < TicketIDs.length; TicketID++) { require(!_MintedCitizen[_CCI][TicketIDs[TicketID]], "LiveMint: Golden Token Already Minted"); if(_BrightListCitizen[_CCI][TicketIDs[TicketID]] != address(0)) { Recipients[TicketID] = _BrightListCitizen[_CCI][TicketIDs[TicketID]]; } else if (TicketIDs[TicketID] < 1332) { Recipients[TicketID] = IGT(_GOLDEN_TOKEN)._LiveMintBurn(TicketIDs[TicketID]); } else { revert("LiveMint: TicketID Is Not Eligible To Mint Citizen"); } _MintedCitizen[_CCI][TicketIDs[TicketID]] = true; } MintedWorkTokenIDs = IMinter(_FINALE_MINTER).purchaseToBatch(Recipients); emit LiveMintBatchComplete(Recipients, TicketIDs, MintedWorkTokenIDs); } /*-------------------*/ /* ADMIN FUNCTIONS */ /*-------------------*/ /** * @dev Changes The Current Active Marketplace Address * @param Recipient The Recipient Of The QR */ function __DelegateQR (address Recipient) external onlyAdmin { require(_QRDelegationsEnabled, "LiveMint: QR Delegations Not Enabled"); uint _DaysElapsed = block.timestamp / 86400; require(DailyCalls[_DaysElapsed] + 1 <= _MaxQRDelegationsPerDay, "LiveMint: Max Per Day Reached"); require(!_QRRedeemed[_CCI][Recipient], "LiveMint: User Has Already Redeemed"); DailyCalls[_DaysElapsed]++; _QRRedeemed[_CCI][Recipient] = true; _BrightListCitizen[_CCI][Cities[_CCI]._QRCurrentIndex] = Recipient; emit QRRedeemed(Recipient, Cities[_CCI]._QRCurrentIndex); Cities[_CCI]._QRCurrentIndex++; } /** * @dev Changes Merkle Root For Citizen LiveMint Eligibility * @param NewRoot The New Merkle Root To Seed */ function __ChangeRootEligibility (bytes32 NewRoot) external onlyAdmin { Cities[_CCI]._RootEligibility = NewRoot; } /** * @dev Changes Merkle Root For Citizen LiveMint Amounts * @param NewRoot The New Merkle Root To Seed */ function __ChangeRootAmounts (bytes32 NewRoot) external onlyAdmin { Cities[_CCI]._RootAmount = NewRoot; } /** * @dev Changes Merkle Root For Artist LiveMints * @param EligibilityRoot The New Merkle Eligibility Root To Seed * @param EligibilityAmount The New Merkle Amount Root To Seed */ function __ChangeRoots (bytes32 EligibilityRoot, bytes32 EligibilityAmount) external onlyAdmin { Cities[_CCI]._RootEligibility = EligibilityRoot; Cities[_CCI]._RootAmount = EligibilityAmount; } /** * @dev Overwrites QR Allocation(s) * @param Addresses Array Of Addresses To Overwrite * @param Amounts Array Of Amounts To Overwrite */ function __QRAllocationsOverwrite (address[] calldata Addresses, uint[] calldata Amounts) external onlyAdmin { require(Addresses.length == Amounts.length, "LiveMint: Input Arrays Must Match"); for(uint x; x < Addresses.length; x++) { _QRAllocation[_CCI][Addresses[x]] = Amounts[x]; } } /** * @dev Increments QR Allocation(s) * @param Addresses Array Of Addresses To Increment * @param Amounts Array Of Amounts To Increment */ function __QRAllocationsIncrement (address[] calldata Addresses, uint[] calldata Amounts) external onlyAdmin { require(Addresses.length == Amounts.length, "LiveMint: Input Arrays Must Match"); for(uint x; x < Addresses.length; x++) { _QRAllocation[_CCI][Addresses[x]] += Amounts[x]; } } /** * @dev Overrides QR To Mint To Multisig * @param TicketIDs Array Of TicketIDs To Override */ function __QRAllocationsSetNoShow (uint[] calldata TicketIDs) external onlyAdmin { for(uint TicketIndex; TicketIndex < TicketIDs.length; TicketIndex++) { require(!_MintedCitizen[_CCI][TicketIDs[TicketIndex]], "LiveMint: Ticket ID Already Minted"); require(TicketIDs[TicketIndex] >= 1332, "LiveMint: Invalid TicketID"); _BrightListCitizen[_CCI][TicketIDs[TicketIndex]] = _BRT_MULTISIG; } } /*-------------------*/ /* OWNER FUNCTIONS */ /*-------------------*/ /** * @dev Flips Remote Minting State For CryptoCitizens (True or False) */ function __FlipRemoteMintingCitizens() external onlyOwner { Cities[_CCI]._RemoteMintingEnabledCitizens = !Cities[_CCI]._RemoteMintingEnabledCitizens; } /** * @dev Grants Address BRT Minter Role * @param Minter Address To Grant Role * note: BRT Minter Role Is Required To Mint NFTs **/ function __AddMinter(address Minter) external onlyOwner { Role[Minter] = _MINTER_ROLE; } /** * @dev Deactivates Address From BRT Minter Role * @param Minter Address To Remove Role * note: BRT Minter Role Is Required To Mint NFTs **/ function __RemoveMinter(address Minter) external onlyOwner { Role[Minter] = 0x0; } /** * @dev Changes QR Current Index * @param NewIndex The Next QR Index To Redeem */ function __ChangeQRIndex(uint NewIndex) external onlyOwner { Cities[_CCI]._QRCurrentIndex = NewIndex; } /** * @dev Changes The Finale Minter * @param NewMinter The New Minter Address */ function __ChangeFinaleMinter(address NewMinter) external onlyOwner { _FINALE_MINTER = NewMinter; } /** * @dev Changes The Finale Minter Index * @param NewIndex The New Minter Index */ function __ChangeFinaleMinterIndex(uint NewIndex) external onlyOwner { _FMI = NewIndex; } /** * @dev Withdraw ETH Call */ function __WithdrawETHCall() external onlyOwner { (bool success,) = msg.sender.call{value:(address(this).balance)}(""); require(success, "i have failed u anakin"); } /** * @dev Withdraws Any Ether Mistakenly Sent to Contract to msg sender **/ function __WithdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } /** * @dev Executes Arbitrary Transaction(s) * @param Targets Array Of Addresses To Execute Transactions On * @param Values Array Of Values To Execute Transactions With * @param Datas Array Of Datas To Execute Transactions With */ function __InitTransaction(address[] memory Targets, uint[] memory Values, bytes[] memory Datas) external onlyOwner { for(uint x; x < Targets.length; x++) { (bool success,) = Targets[x].call{value:(Values[x])}(Datas[x]); require(success, "i have failed u anakin"); } } /** * @dev Authorizes An Address * @param NewAddress Address To Authorize */ function ____AddressAuthorize(address NewAddress) external onlyOwner { Role[NewAddress] = _AUTHORIZED; emit AuthorizedContract(NewAddress); } /** * @dev Deauthorizes An Address * @param NewAddress Address To Deauthorize */ function ___DeauthorizeAddress(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, bytes32[] memory ProofAmount, uint Amount ) public view returns (uint ) { bool Eligible = readQREligibility(Recipient, Proof, ProofAmount, Amount); uint Allocation = _QRAllocation[_CCI][Recipient]; uint AmountRedeemed = _QRsRedeemed[_CCI][Recipient]; if(Eligible && Allocation > AmountRedeemed) { return Allocation - AmountRedeemed; } else if (Eligible && Allocation == 0 && AmountRedeemed == 0) { return 1; } else { return 0; } } /** * @dev Returns If User Is Eligible To Redeem QR Code */ function readQREligibility ( address Recipient, bytes32[] memory ProofEligibility, bytes32[] memory ProofAmount, uint Amount ) public view returns (bool) { require(Amount > 0, "LiveMint: QR Redemption Amount Must Be > 0"); bytes32 Leaf = keccak256(abi.encodePacked(Recipient)); bytes32 LeafAmount = keccak256(abi.encodePacked(Recipient, Amount)); require(MerkleProof.verify(ProofEligibility, Cities[_CCI]._RootEligibility, Leaf), "LiveMint: Invalid Merkle Eligibility Proof"); require(MerkleProof.verify(ProofAmount, Cities[_CCI]._RootAmount, LeafAmount), "LiveMint: Invalid Merkle Amount Proof"); return true; } /** * @dev Returns How Many QR Codes A User Has Redeemed */ function readAmountRedeemed(address Recipient) public view returns(uint) { return _QRsRedeemed[_CCI][Recipient]; } /** * @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 = (_CCI % 6) * 333; uint _TokenID; for(uint TokenID; TokenID < 1000; TokenID++) { _TokenID = TokenID + CityIDBuffer; if ( (!_MintedCitizen[_CCI][_TokenID] && _BrightListCitizen[_CCI][_TokenID] != address(0)) || (!_MintedCitizen[_CCI][_TokenID] && _TokenID < 1332) ) { UnmintedTokenIDs[Counter] = _TokenID; Counter++; } } uint[] memory FormattedUnMintedTokenIDs = new uint[](Counter); for(uint Index; Index < Counter; Index++) { FormattedUnMintedTokenIDs[Index] = UnmintedTokenIDs[Index]; } 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 = (_CCI % 6) * 333; uint _TicketID; uint Counter; for(uint TicketID; TicketID < 1000; TicketID++) { _TicketID = TicketID + CityIDBuffer; if( !_MintedCitizen[_CCI][_TicketID] && _BrightListCitizen[_CCI][_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 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 The City Struct At Index Of `CityIndex` */ function readCitizenCity(uint CityIndex) public view returns(City memory) { return Cities[CityIndex]; } /*-------------------------*/ /* 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 == owner(), "LiveMint | onlyAdmin | Caller Is Not Approved Admin"); _; } } /** * @dev Interface For Delegate.cash */ 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.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.2) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 proofLen = proof.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]) : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { require(proofPos == proofLen, "MerkleProof: invalid multiproof"); unchecked { return hashes[totalHashes - 1]; } } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT /** * @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); function _MintToFactory(uint ProjectID, address To, uint Amount) external; // MintPassFactory function _MintToFactory(address To, uint Amount) external; // MintPassBespoke function purchaseToBatch(address[] memory _to) payable external returns (uint[] memory tokenIDs); // ArtBlocks Batch Minter, Mints Citizen & Finale Simultaneously }
// 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); }
{ "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":"Recipients","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"MintedWorkTokenIDs","type":"uint256[]"}],"name":"LiveMintBatchComplete","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":"uint256","name":"TokenID2","type":"uint256"}],"name":"LiveMintComplete","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"}],"name":"QRRedeemed","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Cities","outputs":[{"internalType":"string","name":"_Name","type":"string"},{"internalType":"uint256","name":"_QRCurrentIndex","type":"uint256"},{"internalType":"bytes32","name":"_RootEligibility","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmount","type":"bytes32"},{"internalType":"bool","name":"_RemoteMintingEnabledCitizens","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"DailyCalls","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmounts","type":"bytes32[]"},{"internalType":"address","name":"Vault","type":"address"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"RedeemQR","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"RemoteMintCitizens","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":"_BrightListCitizen","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"_LiveMintCitizen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"TicketIDs","type":"uint256[]"}],"name":"_LiveMintCitizenBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_MaxQRDelegationsPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"","type":"address"}],"name":"_QRAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_QRDelegationsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"_QRsRedeemed","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":"NewMinter","type":"address"}],"name":"__ChangeFinaleMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"NewIndex","type":"uint256"}],"name":"__ChangeFinaleMinterIndex","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":"__ChangeRootAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"NewRoot","type":"bytes32"}],"name":"__ChangeRootEligibility","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"EligibilityRoot","type":"bytes32"},{"internalType":"bytes32","name":"EligibilityAmount","type":"bytes32"}],"name":"__ChangeRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"}],"name":"__DelegateQR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__FlipRemoteMintingCitizens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"Targets","type":"address[]"},{"internalType":"uint256[]","name":"Values","type":"uint256[]"},{"internalType":"bytes[]","name":"Datas","type":"bytes[]"}],"name":"__InitTransaction","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":[],"name":"__WithdrawETHCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"__WithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"___DeauthorizeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"NewAddress","type":"address"}],"name":"____AddressAuthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"}],"name":"readAmountRedeemed","outputs":[{"internalType":"uint256","name":"","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":"bytes32","name":"_RootEligibility","type":"bytes32"},{"internalType":"bytes32","name":"_RootAmount","type":"bytes32"},{"internalType":"bool","name":"_RemoteMintingEnabledCitizens","type":"bool"}],"internalType":"struct LiveMintVenice.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":[],"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[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"readEligibility","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"Recipient","type":"address"},{"internalType":"bytes32[]","name":"ProofEligibility","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ProofAmount","type":"bytes32[]"},{"internalType":"uint256","name":"Amount","type":"uint256"}],"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
60806040818152346200031b5760008054336001600160a01b0319808316821784557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0926001600160a01b0392908316848680a36001808055736b611f416c9ef3c704540ce98cdc05b748ef7c198260025416176002558460035560196004558060ff19600554161760055560098552600660205285852080548281811c9116801562000310575b6020821014620002fc57601f8111620002d0575b509061053491601e6e43727970746f56656e657a69616e7360881b019055600986526006602052868620015573e06f5fae754e81bc050215ff89b03d9e9ff2070094858552600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60780828720557318b7511938fbe2ee08adf3d4a24edb00a5c9b783865281862055731a0a3e3ae390a0710f8a6d00587082273ea8f6c985527f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6908181872055734d8013b0c264034cbf22de9df33e22f58d52f20786528181872055734d9a8cf2fe52b8d49c7f7eaa87b2886c2bcb41608652818187205573124fd966a0d83aa020d3c54ae2c9f4800b46f4608652818187205573100469fea90ac1fe1073e1b2b5c020a8413635c48652818187205573756de4236373fd17652b377315954ca327412bba8652818187205573c5dfba6ef7803665c1bde478b51bd7eb257a2cb98652818187205573fbf32b29bcf8fee32d43a4bfd3e7249daec457c08652818187205573f2a15a83dee7f03c70936449037d65a1c100ff2786528181872055731d2bab965a4bb72f177cd641c7bacf3d8257230d86528181872055732e51e8b950d72bdf003b58e357c2ba28fb77c7fb86528181872055738a7186decb91da854090be8226222ea42c5eecb68652852055848454918216178455169180a36134fa9081620003218239f35b818752601f60208820910160051c8101905b818110620002f15750620000bb565b8781558301620002e2565b634e487b7160e01b87526022600452602487fd5b90607f1690620000a7565b600080fdfe60406080815260048036101561001457600080fd5b600091823560e01c80630356fb72146127e757806310671ae1146127825780631f099fea1461275a5780632165f399146126ff57806322c08d89146126d7578063260df277146122fe5780632cc2bb60146121c6578063324f4cdd14611f4b578063326141f714611f0a578063327a8e2e14611eb3578063401e994d14611dec5780634090b2a414611cb5578063463ef6d914611c6257806349e9e8bd14611c3c5780634f4feff9146118785783816354d6e36c1461183c5750806358c47362146118075780635de87228146117c157806360c92f2f146117885780636216091a1461156a5780636dfd5a8c1461138a578063715018a6146113195780637328fcca146112e857806384292287146112a75780638c024a51146112665780638da5cb5b1461124057806391f2b078146111775780639366ca6b146110f25780639a973fd4146110d4578063a0cad21114610ffa578063a6a09bbe14610fb4578063ae556f9a14610f43578063b6f2bc9c14610f1f578063b92a32af14610efd578063b95247ab14610edf578063bde032b214610eaa578063befe160a14610d72578063d4322d7d14610d3b578063e74e77da14610cbd578063ebb1708e14610ba0578063f2fde38b14610aae578063f42ab95d146106185763fc5aa321146101fb57600080fd5b3461061457602090816003193601126106105767ffffffffffffffff833581811161060c579083610230879336908801612a27565b939096338252600d83526102687f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68784205414612f13565b84825b8181106103fb5750506001600160a01b036002541686519384927f83f84c3b0000000000000000000000000000000000000000000000000000000084528301528183816102ba60248201612c70565b03925af19182156103f1578792610360575b5050825193606085526102e160608601612c70565b93858503828701528385527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841161035c577fd715a332aed0238ac47e3e63206bc076d963ffa40b5f17f18f881ac5cc1007bd9686956103569560051b80928583013701908286830301908601520190612a58565b0390a180f35b8780fd5b9091503d8088843e6103728184612904565b820191858184031261035c57805191821161035c57019080601f830112156103ed57815161039f81612945565b926103ac86519485612904565b818452868085019260051b8201019283116103e95786809101915b8383106103d9575050505038806102cc565b82518152918101918791016103c7565b8880fd5b8680fd5b84513d89823e3d90fd5b91935091506009808a52600a90818952878b2061041984868d612e44565b358c52895261042e60ff898d20541615612e83565b808b52808952878b2061044284868d612e44565b358c5289526001600160a01b038a898d8c84838320541615156000146104c257976104799282876104b89b818c9652522093612e44565b358d528a52888c20541661048c84612f84565b525b8a5287528589206104a082878b612e44565b358a528752858920600160ff19825416179055612d51565b859184899261026b565b5050508461053492939495966104d792612e44565b351015610596578a90896104ec868a8e612e44565b3560248b51809581937f6d325d310000000000000000000000000000000000000000000000000000000083528b83015273985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af191821561058c57906104b895949392918d9261055d575b5061055485612f84565b9116905261048e565b61057e9192508b3d8d11610585575b6105768183612904565b810190612ef4565b903861054a565b503d61056c565b89513d8e823e3d90fd5b61060885895191829162461bcd60e51b8352820160809060208152603260208201527f4c6976654d696e743a205469636b65744944204973204e6f7420456c6967696260408201527f6c6520546f204d696e7420436974697a656e000000000000000000000000000060608201520190565b0390fd5b8580fd5b8380fd5b8280fd5b5090346106145760208060031936011261061057813567ffffffffffffffff8111610aaa5761064a9036908401612a27565b919092610655612def565b333203610a6a576009928387526006835260ff948583888a2001541615610a0257875b82811061068757886001805580f35b610534610695828585612e44565b35101561099a57858952600a808652888a206106b2838686612e44565b358b5286526106c6888a8c20541615612e83565b868a5285528789206106d9828585612e44565b358a528552878920600160ff198254161790556106f7818484612e44565b88517f6d325d31000000000000000000000000000000000000000000000000000000008152903585820152906024868382818e73985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af1928315610990578b93610971575b506001600160a01b039081841691338303610909578b92918d918b8551927f891407c000000000000000000000000000000000000000000000000000000000958685528c8501528301528a826044818673dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af19283156108fe578a88928d9483966108c2575b506002541691600354966107fe89519889968795869485528401602090939291936001600160a01b0360408201951681520152565b03925af19182156108b8578d92610880575b50936108737f475ded59407b76bb97fa59524990f81105ca26ccb196f289fa9ea21af4ed6bc3939261087b96610847878b8b612e44565b35945194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b0390a1612d51565b610678565b925090508782813d81116108b1575b6108998183612904565b810103126108ad5790518a91610873610810565b8b80fd5b503d61088f565b83513d8f823e3d90fd5b975094505091905084813d83116108f7575b6108de8183612904565b810103126108f457858a918a8f965194386107c9565b80fd5b503d6108d4565b8551903d90823e3d90fd5b508660316084928a8e519362461bcd60e51b85528401528201527f4c6976654d696e743a206d73672e73656e646572204973204e6f74204f776e6560448201527f72204f6620476f6c64656e20546f6b656e0000000000000000000000000000006064820152fd5b610989919350873d8911610585576105768183612904565b913861074f565b8a513d8d823e3d90fd5b608484868a519162461bcd60e51b8352820152603660248201527f4c6976654d696e743a20496e76616c696420496e707574205469636b6574494460448201527f2c204d75737420426520476f6c64656e20546f6b656e000000000000000000006064820152fd5b6084838589519162461bcd60e51b8352820152602f60248201527f4c6976654d696e743a2052656d6f7465204d696e74696e67204f66204369746960448201527f7a656e73204e6f742041637469766500000000000000000000000000000000006064820152fd5b8160649286519262461bcd60e51b845283015260248201527f4c6976654d696e743a206d73672e73656e646572204d75737420426520454f416044820152fd5b8480fd5b50903461061457602060031936011261061457610ac961286b565b90610ad2612cae565b6001600160a01b03809216928315610b375750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50919034610cb95760208060031936011261061457813592845192610bc4846128e7565b6103e89081855283850195617d0036883761014d6006820681810293918115918504141715610c8d57508394979695935b838110610c44575050505083519485948186019282875251809352850193925b828110610c2457505050500390f35b83516001600160a01b031685528695509381019392810192600101610c15565b610c829082879698999a975260098752898620610c618286612d44565b875287526001600160a01b038a87205416610c7c828a612f97565b52612d51565b979695939497610bf5565b8460116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5080fd5b50903461061457602060031936011261061457600290338452600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60783852054148015610d23575b610d1190612fab565b60098452600660205235918320015580f35b50610d116001600160a01b0385541633149050610d08565b838234610cb9576020600319360112610cb957806020926001600160a01b03610d6261286b565b168152600d845220549051908152f35b50346106145760209182600319360112610610578151938135610d94866128e7565b6103e890818752617d0036878901378293600682069061014d91828102928184041490151715610c8d5750835b838110610e5c5750505050610dd582613475565b94815b838110610df557845186815280610df18189018a612a58565b0390f35b610dff8183612f97565b5115801590610e41575b610e1c575b610e1790612d51565b610dd8565b91610e39610e1791610e2e8585612f97565b51610c7c828b612f97565b929050610e0e565b50610e4c8183612f97565b51158015610e0957508015610e09565b610e668282612d44565b838652600a8952878620818752895260ff8887205416610e90575b50610e8b90612d51565b610dc1565b86610ea391610c7c610e8b94998d612f97565b9590610e81565b83346108f457806003193601126108f457610ec3612cae565b610edc8180808047335af1610ed66130a1565b506130d1565b80f35b50903461061457602060031936011261061457600190610d11612cae565b505034610cb9576020600319360112610cb957610f18612cae565b3560035580f35b838234610cb95781600319360112610cb95760209060ff6005541690519015158152f35b5090346106145760206003193601126106145781610f9b938235815260066020522091610f6f83612b85565b9260018101549260ff60028301549160038401549301541692805196879660a0885260a0880190612a8c565b9460208701528501526060840152151560808301520390f35b838234610cb95781600319360112610cb957610fce612cae565b8180808047818115610ff1575b3390f115610fe7575080f35b51903d90823e3d90fd5b506108fc610fdb565b838234610cb95761100a36612b3a565b9391929093338652602090600d82527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607848820541480156110bc575b61104f90612fab565b61105a81861461301c565b865b858110611067578780f35b806110766110b792848a612e44565b3560098a5260088552868a206001600160a01b0361109d611098858c8b612e44565b61308d565b168b5285526110b0878b20918254612d44565b9055612d51565b61105c565b5061104f6001600160a01b0388541633149050611046565b50903461061457826003193601126106145760209250549051908152f35b838234610cb9576020600319360112610cb95760207f2c74592fddad593c2c4403101ce9b30930711ab87571268ddd1e1989ee1d7917916001600160a01b0361113961286b565b611141612cae565b1690818552600d83527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6078186205551908152a180f35b838234610cb95761118736612b3a565b9391929093338652602090600d82527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60784882054148015611228575b6111cc90612fab565b6111d781861461301c565b865b8581106111e4578780f35b806111f361122392848a612e44565b3560098a5260088552868a206001600160a01b03611215611098858c8b612e44565b168b528552868a2055612d51565b6111d9565b506111cc6001600160a01b03885416331490506111c3565b838234610cb95781600319360112610cb9576001600160a01b0360209254169051908152f35b5090346106145781600319360112610614576020928291611285612886565b90358252600b85526001600160a01b0383832091168252845220549051908152f35b50903461061457816003193601126106145760209282916112c6612886565b90358252600885526001600160a01b0383832091168252845220549051908152f35b838234610cb95760ff816020936112fe36612aea565b908252600a8652828220908252855220541690519015158152f35b83346108f457806003193601126108f457611332612cae565b806001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b509034610614576020918260031936011261061057813567ffffffffffffffff8111610aaa576113bd9036908401612a27565b338652600d85527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60783872054148015611552575b6113fa90612fab565b855b818110611407578680f35b6009808852600a875284882061141e838587612e44565b358952875260ff85892054166114ea5761053461143c838587612e44565b35106114a85790816114a3928952875284882061145a828587612e44565b358952875284882073b96e81f80b3aeef65cb6d0e280b15fd5dbe719377fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612d51565b6113fc565b6064868887519162461bcd60e51b8352820152601a60248201527f4c6976654d696e743a20496e76616c6964205469636b657449440000000000006044820152fd5b6084868887519162461bcd60e51b8352820152602260248201527f4c6976654d696e743a205469636b657420494420416c7265616479204d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b506113fa6001600160a01b03875416331490506113f1565b50346106145760606003193601126106145781359067ffffffffffffffff808311610aaa5736602384011215610aaa5782840135916115a883612945565b946115b582519687612904565b8386526020948587016024809660051b83010191368311611751578601905b8282106117695750505083359383851161035c573660238601121561035c57848201359461160186612945565b9561160e85519788612904565b808752828888019160051b830101913683116117655783899101915b83831061175557505050506044928335928584116117515736602385011215611751578301359161165a83612945565b9561166783519788612904565b838752818988019460051b860101943686116108ad57828101945b8686106116f4578c8c8c8c8c611696612cae565b845b84518110156116f057806116e687806001600160a01b036116bc6116eb968b612f97565b51166116c88589612f97565b51906116d48689612f97565b51918a83519301915af1610ed66130a1565b612d51565b611698565b8580f35b8c8635848111610cb95783019136604384011215610cb957858301359161171a83612b00565b9061172789519283612904565b838252368c85870101116108f4578e848196958e8397018386013783010152815201950194611682565b8980fd5b823581529181019189910161162a565b8a80fd5b81356001600160a01b03811681036117655781529087019087016115d4565b50346106145782600319360112610614576117a1612cae565b600983526006602052822001805460ff1960ff8083161516911617905580f35b5090346106145781600319360112610614578160209360ff926117e2612886565b90358252600786526001600160a01b0383832091168252855220541690519015158152f35b838234610cb9576001600160a01b038160209361182336612aea565b9082526009865282822090825285522054169051908152f35b808334611875576020600319360112611875576001600160a01b0361185f61286b565b611867612cae565b168252600d60205281205580f35b50fd5b5090346106145760208060031936011261061057813567ffffffffffffffff8111610aaa576118aa9036908401612a27565b929092338652600d83526118e27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68688205414612f13565b855b8181106118ef578680f35b600990818852600a9182865287892061190983868a612e44565b358a52865261191e60ff898b20541615612e83565b80895280865287892061193283868a612e44565b358a52865287896001600160a01b038083832054161515600014611b2a5783825283895282822061196486898d612e44565b3583528952808383205416955b848352895282822061198486898d612e44565b3583528952828220600160ff198254161790558251937f891407c000000000000000000000000000000000000000000000000000000000908186528288168a870152602486015289856044818673dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af1948515611b20578388938b928d9698611ae5575b506002541692611a3060035497519788968795869485528401602090939291936001600160a01b0360408201951681520152565b03925af1908115611adb578a91611aaa575b5090611aa5936108737f475ded59407b76bb97fa59524990f81105ca26ccb196f289fa9ea21af4ed6bc393611a7886898d612e44565b35938c5194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b6118e4565b9190508682813d8311611ad4575b611ac28183612904565b81010312611751579051611aa5611a42565b503d611ab8565b89513d8c823e3d90fd5b95939650965092505082813d8311611b19575b611b028183612904565b810103126108f4578a928887928b945196386119fc565b503d611af8565b84513d85823e3d90fd5b915050610534611b3b84878b612e44565b351015611bca57898991611b5085888c612e44565b358351907f6d325d310000000000000000000000000000000000000000000000000000000082528982015289816024818673985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af1908115611b20578391611bad575b5095611971565b611bc491508a3d8c11610585576105768183612904565b38611ba6565b610608868a5191829162461bcd60e51b8352820160809060208152603260208201527f4c6976654d696e743a205469636b65744944204973204e6f7420456c6967696260408201527f6c6520546f204d696e7420436974697a656e000000000000000000000000000060608201520190565b838234610cb957602090611c5b611c52366129c9565b9291909161311c565b9051908152f35b50903461061457602060031936011261061457600390338452600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60783852054148015610d2357610d1190612fab565b838234610cb95781600319360112610cb957805190611cd3826128e7565b6103e8808352602092617d0036858301378491855b818110611d37575050611cfa82613475565b945b828110611d1957505050610df19051928284938452830190612a58565b80611d27611d329284612f97565b51610c7c8289612f97565b611cfc565b611d4081612d06565b6009808952600a808952878a20838b52895260ff9081898c205416159283611dc8575b8315611d9b575b505050611d81575b50611d7c90612d51565b611ce8565b84611d9491610c7c611d7c949787612f97565b9390611d72565b8b528952878a20838b528952878a20541615905080611dbd575b898080611d6a565b506105348110611db5565b808c52808b52898c20858d528b52898c20546001600160a01b031615159350611d63565b50346106145760208060031936011261061057818460a09560808351611e118161289c565b60608152828682015282858201528260608201520152843581526006835220825193611e3c8561289c565b611e4582612b85565b8552600182015493838601948552611e9560ff60028501549383890194855260038601549560608a01968752015416946080880195151586528251988998828a52519189015260c0880190612a8c565b94519086015251606085015251608084015251151560a08301520390f35b83346108f45760206003193601126108f4576001600160a01b03611ed561286b565b611edd612cae565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b838234610cb9576020600319360112610cb95780602092611f2961286b565b60098252600b85526001600160a01b0383832091168252845220549051908152f35b509034610614576020908160031936011261061057611f6861286b565b338552600d83527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607848620541480156121ae575b611fa590612fab565b60ff60055416156121475762015180420491828652600c8452848620546001810180911161211b578154106120d95750916006917fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a26001959460099283895260078552868920906001600160a01b03831691828b52865261202c60ff898c20541615612d7e565b8952600c855286892061203f8154612d51565b905583895260078552868920818a528552868920805460ff191689179055838952838552868920868652878a208901548a52855286892080547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905582885284845285882087015486516001600160a01b039290921682526020820152604090a18552528220016120d48154612d51565b905580f35b6064908486519162461bcd60e51b8352820152601d60248201527f4c6976654d696e743a204d6178205065722044617920526561636865640000006044820152fd5b6024876011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5090608492519162461bcd60e51b83528201526024808201527f4c6976654d696e743a2051522044656c65676174696f6e73204e6f7420456e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152fd5b50611fa56001600160a01b0386541633149050611f9c565b5082346108f457806003193601126108f4578151916121e4836128e7565b6103e8808452602092617d0036858701378091815b81811061228357505061220b82613475565b94815b83811061222757845186815280610df18189018a612a58565b6122318183612f97565b5115801590612268575b61224e575b61224990612d51565b61220e565b9161226061224991610e2e8585612f97565b929050612240565b506122738183612f97565b5115801561223b5750801561223b565b61228c81612d06565b6009808552600a8852868520828652885260ff87862054161590816122db575b506122c1575b506122bc90612d51565b6121f9565b846122d491610c7c6122bc94978b612f97565b93906122b2565b8086528852508584208185528752858420546001600160a01b03161515896122ac565b509060806003193601126106145767ffffffffffffffff908035828111610aaa5761232c9036908301612a27565b9260243590811161060c576123449036908401612a27565b6044949194356001600160a01b0395868216948583036117515760643594859361236c612def565b33978061261f575b50509161238a612392926123999694369161295d565b92369161295d565b908561320c565b50600991828752602093600b85528688209582169586895285528688206123c1848254612d44565b9055838852600885528688208689528552868820546124c257507fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2915082875260078452858720858852845261241d60ff878920541615612d7e565b82875282845285872060068086528789206001908101548a5291865287892080547fffffffffffffffffffffffff000000000000000000000000000000000000000016881790558489528552868820015486516001600160a01b039290921682526020820152604090a18085526006825260018486200161249e8154612d51565b90555b845260078152828420918452528120600160ff198254161790556001805580f35b838852600b855286882086895285528688205484895260088652878920878a52865287892054106125b757509082875260068452612507600187892001548092612d44565b918784895260068652836001898b2001555b83831061252957505050506124a1565b848952848652878920838a52865287892080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168817905587516001600160a01b0383168152602081018490526125b1916125ab917fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2908060408101610873565b92612d51565b91612519565b6084908588519162461bcd60e51b8352820152603860248201527f4c6976654d696e743a205573657220486173204e6f2052656d61696e696e672060448201527f417574686f72697a65642051527320546f2052656465656d00000000000000006064820152fd5b9091929394508a51907f9c395bc2000000000000000000000000000000000000000000000000000000008252888a83015260248201526020816044816d76a84fef008cdabe6409d2fe638b5afa9081156126cd578c91612693575b5061268b575b908186949392612374565b955084612680565b90506020813d82116126c5575b816126ad60209383612904565b810103126108ad575180151581036108ad573861267a565b3d91506126a0565b8b513d8e823e3d90fd5b838234610cb9576020906126f66126ed366129c9565b9291909161320c565b90519015158152f35b838234610cb9576020600319360112610cb9577f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6906001600160a01b0361274461286b565b61274c612cae565b168352600d60205282205580f35b509034610614576020600319360112610614576020928291358152600c845220549051908152f35b838234610cb9576020600319360112610cb95760207fdce35c6ead5e97f9a12a9dfe363465b6f62c5fab770d14f46f89c82c58819cc6916001600160a01b036127c961286b565b6127d1612cae565b1690818552600d8352848181205551908152a180f35b5034610614578060031936011261061457338352600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60781842054148015612853575b61283690612fab565b600983526006602052822090356002820155600360243591015580f35b506128366001600160a01b038454163314905061282d565b600435906001600160a01b038216820361288157565b600080fd5b602435906001600160a01b038216820361288157565b60a0810190811067ffffffffffffffff8211176128b857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b617d20810190811067ffffffffffffffff8211176128b857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176128b857604052565b67ffffffffffffffff81116128b85760051b60200190565b929161296882612945565b916129766040519384612904565b829481845260208094019160051b810192831161288157905b82821061299c5750505050565b8135815290830190830161298f565b9080601f83011215612881578160206129c69335910161295d565b90565b6080600319820112612881576004356001600160a01b0381168103612881579167ffffffffffffffff6024358181116128815783612a09916004016129ab565b9260443591821161288157612a20916004016129ab565b9060643590565b9181601f840112156128815782359167ffffffffffffffff8311612881576020808501948460051b01011161288157565b90815180825260208080930193019160005b828110612a78575050505090565b835185529381019392810192600101612a6a565b919082519283825260005b848110612ad65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201612a97565b6003196040910112612881576004359060243590565b67ffffffffffffffff81116128b857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60406003198201126128815767ffffffffffffffff916004358381116128815782612b6791600401612a27565b9390939260243591821161288157612b8191600401612a27565b9091565b90604051906000835490600182811c90808416968715612c66575b6020948584108914612c395787988489979899529081600014612c165750600114612bd7575b505050612bd592500383612904565b565b600090815285812095935091905b818310612bfe575050612bd59350820101388080612bc6565b85548884018501529485019487945091830191612be5565b915050612bd595935060ff1991501682840152151560051b820101388080612bc6565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b91607f1691612ba0565b6060519081815260208091019160809160005b828110612c91575050505090565b83516001600160a01b031685529381019392810192600101612c83565b6001600160a01b03600054163303612cc257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906103e78201809211612d1557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908201809211612d1557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612d155760010190565b15612d8557565b608460405162461bcd60e51b815260206004820152602360248201527f4c6976654d696e743a20557365722048617320416c726561647920526564656560448201527f6d656400000000000000000000000000000000000000000000000000000000006064820152fd5b600260015414612e00576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b9190811015612e545760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b15612e8a57565b608460405162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20476f6c64656e20546f6b656e20416c7265616479204d60448201527f696e7465640000000000000000000000000000000000000000000000000000006064820152fd5b9081602091031261288157516001600160a01b03811681036128815790565b15612f1a57565b608460405162461bcd60e51b815260206004820152603960248201527f4c6976654d696e74207c206f6e6c794d696e746572207c2043616c6c6572204960448201527f73204e6f7420417070726f76656420425254204d696e746572000000000000006064820152fd5b606051811015612e545760051b60800190565b8051821015612e545760209160051b010190565b15612fb257565b608460405162461bcd60e51b815260206004820152603360248201527f4c6976654d696e74207c206f6e6c7941646d696e207c2043616c6c657220497360448201527f204e6f7420417070726f7665642041646d696e000000000000000000000000006064820152fd5b1561302357565b608460405162461bcd60e51b815260206004820152602160248201527f4c6976654d696e743a20496e70757420417272617973204d757374204d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152fd5b356001600160a01b03811681036128815790565b3d156130cc573d906130b282612b00565b916130c06040519384612904565b82523d6000602084013e565b606090565b156130d857565b606460405162461bcd60e51b815260206004820152601660248201527f692068617665206661696c6564207520616e616b696e000000000000000000006044820152fd5b929091613129928461320c565b6001600160a01b039190911660009081527f82c9e868e45873bb5a4f47c09e14a12f6a6314e13aabd611e4374762bb4e8b3660209081526040808320547fe12d5ff10640a555479d85b7ab5f83b5dbd3cf6ac615eec77e24e0984b75a03890925282205490928080613203575b156131d6575082039182116131a9575090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b9192826131fa575b50816131f1575b50156129c65750600190565b905015386131e5565b159150386131de565b50818411613196565b91909183156133af576040938451917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602084019160601b1690818152601484528684019067ffffffffffffffff94808310868411176128b85760a091838a528151902094606082019485526074820152603483520193818510908511176128b8576132b09387525190209360096000526006602052600286600020015490613419565b1561334657906132d29160096000526006602052600384600020015490613419565b156132dd5750600190565b6084905162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520416d6f756e742060448201527f50726f6f660000000000000000000000000000000000000000000000000000006064820152fd5b6084835162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520456c696769626960448201527f6c6974792050726f6f66000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20515220526564656d7074696f6e20416d6f756e74204d60448201527f757374204265203e2030000000000000000000000000000000000000000000006064820152fd5b929091906000915b845183101561346d576134348386612f97565b519060008282101561345b5750600052602052613455604060002092612d51565b91613421565b604091613455938252602052206125ab565b915092501490565b9061347f82612945565b61348c6040519182612904565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06134ba8294612945565b019060203691013756fea264697066735822122083e998da7aa747b81802c1b26948317b4395ab46f8fadc8bc1e7cb45900a633964736f6c63430008130033
Deployed Bytecode
0x60406080815260048036101561001457600080fd5b600091823560e01c80630356fb72146127e757806310671ae1146127825780631f099fea1461275a5780632165f399146126ff57806322c08d89146126d7578063260df277146122fe5780632cc2bb60146121c6578063324f4cdd14611f4b578063326141f714611f0a578063327a8e2e14611eb3578063401e994d14611dec5780634090b2a414611cb5578063463ef6d914611c6257806349e9e8bd14611c3c5780634f4feff9146118785783816354d6e36c1461183c5750806358c47362146118075780635de87228146117c157806360c92f2f146117885780636216091a1461156a5780636dfd5a8c1461138a578063715018a6146113195780637328fcca146112e857806384292287146112a75780638c024a51146112665780638da5cb5b1461124057806391f2b078146111775780639366ca6b146110f25780639a973fd4146110d4578063a0cad21114610ffa578063a6a09bbe14610fb4578063ae556f9a14610f43578063b6f2bc9c14610f1f578063b92a32af14610efd578063b95247ab14610edf578063bde032b214610eaa578063befe160a14610d72578063d4322d7d14610d3b578063e74e77da14610cbd578063ebb1708e14610ba0578063f2fde38b14610aae578063f42ab95d146106185763fc5aa321146101fb57600080fd5b3461061457602090816003193601126106105767ffffffffffffffff833581811161060c579083610230879336908801612a27565b939096338252600d83526102687f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68784205414612f13565b84825b8181106103fb5750506001600160a01b036002541686519384927f83f84c3b0000000000000000000000000000000000000000000000000000000084528301528183816102ba60248201612c70565b03925af19182156103f1578792610360575b5050825193606085526102e160608601612c70565b93858503828701528385527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff841161035c577fd715a332aed0238ac47e3e63206bc076d963ffa40b5f17f18f881ac5cc1007bd9686956103569560051b80928583013701908286830301908601520190612a58565b0390a180f35b8780fd5b9091503d8088843e6103728184612904565b820191858184031261035c57805191821161035c57019080601f830112156103ed57815161039f81612945565b926103ac86519485612904565b818452868085019260051b8201019283116103e95786809101915b8383106103d9575050505038806102cc565b82518152918101918791016103c7565b8880fd5b8680fd5b84513d89823e3d90fd5b91935091506009808a52600a90818952878b2061041984868d612e44565b358c52895261042e60ff898d20541615612e83565b808b52808952878b2061044284868d612e44565b358c5289526001600160a01b038a898d8c84838320541615156000146104c257976104799282876104b89b818c9652522093612e44565b358d528a52888c20541661048c84612f84565b525b8a5287528589206104a082878b612e44565b358a528752858920600160ff19825416179055612d51565b859184899261026b565b5050508461053492939495966104d792612e44565b351015610596578a90896104ec868a8e612e44565b3560248b51809581937f6d325d310000000000000000000000000000000000000000000000000000000083528b83015273985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af191821561058c57906104b895949392918d9261055d575b5061055485612f84565b9116905261048e565b61057e9192508b3d8d11610585575b6105768183612904565b810190612ef4565b903861054a565b503d61056c565b89513d8e823e3d90fd5b61060885895191829162461bcd60e51b8352820160809060208152603260208201527f4c6976654d696e743a205469636b65744944204973204e6f7420456c6967696260408201527f6c6520546f204d696e7420436974697a656e000000000000000000000000000060608201520190565b0390fd5b8580fd5b8380fd5b8280fd5b5090346106145760208060031936011261061057813567ffffffffffffffff8111610aaa5761064a9036908401612a27565b919092610655612def565b333203610a6a576009928387526006835260ff948583888a2001541615610a0257875b82811061068757886001805580f35b610534610695828585612e44565b35101561099a57858952600a808652888a206106b2838686612e44565b358b5286526106c6888a8c20541615612e83565b868a5285528789206106d9828585612e44565b358a528552878920600160ff198254161790556106f7818484612e44565b88517f6d325d31000000000000000000000000000000000000000000000000000000008152903585820152906024868382818e73985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af1928315610990578b93610971575b506001600160a01b039081841691338303610909578b92918d918b8551927f891407c000000000000000000000000000000000000000000000000000000000958685528c8501528301528a826044818673dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af19283156108fe578a88928d9483966108c2575b506002541691600354966107fe89519889968795869485528401602090939291936001600160a01b0360408201951681520152565b03925af19182156108b8578d92610880575b50936108737f475ded59407b76bb97fa59524990f81105ca26ccb196f289fa9ea21af4ed6bc3939261087b96610847878b8b612e44565b35945194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b0390a1612d51565b610678565b925090508782813d81116108b1575b6108998183612904565b810103126108ad5790518a91610873610810565b8b80fd5b503d61088f565b83513d8f823e3d90fd5b975094505091905084813d83116108f7575b6108de8183612904565b810103126108f457858a918a8f965194386107c9565b80fd5b503d6108d4565b8551903d90823e3d90fd5b508660316084928a8e519362461bcd60e51b85528401528201527f4c6976654d696e743a206d73672e73656e646572204973204e6f74204f776e6560448201527f72204f6620476f6c64656e20546f6b656e0000000000000000000000000000006064820152fd5b610989919350873d8911610585576105768183612904565b913861074f565b8a513d8d823e3d90fd5b608484868a519162461bcd60e51b8352820152603660248201527f4c6976654d696e743a20496e76616c696420496e707574205469636b6574494460448201527f2c204d75737420426520476f6c64656e20546f6b656e000000000000000000006064820152fd5b6084838589519162461bcd60e51b8352820152602f60248201527f4c6976654d696e743a2052656d6f7465204d696e74696e67204f66204369746960448201527f7a656e73204e6f742041637469766500000000000000000000000000000000006064820152fd5b8160649286519262461bcd60e51b845283015260248201527f4c6976654d696e743a206d73672e73656e646572204d75737420426520454f416044820152fd5b8480fd5b50903461061457602060031936011261061457610ac961286b565b90610ad2612cae565b6001600160a01b03809216928315610b375750508254827fffffffffffffffffffffffff00000000000000000000000000000000000000008216178455167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b906020608492519162461bcd60e51b8352820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152fd5b50919034610cb95760208060031936011261061457813592845192610bc4846128e7565b6103e89081855283850195617d0036883761014d6006820681810293918115918504141715610c8d57508394979695935b838110610c44575050505083519485948186019282875251809352850193925b828110610c2457505050500390f35b83516001600160a01b031685528695509381019392810192600101610c15565b610c829082879698999a975260098752898620610c618286612d44565b875287526001600160a01b038a87205416610c7c828a612f97565b52612d51565b979695939497610bf5565b8460116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5080fd5b50903461061457602060031936011261061457600290338452600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60783852054148015610d23575b610d1190612fab565b60098452600660205235918320015580f35b50610d116001600160a01b0385541633149050610d08565b838234610cb9576020600319360112610cb957806020926001600160a01b03610d6261286b565b168152600d845220549051908152f35b50346106145760209182600319360112610610578151938135610d94866128e7565b6103e890818752617d0036878901378293600682069061014d91828102928184041490151715610c8d5750835b838110610e5c5750505050610dd582613475565b94815b838110610df557845186815280610df18189018a612a58565b0390f35b610dff8183612f97565b5115801590610e41575b610e1c575b610e1790612d51565b610dd8565b91610e39610e1791610e2e8585612f97565b51610c7c828b612f97565b929050610e0e565b50610e4c8183612f97565b51158015610e0957508015610e09565b610e668282612d44565b838652600a8952878620818752895260ff8887205416610e90575b50610e8b90612d51565b610dc1565b86610ea391610c7c610e8b94998d612f97565b9590610e81565b83346108f457806003193601126108f457610ec3612cae565b610edc8180808047335af1610ed66130a1565b506130d1565b80f35b50903461061457602060031936011261061457600190610d11612cae565b505034610cb9576020600319360112610cb957610f18612cae565b3560035580f35b838234610cb95781600319360112610cb95760209060ff6005541690519015158152f35b5090346106145760206003193601126106145781610f9b938235815260066020522091610f6f83612b85565b9260018101549260ff60028301549160038401549301541692805196879660a0885260a0880190612a8c565b9460208701528501526060840152151560808301520390f35b838234610cb95781600319360112610cb957610fce612cae565b8180808047818115610ff1575b3390f115610fe7575080f35b51903d90823e3d90fd5b506108fc610fdb565b838234610cb95761100a36612b3a565b9391929093338652602090600d82527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607848820541480156110bc575b61104f90612fab565b61105a81861461301c565b865b858110611067578780f35b806110766110b792848a612e44565b3560098a5260088552868a206001600160a01b0361109d611098858c8b612e44565b61308d565b168b5285526110b0878b20918254612d44565b9055612d51565b61105c565b5061104f6001600160a01b0388541633149050611046565b50903461061457826003193601126106145760209250549051908152f35b838234610cb9576020600319360112610cb95760207f2c74592fddad593c2c4403101ce9b30930711ab87571268ddd1e1989ee1d7917916001600160a01b0361113961286b565b611141612cae565b1690818552600d83527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff6078186205551908152a180f35b838234610cb95761118736612b3a565b9391929093338652602090600d82527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60784882054148015611228575b6111cc90612fab565b6111d781861461301c565b865b8581106111e4578780f35b806111f361122392848a612e44565b3560098a5260088552868a206001600160a01b03611215611098858c8b612e44565b168b528552868a2055612d51565b6111d9565b506111cc6001600160a01b03885416331490506111c3565b838234610cb95781600319360112610cb9576001600160a01b0360209254169051908152f35b5090346106145781600319360112610614576020928291611285612886565b90358252600b85526001600160a01b0383832091168252845220549051908152f35b50903461061457816003193601126106145760209282916112c6612886565b90358252600885526001600160a01b0383832091168252845220549051908152f35b838234610cb95760ff816020936112fe36612aea565b908252600a8652828220908252855220541690519015158152f35b83346108f457806003193601126108f457611332612cae565b806001600160a01b0381547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b509034610614576020918260031936011261061057813567ffffffffffffffff8111610aaa576113bd9036908401612a27565b338652600d85527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60783872054148015611552575b6113fa90612fab565b855b818110611407578680f35b6009808852600a875284882061141e838587612e44565b358952875260ff85892054166114ea5761053461143c838587612e44565b35106114a85790816114a3928952875284882061145a828587612e44565b358952875284882073b96e81f80b3aeef65cb6d0e280b15fd5dbe719377fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612d51565b6113fc565b6064868887519162461bcd60e51b8352820152601a60248201527f4c6976654d696e743a20496e76616c6964205469636b657449440000000000006044820152fd5b6084868887519162461bcd60e51b8352820152602260248201527f4c6976654d696e743a205469636b657420494420416c7265616479204d696e7460448201527f65640000000000000000000000000000000000000000000000000000000000006064820152fd5b506113fa6001600160a01b03875416331490506113f1565b50346106145760606003193601126106145781359067ffffffffffffffff808311610aaa5736602384011215610aaa5782840135916115a883612945565b946115b582519687612904565b8386526020948587016024809660051b83010191368311611751578601905b8282106117695750505083359383851161035c573660238601121561035c57848201359461160186612945565b9561160e85519788612904565b808752828888019160051b830101913683116117655783899101915b83831061175557505050506044928335928584116117515736602385011215611751578301359161165a83612945565b9561166783519788612904565b838752818988019460051b860101943686116108ad57828101945b8686106116f4578c8c8c8c8c611696612cae565b845b84518110156116f057806116e687806001600160a01b036116bc6116eb968b612f97565b51166116c88589612f97565b51906116d48689612f97565b51918a83519301915af1610ed66130a1565b612d51565b611698565b8580f35b8c8635848111610cb95783019136604384011215610cb957858301359161171a83612b00565b9061172789519283612904565b838252368c85870101116108f4578e848196958e8397018386013783010152815201950194611682565b8980fd5b823581529181019189910161162a565b8a80fd5b81356001600160a01b03811681036117655781529087019087016115d4565b50346106145782600319360112610614576117a1612cae565b600983526006602052822001805460ff1960ff8083161516911617905580f35b5090346106145781600319360112610614578160209360ff926117e2612886565b90358252600786526001600160a01b0383832091168252855220541690519015158152f35b838234610cb9576001600160a01b038160209361182336612aea565b9082526009865282822090825285522054169051908152f35b808334611875576020600319360112611875576001600160a01b0361185f61286b565b611867612cae565b168252600d60205281205580f35b50fd5b5090346106145760208060031936011261061057813567ffffffffffffffff8111610aaa576118aa9036908401612a27565b929092338652600d83526118e27f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68688205414612f13565b855b8181106118ef578680f35b600990818852600a9182865287892061190983868a612e44565b358a52865261191e60ff898b20541615612e83565b80895280865287892061193283868a612e44565b358a52865287896001600160a01b038083832054161515600014611b2a5783825283895282822061196486898d612e44565b3583528952808383205416955b848352895282822061198486898d612e44565b3583528952828220600160ff198254161790558251937f891407c000000000000000000000000000000000000000000000000000000000908186528288168a870152602486015289856044818673dd06d8483868cd0c5e69c24eeaa2a5f2beafd42b5af1948515611b20578388938b928d9698611ae5575b506002541692611a3060035497519788968795869485528401602090939291936001600160a01b0360408201951681520152565b03925af1908115611adb578a91611aaa575b5090611aa5936108737f475ded59407b76bb97fa59524990f81105ca26ccb196f289fa9ea21af4ed6bc393611a7886898d612e44565b35938c5194859485909493926060926001600160a01b036080840197168352602083015260408201520152565b6118e4565b9190508682813d8311611ad4575b611ac28183612904565b81010312611751579051611aa5611a42565b503d611ab8565b89513d8c823e3d90fd5b95939650965092505082813d8311611b19575b611b028183612904565b810103126108f4578a928887928b945196386119fc565b503d611af8565b84513d85823e3d90fd5b915050610534611b3b84878b612e44565b351015611bca57898991611b5085888c612e44565b358351907f6d325d310000000000000000000000000000000000000000000000000000000082528982015289816024818673985e1932ffd2aa4bc9ce611dfe12816a248cd2ce5af1908115611b20578391611bad575b5095611971565b611bc491508a3d8c11610585576105768183612904565b38611ba6565b610608868a5191829162461bcd60e51b8352820160809060208152603260208201527f4c6976654d696e743a205469636b65744944204973204e6f7420456c6967696260408201527f6c6520546f204d696e7420436974697a656e000000000000000000000000000060608201520190565b838234610cb957602090611c5b611c52366129c9565b9291909161311c565b9051908152f35b50903461061457602060031936011261061457600390338452600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60783852054148015610d2357610d1190612fab565b838234610cb95781600319360112610cb957805190611cd3826128e7565b6103e8808352602092617d0036858301378491855b818110611d37575050611cfa82613475565b945b828110611d1957505050610df19051928284938452830190612a58565b80611d27611d329284612f97565b51610c7c8289612f97565b611cfc565b611d4081612d06565b6009808952600a808952878a20838b52895260ff9081898c205416159283611dc8575b8315611d9b575b505050611d81575b50611d7c90612d51565b611ce8565b84611d9491610c7c611d7c949787612f97565b9390611d72565b8b528952878a20838b528952878a20541615905080611dbd575b898080611d6a565b506105348110611db5565b808c52808b52898c20858d528b52898c20546001600160a01b031615159350611d63565b50346106145760208060031936011261061057818460a09560808351611e118161289c565b60608152828682015282858201528260608201520152843581526006835220825193611e3c8561289c565b611e4582612b85565b8552600182015493838601948552611e9560ff60028501549383890194855260038601549560608a01968752015416946080880195151586528251988998828a52519189015260c0880190612a8c565b94519086015251606085015251608084015251151560a08301520390f35b83346108f45760206003193601126108f4576001600160a01b03611ed561286b565b611edd612cae565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b838234610cb9576020600319360112610cb95780602092611f2961286b565b60098252600b85526001600160a01b0383832091168252845220549051908152f35b509034610614576020908160031936011261061057611f6861286b565b338552600d83527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff607848620541480156121ae575b611fa590612fab565b60ff60055416156121475762015180420491828652600c8452848620546001810180911161211b578154106120d95750916006917fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a26001959460099283895260078552868920906001600160a01b03831691828b52865261202c60ff898c20541615612d7e565b8952600c855286892061203f8154612d51565b905583895260078552868920818a528552868920805460ff191689179055838952838552868920868652878a208901548a52855286892080547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905582885284845285882087015486516001600160a01b039290921682526020820152604090a18552528220016120d48154612d51565b905580f35b6064908486519162461bcd60e51b8352820152601d60248201527f4c6976654d696e743a204d6178205065722044617920526561636865640000006044820152fd5b6024876011847f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5090608492519162461bcd60e51b83528201526024808201527f4c6976654d696e743a2051522044656c65676174696f6e73204e6f7420456e6160448201527f626c6564000000000000000000000000000000000000000000000000000000006064820152fd5b50611fa56001600160a01b0386541633149050611f9c565b5082346108f457806003193601126108f4578151916121e4836128e7565b6103e8808452602092617d0036858701378091815b81811061228357505061220b82613475565b94815b83811061222757845186815280610df18189018a612a58565b6122318183612f97565b5115801590612268575b61224e575b61224990612d51565b61220e565b9161226061224991610e2e8585612f97565b929050612240565b506122738183612f97565b5115801561223b5750801561223b565b61228c81612d06565b6009808552600a8852868520828652885260ff87862054161590816122db575b506122c1575b506122bc90612d51565b6121f9565b846122d491610c7c6122bc94978b612f97565b93906122b2565b8086528852508584208185528752858420546001600160a01b03161515896122ac565b509060806003193601126106145767ffffffffffffffff908035828111610aaa5761232c9036908301612a27565b9260243590811161060c576123449036908401612a27565b6044949194356001600160a01b0395868216948583036117515760643594859361236c612def565b33978061261f575b50509161238a612392926123999694369161295d565b92369161295d565b908561320c565b50600991828752602093600b85528688209582169586895285528688206123c1848254612d44565b9055838852600885528688208689528552868820546124c257507fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2915082875260078452858720858852845261241d60ff878920541615612d7e565b82875282845285872060068086528789206001908101548a5291865287892080547fffffffffffffffffffffffff000000000000000000000000000000000000000016881790558489528552868820015486516001600160a01b039290921682526020820152604090a18085526006825260018486200161249e8154612d51565b90555b845260078152828420918452528120600160ff198254161790556001805580f35b838852600b855286882086895285528688205484895260088652878920878a52865287892054106125b757509082875260068452612507600187892001548092612d44565b918784895260068652836001898b2001555b83831061252957505050506124a1565b848952848652878920838a52865287892080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168817905587516001600160a01b0383168152602081018490526125b1916125ab917fb98da0e6a30cd3b780eff429cf26a49da9d9958fba01c872d67b4c3d6707c9a2908060408101610873565b92612d51565b91612519565b6084908588519162461bcd60e51b8352820152603860248201527f4c6976654d696e743a205573657220486173204e6f2052656d61696e696e672060448201527f417574686f72697a65642051527320546f2052656465656d00000000000000006064820152fd5b9091929394508a51907f9c395bc2000000000000000000000000000000000000000000000000000000008252888a83015260248201526020816044816d76a84fef008cdabe6409d2fe638b5afa9081156126cd578c91612693575b5061268b575b908186949392612374565b955084612680565b90506020813d82116126c5575b816126ad60209383612904565b810103126108ad575180151581036108ad573861267a565b3d91506126a0565b8b513d8e823e3d90fd5b838234610cb9576020906126f66126ed366129c9565b9291909161320c565b90519015158152f35b838234610cb9576020600319360112610cb9577f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6906001600160a01b0361274461286b565b61274c612cae565b168352600d60205282205580f35b509034610614576020600319360112610614576020928291358152600c845220549051908152f35b838234610cb9576020600319360112610cb95760207fdce35c6ead5e97f9a12a9dfe363465b6f62c5fab770d14f46f89c82c58819cc6916001600160a01b036127c961286b565b6127d1612cae565b1690818552600d8352848181205551908152a180f35b5034610614578060031936011261061457338352600d6020527f50e75b23f8ec51bbcb044fe377457e835f3b5ccc7ebf69e80906452015dff60781842054148015612853575b61283690612fab565b600983526006602052822090356002820155600360243591015580f35b506128366001600160a01b038454163314905061282d565b600435906001600160a01b038216820361288157565b600080fd5b602435906001600160a01b038216820361288157565b60a0810190811067ffffffffffffffff8211176128b857604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b617d20810190811067ffffffffffffffff8211176128b857604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176128b857604052565b67ffffffffffffffff81116128b85760051b60200190565b929161296882612945565b916129766040519384612904565b829481845260208094019160051b810192831161288157905b82821061299c5750505050565b8135815290830190830161298f565b9080601f83011215612881578160206129c69335910161295d565b90565b6080600319820112612881576004356001600160a01b0381168103612881579167ffffffffffffffff6024358181116128815783612a09916004016129ab565b9260443591821161288157612a20916004016129ab565b9060643590565b9181601f840112156128815782359167ffffffffffffffff8311612881576020808501948460051b01011161288157565b90815180825260208080930193019160005b828110612a78575050505090565b835185529381019392810192600101612a6a565b919082519283825260005b848110612ad65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b602081830181015184830182015201612a97565b6003196040910112612881576004359060243590565b67ffffffffffffffff81116128b857601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60406003198201126128815767ffffffffffffffff916004358381116128815782612b6791600401612a27565b9390939260243591821161288157612b8191600401612a27565b9091565b90604051906000835490600182811c90808416968715612c66575b6020948584108914612c395787988489979899529081600014612c165750600114612bd7575b505050612bd592500383612904565b565b600090815285812095935091905b818310612bfe575050612bd59350820101388080612bc6565b85548884018501529485019487945091830191612be5565b915050612bd595935060ff1991501682840152151560051b820101388080612bc6565b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526022600452fd5b91607f1691612ba0565b6060519081815260208091019160809160005b828110612c91575050505090565b83516001600160a01b031685529381019392810192600101612c83565b6001600160a01b03600054163303612cc257565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b906103e78201809211612d1557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b91908201809211612d1557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612d155760010190565b15612d8557565b608460405162461bcd60e51b815260206004820152602360248201527f4c6976654d696e743a20557365722048617320416c726561647920526564656560448201527f6d656400000000000000000000000000000000000000000000000000000000006064820152fd5b600260015414612e00576002600155565b606460405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152fd5b9190811015612e545760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b15612e8a57565b608460405162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20476f6c64656e20546f6b656e20416c7265616479204d60448201527f696e7465640000000000000000000000000000000000000000000000000000006064820152fd5b9081602091031261288157516001600160a01b03811681036128815790565b15612f1a57565b608460405162461bcd60e51b815260206004820152603960248201527f4c6976654d696e74207c206f6e6c794d696e746572207c2043616c6c6572204960448201527f73204e6f7420417070726f76656420425254204d696e746572000000000000006064820152fd5b606051811015612e545760051b60800190565b8051821015612e545760209160051b010190565b15612fb257565b608460405162461bcd60e51b815260206004820152603360248201527f4c6976654d696e74207c206f6e6c7941646d696e207c2043616c6c657220497360448201527f204e6f7420417070726f7665642041646d696e000000000000000000000000006064820152fd5b1561302357565b608460405162461bcd60e51b815260206004820152602160248201527f4c6976654d696e743a20496e70757420417272617973204d757374204d61746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152fd5b356001600160a01b03811681036128815790565b3d156130cc573d906130b282612b00565b916130c06040519384612904565b82523d6000602084013e565b606090565b156130d857565b606460405162461bcd60e51b815260206004820152601660248201527f692068617665206661696c6564207520616e616b696e000000000000000000006044820152fd5b929091613129928461320c565b6001600160a01b039190911660009081527f82c9e868e45873bb5a4f47c09e14a12f6a6314e13aabd611e4374762bb4e8b3660209081526040808320547fe12d5ff10640a555479d85b7ab5f83b5dbd3cf6ac615eec77e24e0984b75a03890925282205490928080613203575b156131d6575082039182116131a9575090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b9192826131fa575b50816131f1575b50156129c65750600190565b905015386131e5565b159150386131de565b50818411613196565b91909183156133af576040938451917fffffffffffffffffffffffffffffffffffffffff000000000000000000000000602084019160601b1690818152601484528684019067ffffffffffffffff94808310868411176128b85760a091838a528151902094606082019485526074820152603483520193818510908511176128b8576132b09387525190209360096000526006602052600286600020015490613419565b1561334657906132d29160096000526006602052600384600020015490613419565b156132dd5750600190565b6084905162461bcd60e51b815260206004820152602560248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520416d6f756e742060448201527f50726f6f660000000000000000000000000000000000000000000000000000006064820152fd5b6084835162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20496e76616c6964204d65726b6c6520456c696769626960448201527f6c6974792050726f6f66000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602a60248201527f4c6976654d696e743a20515220526564656d7074696f6e20416d6f756e74204d60448201527f757374204265203e2030000000000000000000000000000000000000000000006064820152fd5b929091906000915b845183101561346d576134348386612f97565b519060008282101561345b5750600052602052613455604060002092612d51565b91613421565b604091613455938252602052206125ab565b915092501490565b9061347f82612945565b61348c6040519182612904565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06134ba8294612945565b019060203691013756fea264697066735822122083e998da7aa747b81802c1b26948317b4395ab46f8fadc8bc1e7cb45900a633964736f6c63430008130033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.