Overview
MATIC Balance
5 MATIC
MATIC Value
$5.03 (@ $1.01/MATIC)More Info
Private Name Tags
ContractCreator:
TokenTracker
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Mint | 33178717 | 559 days ago | IN | 0.5 MATIC | 0.00588084 | ||||
Mint | 33177368 | 559 days ago | IN | 0.5 MATIC | 0.00582822 | ||||
Mint | 33177326 | 559 days ago | IN | 0.5 MATIC | 0.00578714 | ||||
Mint | 33177281 | 559 days ago | IN | 0.5 MATIC | 0.00576322 | ||||
Mint | 33177078 | 559 days ago | IN | 0.5 MATIC | 0.00569528 | ||||
Mint | 33175315 | 559 days ago | IN | 0.5 MATIC | 0.00600022 | ||||
Pause | 33086681 | 561 days ago | IN | 0 MATIC | 0.00124688 | ||||
Mint | 33070336 | 561 days ago | IN | 0.5 MATIC | 0.00844421 | ||||
Mint | 33063015 | 561 days ago | IN | 0.5 MATIC | 0.0058468 | ||||
Mint | 33062374 | 561 days ago | IN | 0.5 MATIC | 0.00638671 | ||||
Mint | 33062154 | 561 days ago | IN | 0.5 MATIC | 0.00709412 | ||||
0x600c8054 | 33029136 | 562 days ago | IN | Create: HoALotteryEd1 | 0 MATIC | 0.12356352 |
Loading...
Loading
Contract Name:
HoALotteryEd1
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-09-12 */ // File: https://github.com/NomicFoundation/hardhat/blob/master/packages/hardhat-core/console.sol pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: https://github.com/1001-digital/erc721-extensions/blob/main/contracts/WithLimitedSupply.sol pragma solidity ^0.8.0; /// @author 1001.digital /// @title A token tracker that limits the token supply and increments token IDs on each new mint. abstract contract WithLimitedSupply { using Counters for Counters.Counter; /// @dev Emitted when the supply of this collection changes event SupplyChanged(uint256 indexed supply); // Keeps track of how many we have minted Counters.Counter private _tokenCount; /// @dev The maximum count of tokens this token tracker will hold. uint256 private _totalSupply; /// Instanciate the contract /// @param totalSupply_ how many tokens this collection should hold constructor (uint256 totalSupply_) { _totalSupply = totalSupply_; } /// @dev Get the max Supply /// @return the maximum token count function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /// @dev Get the current token count /// @return the created token count function tokenCount() public view returns (uint256) { return _tokenCount.current(); } /// @dev Check whether tokens are still available /// @return the available token count function availableTokenCount() public view returns (uint256) { return totalSupply() - tokenCount(); } /// @dev Increment the token count and fetch the latest count /// @return the next token id function nextToken() internal virtual returns (uint256) { uint256 token = _tokenCount.current(); _tokenCount.increment(); return token; } /// @dev Check whether another token is still available modifier ensureAvailability() { require(availableTokenCount() > 0, "No more tokens available"); _; } /// @param amount Check whether number of tokens are still available /// @dev Check whether tokens are still available modifier ensureAvailabilityFor(uint256 amount) { require(availableTokenCount() >= amount, "Requested number of tokens not available"); _; } /// Update the supply for the collection /// @param _supply the new token supply. /// @dev create additional token supply for this collection. function _setSupply(uint256 _supply) internal virtual { require(_supply > tokenCount(), "Can't set the supply to less than the current token count"); _totalSupply = _supply; emit SupplyChanged(totalSupply()); } } // File: https://github.com/1001-digital/erc721-extensions/blob/main/contracts/RandomlyAssigned.sol pragma solidity ^0.8.0; /// @author 1001.digital /// @title Randomly assign tokenIDs from a given set of tokens. abstract contract RandomlyAssigned is WithLimitedSupply { // Used for random index assignment mapping(uint256 => uint256) private tokenMatrix; // The initial token ID uint256 private startFrom; /// Instanciate the contract /// @param _totalSupply how many tokens this collection should hold /// @param _startFrom the tokenID with which to start counting constructor (uint256 _totalSupply, uint256 _startFrom) WithLimitedSupply(_totalSupply) { startFrom = _startFrom; } /// Get the next token ID /// @dev Randomly gets a new token ID and keeps track of the ones that are still available. /// @return the next token ID function nextToken() internal override ensureAvailability returns (uint256) { uint256 maxIndex = totalSupply() - tokenCount(); uint256 random = uint256(keccak256( abi.encodePacked( msg.sender, block.coinbase, block.difficulty, block.gaslimit, block.timestamp ) )) % maxIndex; uint256 value = 0; if (tokenMatrix[random] == 0) { // If this matrix position is empty, set the value to the generated random number. value = random; } else { // Otherwise, use the previously stored number from the matrix. value = tokenMatrix[random]; } // If the last available tokenID is still unused... if (tokenMatrix[maxIndex - 1] == 0) { // ...store that ID in the current matrix position. tokenMatrix[random] = maxIndex - 1; } else { // ...otherwise copy over the stored number to the current matrix position. tokenMatrix[random] = tokenMatrix[maxIndex - 1]; } // Increment counts super.nextToken(); return value + startFrom; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol // 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; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any (single) token transfer. This includes minting and burning. * See {_beforeConsecutiveTokenTransfer}. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any (single) transfer of tokens. This includes minting and burning. * See {_afterConsecutiveTokenTransfer}. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called before consecutive token transfers. * Calling conditions are similar to {_beforeTokenTransfer}. * * The default implementation include balances updates that extensions such as {ERC721Consecutive} cannot perform * directly. */ function _beforeConsecutiveTokenTransfer( address from, address to, uint256, /*first*/ uint96 size ) internal virtual { if (from != address(0)) { _balances[from] -= size; } if (to != address(0)) { _balances[to] += size; } } /** * @dev Hook that is called after consecutive token transfers. * Calling conditions are similar to {_afterTokenTransfer}. */ function _afterConsecutiveTokenTransfer( address, /*from*/ address, /*to*/ uint256, /*first*/ uint96 /*size*/ ) internal virtual {} } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and 'to' cannot be the zero address at the same time. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Hook that is called before any batch token transfer. For now this is limited * to batch minting by the {ERC721Consecutive} extension. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeConsecutiveTokenTransfer( address, address, uint256, uint96 ) internal virtual override { revert("ERC721Enumerable: consecutive transfers not supported"); } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/HoALotteryEd1.sol pragma solidity >=0.7.0 <0.9.0; contract HoALotteryEd1 is ERC721, Ownable, RandomlyAssigned{ using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIds; bool public paused = true; bool public revealed = false; string public notRevealedUri; string baseURI; string public baseExtension = ".json"; uint256 public maxMintAmount = 50; uint256 maxSupply = 2050; uint256 currentSupply = 0; uint256 public cost = 0.5 ether; uint256 startTime; uint256[] private _allTokens; mapping(uint256 => uint256) private _ownedTokensIndex; mapping(uint256 => uint256) private _allTokensIndex; mapping(address => mapping(uint256 => uint256)) private _ownedTokens; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721(_name, _symbol) RandomlyAssigned(maxSupply,1) { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); mint(1); paused = true; console.log("Contract has been deployed!"); } //internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } //public function mint (uint256 _amount) public payable { require( tokenCount() + 1 <= totalSupply()); require( availableTokenCount() - 1 >= 0); if (msg.sender != owner()) { require( msg.value >= cost * _amount); } for(uint256 i = 1; i <= _amount; i++){ uint256 id = nextToken(); _safeMint(msg.sender, id); if(currentSupply==9 || currentSupply==19 || currentSupply==29){ cost+=0.01 ether; } currentSupply++; } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for(uint256 i; i < ownerTokenCount; i++){ tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory){ require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length >0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function reveal() public onlyOwner { revealed = true; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setCost(uint256 _newCost) public onlyOwner() { cost = _newCost; } function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } // Airdrop NFTs function airdropNfts(address[] calldata wAddresses) public onlyOwner { for (uint i = 0; i < wAddresses.length; i++) { _mintSingleNFT(wAddresses[i]); } } function _mintSingleNFT(address wAddress) private { uint newTokenID = nextToken(); _safeMint(wAddress, newTokenID); } function withdraw() public payable onlyOwner { uint _balance = address(this).balance; payable(0xCC01966b96a2B4d78Bc197fF3F33a3F0a5Da0A9D).transfer(_balance * 5 / 100); payable(0x3ac2770b672865A0E4A6495e3676e34BF3004a16).transfer(_balance * 5 / 100); (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } //ENUMERABLE function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index delete _allTokensIndex[tokenId]; _allTokens.pop(); } function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"SupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"wAddresses","type":"address[]"}],"name":"airdropNfts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
600c805461ffff1916600117905560c06040526005608081905264173539b7b760d91b60a09081526200003691600f919062000ce5565b50603260105561080260115560006012556706f05b59d3b200006013553480156200006057600080fd5b50604051620037b9380380620037b9833981016040819052620000839162000e4f565b60115460018186868160009080519060200190620000a392919062000ce5565b508051620000b990600190602084019062000ce5565b505050620000d6620000d06200016360201b60201c565b62000167565b600855600a5550620000e882620001b9565b620000f381620001dc565b620000ff6001620001fb565b600c805460ff1916600117905560408051808201909152601b81527f436f6e747261637420686173206265656e206465706c6f7965642100000000006020808301919091526200015991906200116662000313821b17901c565b50505050620010e0565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001c362000361565b8051620001d890600e90602084019062000ce5565b5050565b620001e662000361565b8051620001d890600d90602084019062000ce5565b60085462000208620003c3565b6200021590600162000f80565b11156200022157600080fd5b600060016200022f620003e1565b6200023b919062000fbd565b10156200024757600080fd5b6006546001600160a01b031633146200027757806013546200026a919062000f9b565b3410156200027757600080fd5b60015b818111620001d85760006200028e620003fc565b90506200029c3382620005b2565b60125460091480620002b057506012546013145b80620002be5750601254601d145b15620002e557662386f26fc1000060136000828254620002df919062000f80565b90915550505b60128054906000620002f78362001047565b91905055505080806200030a9062001047565b9150506200027a565b6200035e816040516024016200032a919062000f6b565b60408051601f198184030181529190526020810180516001600160e01b0390811663104c13eb60e21b17909152620005d416565b50565b6006546001600160a01b03163314620003c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6000620003dc6007620005f560201b620011a91760201c565b905090565b6000620003ed620003c3565b600854620003dc919062000fbd565b60008062000409620003e1565b11620004585760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c6500000000000000006044820152606401620003b8565b600062000464620003c3565b60085462000473919062000fbd565b6040516001600160601b031933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c620004d7919062001065565b60008181526009602052604081205491925090620004f757508062000508565b506000818152600960205260409020545b600960006200051960018662000fbd565b8152602001908152602001600020546000141562000553576200053e60018462000fbd565b60008381526009602052604090205562000585565b600960006200056460018662000fbd565b81526020808201929092526040908101600090812054858252600990935220555b6200059a620005f960201b620011ad1760201c565b50600a54620005aa908262000f80565b935050505090565b620001d88282604051806020016040528060008152506200063160201b60201c565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b5490565b600080620006136007620005f560201b620011a91760201c565b90506200062c6007620006a960201b620011ce1760201c565b919050565b6200063d8383620006b2565b6200064c600084848462000851565b620006a45760405162461bcd60e51b815260206004820152603260248201526000805160206200379983398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620003b8565b505050565b80546001019055565b6001600160a01b0382166200070a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620003b8565b6000818152600260205260409020546001600160a01b031615620007715760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620003b8565b6200077f60008383620009ba565b6000818152600260205260409020546001600160a01b031615620007e65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620003b8565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000872846001600160a01b031662000a9660201b620011d71760201c565b15620009ae57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620008ac90339089908890889060040162000f36565b602060405180830381600087803b158015620008c757600080fd5b505af1925050508015620008fa575060408051601f3d908101601f19168201909252620008f79181019062000e1c565b60015b62000993573d8080156200092b576040519150601f19603f3d011682016040523d82523d6000602084013e62000930565b606091505b5080516200098b5760405162461bcd60e51b815260206004820152603260248201526000805160206200379983398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620003b8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620009b2565b5060015b949350505050565b620009d2838383620006a460201b620009641760201c565b6001600160a01b03831662000a305762000a2a81601580546000838152601760205260408120829055600182018355919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750155565b62000a56565b816001600160a01b0316836001600160a01b03161462000a565762000a56838262000aa5565b6001600160a01b03821662000a7057620006a48162000b52565b826001600160a01b0316826001600160a01b031614620006a457620006a4828262000c0c565b6001600160a01b03163b151590565b6000600162000abf8462000c5d60201b62000ca31760201c565b62000acb919062000fbd565b60008381526016602052604090205490915080821462000b1f576001600160a01b03841660009081526018602090815260408083208584528252808320548484528184208190558352601690915290208190555b5060009182526016602090815260408084208490556001600160a01b039094168352601881528383209183525290812055565b60155460009062000b669060019062000fbd565b6000838152601760205260408120546015805493945090928490811062000b915762000b91620010b4565b90600052602060002001549050806015838154811062000bb55762000bb5620010b4565b600091825260208083209091019290925582815260179091526040808220849055858252812055601580548062000bf05762000bf06200109e565b6001900381819060005260206000200160009055905550505050565b600062000c248362000c5d60201b62000ca31760201c565b6001600160a01b039093166000908152601860209081526040808320868452825280832085905593825260169052919091209190915550565b60006001600160a01b03821662000cc95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401620003b8565b506001600160a01b031660009081526003602052604090205490565b82805462000cf3906200100a565b90600052602060002090601f01602090048101928262000d17576000855562000d62565b82601f1062000d3257805160ff191683800117855562000d62565b8280016001018555821562000d62579182015b8281111562000d6257825182559160200191906001019062000d45565b5062000d7092915062000d74565b5090565b5b8082111562000d70576000815560010162000d75565b600082601f83011262000d9d57600080fd5b81516001600160401b038082111562000dba5762000dba620010ca565b604051601f8301601f19908116603f0116810190828211818310171562000de55762000de5620010ca565b8160405283815286602085880101111562000dff57600080fd5b62000e1284602083016020890162000fd7565b9695505050505050565b60006020828403121562000e2f57600080fd5b81516001600160e01b03198116811462000e4857600080fd5b9392505050565b6000806000806080858703121562000e6657600080fd5b84516001600160401b038082111562000e7e57600080fd5b62000e8c8883890162000d8b565b9550602087015191508082111562000ea357600080fd5b62000eb18883890162000d8b565b9450604087015191508082111562000ec857600080fd5b62000ed68883890162000d8b565b9350606087015191508082111562000eed57600080fd5b5062000efc8782880162000d8b565b91505092959194509250565b6000815180845262000f2281602086016020860162000fd7565b601f01601f19169290920160200192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009062000e129083018462000f08565b60208152600062000e48602083018462000f08565b6000821982111562000f965762000f9662001088565b500190565b600081600019048311821515161562000fb85762000fb862001088565b500290565b60008282101562000fd25762000fd262001088565b500390565b60005b8381101562000ff457818101518382015260200162000fda565b8381111562001004576000848401525b50505050565b600181811c908216806200101f57607f821691505b602082108114156200104157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200105e576200105e62001088565b5060010190565b6000826200108357634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6126a980620010f06000396000f3fe60806040526004361061021a5760003560e01c80636352211e11610123578063a475b5dd116100ab578063e14ca3531161006f578063e14ca353146105dc578063e985e9c5146105f1578063f2c4ce1e1461063a578063f2fde38b1461065a578063f356749d1461067a57600080fd5b8063a475b5dd14610552578063b88d4fde14610567578063c668286214610587578063c87b56dd1461059c578063da3ef23f146105bc57600080fd5b80638da5cb5b116100f25780638da5cb5b146104d757806395d89b41146104f55780639f181b5e1461050a578063a0712d681461051f578063a22cb4651461053257600080fd5b80636352211e1461046257806370a0823114610482578063715018a6146104a25780637f00c7a6146104b757600080fd5b806323b872dd116101a6578063438b630011610175578063438b6300146103bc57806344a0d68a146103e9578063518302271461040957806355f804b3146104285780635c975abb1461044857600080fd5b806323b872dd146103545780632f745c59146103745780633ccfd60b1461039457806342842e0e1461039c57600080fd5b8063081c8c44116101ed578063081c8c44146102d0578063095ea7b3146102e557806313faede61461030557806318160ddd14610329578063239c70ae1461033e57600080fd5b806301ffc9a71461021f57806302329a291461025457806306fdde0314610276578063081812fc14610298575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046121f3565b61069a565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061027461026f3660046121d8565b6106ec565b005b34801561028257600080fd5b5061028b610707565b60405161024b9190612400565b3480156102a457600080fd5b506102b86102b3366004612276565b610799565b6040516001600160a01b03909116815260200161024b565b3480156102dc57600080fd5b5061028b6107c0565b3480156102f157600080fd5b50610274610300366004612139565b61084e565b34801561031157600080fd5b5061031b60135481565b60405190815260200161024b565b34801561033557600080fd5b5060085461031b565b34801561034a57600080fd5b5061031b60105481565b34801561036057600080fd5b5061027461036f366004612057565b610969565b34801561038057600080fd5b5061031b61038f366004612139565b61099a565b610274610a30565b3480156103a857600080fd5b506102746103b7366004612057565b610b5e565b3480156103c857600080fd5b506103dc6103d7366004612009565b610b79565b60405161024b91906123bc565b3480156103f557600080fd5b50610274610404366004612276565b610c1b565b34801561041557600080fd5b50600c5461023f90610100900460ff1681565b34801561043457600080fd5b5061027461044336600461222d565b610c28565b34801561045457600080fd5b50600c5461023f9060ff1681565b34801561046e57600080fd5b506102b861047d366004612276565b610c43565b34801561048e57600080fd5b5061031b61049d366004612009565b610ca3565b3480156104ae57600080fd5b50610274610d29565b3480156104c357600080fd5b506102746104d2366004612276565b610d3d565b3480156104e357600080fd5b506006546001600160a01b03166102b8565b34801561050157600080fd5b5061028b610d4a565b34801561051657600080fd5b5061031b610d59565b61027461052d366004612276565b610d69565b34801561053e57600080fd5b5061027461054d36600461210f565b610e64565b34801561055e57600080fd5b50610274610e6f565b34801561057357600080fd5b50610274610582366004612093565b610e88565b34801561059357600080fd5b5061028b610ec0565b3480156105a857600080fd5b5061028b6105b7366004612276565b610ecd565b3480156105c857600080fd5b506102746105d736600461222d565b61104c565b3480156105e857600080fd5b5061031b611067565b3480156105fd57600080fd5b5061023f61060c366004612024565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561064657600080fd5b5061027461065536600461222d565b61107e565b34801561066657600080fd5b50610274610675366004612009565b611099565b34801561068657600080fd5b50610274610695366004612163565b611112565b60006001600160e01b031982166380ac58cd60e01b14806106cb57506001600160e01b03198216635b5e139f60e01b145b806106e657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106f46111e6565b600c805460ff1916911515919091179055565b60606000805461071690612585565b80601f016020809104026020016040519081016040528092919081815260200182805461074290612585565b801561078f5780601f106107645761010080835404028352916020019161078f565b820191906000526020600020905b81548152906001019060200180831161077257829003601f168201915b5050505050905090565b60006107a482611240565b506000908152600460205260409020546001600160a01b031690565b600d80546107cd90612585565b80601f01602080910402602001604051908101604052809291908181526020018280546107f990612585565b80156108465780601f1061081b57610100808354040283529160200191610846565b820191906000526020600020905b81548152906001019060200180831161082957829003601f168201915b505050505081565b600061085982610c43565b9050806001600160a01b0316836001600160a01b031614156108cc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806108e857506108e8813361060c565b61095a5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016108c3565b610964838361129f565b505050565b610973338261130d565b61098f5760405162461bcd60e51b81526004016108c390612413565b61096483838361138c565b60006109a583610ca3565b8210610a075760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108c3565b506001600160a01b03919091166000908152601860209081526040808320938352929052205490565b610a386111e6565b4773cc01966b96a2b4d78bc197ff3f33a3f0a5da0a9d6108fc6064610a5e846005612523565b610a68919061250f565b6040518115909202916000818181858888f19350505050158015610a90573d6000803e3d6000fd5b50733ac2770b672865a0e4a6495e3676e34bf3004a166108fc6064610ab6846005612523565b610ac0919061250f565b6040518115909202916000818181858888f19350505050158015610ae8573d6000803e3d6000fd5b506000610afd6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b47576040519150601f19603f3d011682016040523d82523d6000602084013e610b4c565b606091505b5050905080610b5a57600080fd5b5050565b61096483838360405180602001604052806000815250610e88565b60606000610b8683610ca3565b905060008167ffffffffffffffff811115610ba357610ba3612647565b604051908082528060200260200182016040528015610bcc578160200160208202803683370190505b50905060005b82811015610c1357610be4858261099a565b828281518110610bf657610bf6612631565b602090810291909101015280610c0b816125c0565b915050610bd2565b509392505050565b610c236111e6565b601355565b610c306111e6565b8051610b5a90600e906020840190611ed3565b6000818152600260205260408120546001600160a01b0316806106e65760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108c3565b60006001600160a01b038216610d0d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016108c3565b506001600160a01b031660009081526003602052604090205490565b610d316111e6565b610d3b60006114fb565b565b610d456111e6565b601055565b60606001805461071690612585565b6000610d6460075490565b905090565b600854610d74610d59565b610d7f9060016124f7565b1115610d8a57600080fd5b60006001610d96611067565b610da09190612542565b1015610dab57600080fd5b6006546001600160a01b03163314610dd75780601354610dcb9190612523565b341015610dd757600080fd5b60015b818111610b5a576000610deb61154d565b9050610df733826116e5565b60125460091480610e0a57506012546013145b80610e175750601254601d145b15610e3b57662386f26fc1000060136000828254610e3591906124f7565b90915550505b60128054906000610e4b836125c0565b9190505550508080610e5c906125c0565b915050610dda565b610b5a3383836116ff565b610e776111e6565b600c805461ff001916610100179055565b610e92338361130d565b610eae5760405162461bcd60e51b81526004016108c390612413565b610eba848484846117ce565b50505050565b600f80546107cd90612585565b6000818152600260205260409020546060906001600160a01b0316610f4c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108c3565b600c54610100900460ff16610fed57600d8054610f6890612585565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9490612585565b8015610fe15780601f10610fb657610100808354040283529160200191610fe1565b820191906000526020600020905b815481529060010190602001808311610fc457829003601f168201915b50505050509050919050565b6000610ff7611801565b905060008151116110175760405180602001604052806000815250611045565b8061102184611810565b600f604051602001611035939291906122bb565b6040516020818303038152906040525b9392505050565b6110546111e6565b8051610b5a90600f906020840190611ed3565b6000611071610d59565b600854610d649190612542565b6110866111e6565b8051610b5a90600d906020840190611ed3565b6110a16111e6565b6001600160a01b0381166111065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c3565b61110f816114fb565b50565b61111a6111e6565b60005b818110156109645761115483838381811061113a5761113a612631565b905060200201602081019061114f9190612009565b6118a5565b8061115e816125c0565b91505061111d565b61110f8160405160240161117a9190612400565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118bb565b5490565b6000806111b960075490565b90506111c9600780546001019055565b919050565b80546001019055565b6001600160a01b03163b151590565b6006546001600160a01b03163314610d3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c3565b6000818152600260205260409020546001600160a01b031661110f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108c3565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112d482610c43565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061131983610c43565b9050806001600160a01b0316846001600160a01b0316148061136057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806113845750836001600160a01b031661137984610799565b6001600160a01b0316145b949350505050565b826001600160a01b031661139f82610c43565b6001600160a01b0316146113c55760405162461bcd60e51b81526004016108c3906124b2565b6001600160a01b0382166114275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108c3565b6114328383836118dc565b826001600160a01b031661144582610c43565b6001600160a01b03161461146b5760405162461bcd60e51b81526004016108c3906124b2565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611558611067565b116115a55760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c65000000000000000060448201526064016108c3565b60006115af610d59565b6008546115bc9190612542565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c61162391906125db565b60008181526009602052604081205491925090611641575080611652565b506000818152600960205260409020545b60096000611661600186612542565b8152602001908152602001600020546000141561169757611683600184612542565b6000838152600960205260409020556116c7565b600960006116a6600186612542565b81526020808201929092526040908101600090812054858252600990935220555b6116cf6111ad565b50600a546116dd90826124f7565b935050505090565b610b5a828260405180602001604052806000815250611994565b816001600160a01b0316836001600160a01b031614156117615760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108c3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117d984848461138c565b6117e5848484846119c7565b610eba5760405162461bcd60e51b81526004016108c390612460565b6060600e805461071690612585565b6060600061181d83611ad4565b600101905060008167ffffffffffffffff81111561183d5761183d612647565b6040519080825280601f01601f191660200182016040528015611867576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846118a057610c13565b611871565b60006118af61154d565b9050610b5a82826116e5565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6001600160a01b0383166119375761193281601580546000838152601760205260408120829055600182018355919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750155565b61195a565b816001600160a01b0316836001600160a01b03161461195a5761195a8382611bac565b6001600160a01b0382166119715761096481611c49565b826001600160a01b0316826001600160a01b031614610964576109648282611cf8565b61199e8383611d3c565b6119ab60008484846119c7565b6109645760405162461bcd60e51b81526004016108c390612460565b60006001600160a01b0384163b15611ac957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a0b90339089908890889060040161237f565b602060405180830381600087803b158015611a2557600080fd5b505af1925050508015611a55575060408051601f3d908101601f19168201909252611a5291810190612210565b60015b611aaf573d808015611a83576040519150601f19603f3d011682016040523d82523d6000602084013e611a88565b606091505b508051611aa75760405162461bcd60e51b81526004016108c390612460565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611384565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611b135772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b3f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b5d57662386f26fc10000830492506010015b6305f5e1008310611b75576305f5e100830492506008015b6127108310611b8957612710830492506004015b60648310611b9b576064830492506002015b600a83106106e65760010192915050565b60006001611bb984610ca3565b611bc39190612542565b600083815260166020526040902054909150808214611c16576001600160a01b03841660009081526018602090815260408083208584528252808320548484528184208190558352601690915290208190555b5060009182526016602090815260408084208490556001600160a01b039094168352601881528383209183525290812055565b601554600090611c5b90600190612542565b60008381526017602052604081205460158054939450909284908110611c8357611c83612631565b906000526020600020015490508060158381548110611ca457611ca4612631565b6000918252602080832090910192909255828152601790915260408082208490558582528120556015805480611cdc57611cdc61261b565b6001900381819060005260206000200160009055905550505050565b6000611d0383610ca3565b6001600160a01b039093166000908152601860209081526040808320868452825280832085905593825260169052919091209190915550565b6001600160a01b038216611d925760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108c3565b6000818152600260205260409020546001600160a01b031615611df75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108c3565b611e03600083836118dc565b6000818152600260205260409020546001600160a01b031615611e685760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108c3565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611edf90612585565b90600052602060002090601f016020900481019282611f015760008555611f47565b82601f10611f1a57805160ff1916838001178555611f47565b82800160010185558215611f47579182015b82811115611f47578251825591602001919060010190611f2c565b50611f53929150611f57565b5090565b5b80821115611f535760008155600101611f58565b600067ffffffffffffffff80841115611f8757611f87612647565b604051601f8501601f19908116603f01168101908282118183101715611faf57611faf612647565b81604052809350858152868686011115611fc857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146111c957600080fd5b803580151581146111c957600080fd5b60006020828403121561201b57600080fd5b61104582611fe2565b6000806040838503121561203757600080fd5b61204083611fe2565b915061204e60208401611fe2565b90509250929050565b60008060006060848603121561206c57600080fd5b61207584611fe2565b925061208360208501611fe2565b9150604084013590509250925092565b600080600080608085870312156120a957600080fd5b6120b285611fe2565b93506120c060208601611fe2565b925060408501359150606085013567ffffffffffffffff8111156120e357600080fd5b8501601f810187136120f457600080fd5b61210387823560208401611f6c565b91505092959194509250565b6000806040838503121561212257600080fd5b61212b83611fe2565b915061204e60208401611ff9565b6000806040838503121561214c57600080fd5b61215583611fe2565b946020939093013593505050565b6000806020838503121561217657600080fd5b823567ffffffffffffffff8082111561218e57600080fd5b818501915085601f8301126121a257600080fd5b8135818111156121b157600080fd5b8660208260051b85010111156121c657600080fd5b60209290920196919550909350505050565b6000602082840312156121ea57600080fd5b61104582611ff9565b60006020828403121561220557600080fd5b81356110458161265d565b60006020828403121561222257600080fd5b81516110458161265d565b60006020828403121561223f57600080fd5b813567ffffffffffffffff81111561225657600080fd5b8201601f8101841361226757600080fd5b61138484823560208401611f6c565b60006020828403121561228857600080fd5b5035919050565b600081518084526122a7816020860160208601612559565b601f01601f19169290920160200192915050565b6000845160206122ce8285838a01612559565b8551918401916122e18184848a01612559565b8554920191600090600181811c90808316806122fe57607f831692505b85831081141561231c57634e487b7160e01b85526022600452602485fd5b80801561233057600181146123415761236e565b60ff1985168852838801955061236e565b60008b81526020902060005b858110156123665781548a82015290840190880161234d565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123b29083018461228f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123f4578351835292840192918401916001016123d8565b50909695505050505050565b602081526000611045602083018461228f565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6000821982111561250a5761250a6125ef565b500190565b60008261251e5761251e612605565b500490565b600081600019048311821515161561253d5761253d6125ef565b500290565b600082821015612554576125546125ef565b500390565b60005b8381101561257457818101518382015260200161255c565b83811115610eba5750506000910152565b600181811c9082168061259957607f821691505b602082108114156125ba57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125d4576125d46125ef565b5060010190565b6000826125ea576125ea612605565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461110f57600080fdfea264697066735822122082c8f176bc1ca236a66d0c5ac4bc3f3c9249d2d8bb6ba224ff4179b054b855c964736f6c634300080700334552433732313a207472616e7366657220746f206e6f6e204552433732315265000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d486f414c6f7474657279456431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005484f414c310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d587a35614b506a35436f3678576a6a36534b5a68454a6e694d566770323554566f6e4c365966665068386e6b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d6151566d623652317a4d734a576d44317138716a5152524864555868626e78455145457545583552767165322f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80636352211e11610123578063a475b5dd116100ab578063e14ca3531161006f578063e14ca353146105dc578063e985e9c5146105f1578063f2c4ce1e1461063a578063f2fde38b1461065a578063f356749d1461067a57600080fd5b8063a475b5dd14610552578063b88d4fde14610567578063c668286214610587578063c87b56dd1461059c578063da3ef23f146105bc57600080fd5b80638da5cb5b116100f25780638da5cb5b146104d757806395d89b41146104f55780639f181b5e1461050a578063a0712d681461051f578063a22cb4651461053257600080fd5b80636352211e1461046257806370a0823114610482578063715018a6146104a25780637f00c7a6146104b757600080fd5b806323b872dd116101a6578063438b630011610175578063438b6300146103bc57806344a0d68a146103e9578063518302271461040957806355f804b3146104285780635c975abb1461044857600080fd5b806323b872dd146103545780632f745c59146103745780633ccfd60b1461039457806342842e0e1461039c57600080fd5b8063081c8c44116101ed578063081c8c44146102d0578063095ea7b3146102e557806313faede61461030557806318160ddd14610329578063239c70ae1461033e57600080fd5b806301ffc9a71461021f57806302329a291461025457806306fdde0314610276578063081812fc14610298575b600080fd5b34801561022b57600080fd5b5061023f61023a3660046121f3565b61069a565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b5061027461026f3660046121d8565b6106ec565b005b34801561028257600080fd5b5061028b610707565b60405161024b9190612400565b3480156102a457600080fd5b506102b86102b3366004612276565b610799565b6040516001600160a01b03909116815260200161024b565b3480156102dc57600080fd5b5061028b6107c0565b3480156102f157600080fd5b50610274610300366004612139565b61084e565b34801561031157600080fd5b5061031b60135481565b60405190815260200161024b565b34801561033557600080fd5b5060085461031b565b34801561034a57600080fd5b5061031b60105481565b34801561036057600080fd5b5061027461036f366004612057565b610969565b34801561038057600080fd5b5061031b61038f366004612139565b61099a565b610274610a30565b3480156103a857600080fd5b506102746103b7366004612057565b610b5e565b3480156103c857600080fd5b506103dc6103d7366004612009565b610b79565b60405161024b91906123bc565b3480156103f557600080fd5b50610274610404366004612276565b610c1b565b34801561041557600080fd5b50600c5461023f90610100900460ff1681565b34801561043457600080fd5b5061027461044336600461222d565b610c28565b34801561045457600080fd5b50600c5461023f9060ff1681565b34801561046e57600080fd5b506102b861047d366004612276565b610c43565b34801561048e57600080fd5b5061031b61049d366004612009565b610ca3565b3480156104ae57600080fd5b50610274610d29565b3480156104c357600080fd5b506102746104d2366004612276565b610d3d565b3480156104e357600080fd5b506006546001600160a01b03166102b8565b34801561050157600080fd5b5061028b610d4a565b34801561051657600080fd5b5061031b610d59565b61027461052d366004612276565b610d69565b34801561053e57600080fd5b5061027461054d36600461210f565b610e64565b34801561055e57600080fd5b50610274610e6f565b34801561057357600080fd5b50610274610582366004612093565b610e88565b34801561059357600080fd5b5061028b610ec0565b3480156105a857600080fd5b5061028b6105b7366004612276565b610ecd565b3480156105c857600080fd5b506102746105d736600461222d565b61104c565b3480156105e857600080fd5b5061031b611067565b3480156105fd57600080fd5b5061023f61060c366004612024565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561064657600080fd5b5061027461065536600461222d565b61107e565b34801561066657600080fd5b50610274610675366004612009565b611099565b34801561068657600080fd5b50610274610695366004612163565b611112565b60006001600160e01b031982166380ac58cd60e01b14806106cb57506001600160e01b03198216635b5e139f60e01b145b806106e657506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106f46111e6565b600c805460ff1916911515919091179055565b60606000805461071690612585565b80601f016020809104026020016040519081016040528092919081815260200182805461074290612585565b801561078f5780601f106107645761010080835404028352916020019161078f565b820191906000526020600020905b81548152906001019060200180831161077257829003601f168201915b5050505050905090565b60006107a482611240565b506000908152600460205260409020546001600160a01b031690565b600d80546107cd90612585565b80601f01602080910402602001604051908101604052809291908181526020018280546107f990612585565b80156108465780601f1061081b57610100808354040283529160200191610846565b820191906000526020600020905b81548152906001019060200180831161082957829003601f168201915b505050505081565b600061085982610c43565b9050806001600160a01b0316836001600160a01b031614156108cc5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806108e857506108e8813361060c565b61095a5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016108c3565b610964838361129f565b505050565b610973338261130d565b61098f5760405162461bcd60e51b81526004016108c390612413565b61096483838361138c565b60006109a583610ca3565b8210610a075760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108c3565b506001600160a01b03919091166000908152601860209081526040808320938352929052205490565b610a386111e6565b4773cc01966b96a2b4d78bc197ff3f33a3f0a5da0a9d6108fc6064610a5e846005612523565b610a68919061250f565b6040518115909202916000818181858888f19350505050158015610a90573d6000803e3d6000fd5b50733ac2770b672865a0e4a6495e3676e34bf3004a166108fc6064610ab6846005612523565b610ac0919061250f565b6040518115909202916000818181858888f19350505050158015610ae8573d6000803e3d6000fd5b506000610afd6006546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610b47576040519150601f19603f3d011682016040523d82523d6000602084013e610b4c565b606091505b5050905080610b5a57600080fd5b5050565b61096483838360405180602001604052806000815250610e88565b60606000610b8683610ca3565b905060008167ffffffffffffffff811115610ba357610ba3612647565b604051908082528060200260200182016040528015610bcc578160200160208202803683370190505b50905060005b82811015610c1357610be4858261099a565b828281518110610bf657610bf6612631565b602090810291909101015280610c0b816125c0565b915050610bd2565b509392505050565b610c236111e6565b601355565b610c306111e6565b8051610b5a90600e906020840190611ed3565b6000818152600260205260408120546001600160a01b0316806106e65760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108c3565b60006001600160a01b038216610d0d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016108c3565b506001600160a01b031660009081526003602052604090205490565b610d316111e6565b610d3b60006114fb565b565b610d456111e6565b601055565b60606001805461071690612585565b6000610d6460075490565b905090565b600854610d74610d59565b610d7f9060016124f7565b1115610d8a57600080fd5b60006001610d96611067565b610da09190612542565b1015610dab57600080fd5b6006546001600160a01b03163314610dd75780601354610dcb9190612523565b341015610dd757600080fd5b60015b818111610b5a576000610deb61154d565b9050610df733826116e5565b60125460091480610e0a57506012546013145b80610e175750601254601d145b15610e3b57662386f26fc1000060136000828254610e3591906124f7565b90915550505b60128054906000610e4b836125c0565b9190505550508080610e5c906125c0565b915050610dda565b610b5a3383836116ff565b610e776111e6565b600c805461ff001916610100179055565b610e92338361130d565b610eae5760405162461bcd60e51b81526004016108c390612413565b610eba848484846117ce565b50505050565b600f80546107cd90612585565b6000818152600260205260409020546060906001600160a01b0316610f4c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016108c3565b600c54610100900460ff16610fed57600d8054610f6890612585565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9490612585565b8015610fe15780601f10610fb657610100808354040283529160200191610fe1565b820191906000526020600020905b815481529060010190602001808311610fc457829003601f168201915b50505050509050919050565b6000610ff7611801565b905060008151116110175760405180602001604052806000815250611045565b8061102184611810565b600f604051602001611035939291906122bb565b6040516020818303038152906040525b9392505050565b6110546111e6565b8051610b5a90600f906020840190611ed3565b6000611071610d59565b600854610d649190612542565b6110866111e6565b8051610b5a90600d906020840190611ed3565b6110a16111e6565b6001600160a01b0381166111065760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108c3565b61110f816114fb565b50565b61111a6111e6565b60005b818110156109645761115483838381811061113a5761113a612631565b905060200201602081019061114f9190612009565b6118a5565b8061115e816125c0565b91505061111d565b61110f8160405160240161117a9190612400565b60408051601f198184030181529190526020810180516001600160e01b031663104c13eb60e21b1790526118bb565b5490565b6000806111b960075490565b90506111c9600780546001019055565b919050565b80546001019055565b6001600160a01b03163b151590565b6006546001600160a01b03163314610d3b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108c3565b6000818152600260205260409020546001600160a01b031661110f5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108c3565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906112d482610c43565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061131983610c43565b9050806001600160a01b0316846001600160a01b0316148061136057506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b806113845750836001600160a01b031661137984610799565b6001600160a01b0316145b949350505050565b826001600160a01b031661139f82610c43565b6001600160a01b0316146113c55760405162461bcd60e51b81526004016108c3906124b2565b6001600160a01b0382166114275760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108c3565b6114328383836118dc565b826001600160a01b031661144582610c43565b6001600160a01b03161461146b5760405162461bcd60e51b81526004016108c3906124b2565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b0387811680865260038552838620805460001901905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611558611067565b116115a55760405162461bcd60e51b815260206004820152601860248201527f4e6f206d6f726520746f6b656e7320617661696c61626c65000000000000000060448201526064016108c3565b60006115af610d59565b6008546115bc9190612542565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c61162391906125db565b60008181526009602052604081205491925090611641575080611652565b506000818152600960205260409020545b60096000611661600186612542565b8152602001908152602001600020546000141561169757611683600184612542565b6000838152600960205260409020556116c7565b600960006116a6600186612542565b81526020808201929092526040908101600090812054858252600990935220555b6116cf6111ad565b50600a546116dd90826124f7565b935050505090565b610b5a828260405180602001604052806000815250611994565b816001600160a01b0316836001600160a01b031614156117615760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108c3565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6117d984848461138c565b6117e5848484846119c7565b610eba5760405162461bcd60e51b81526004016108c390612460565b6060600e805461071690612585565b6060600061181d83611ad4565b600101905060008167ffffffffffffffff81111561183d5761183d612647565b6040519080825280601f01601f191660200182016040528015611867576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846118a057610c13565b611871565b60006118af61154d565b9050610b5a82826116e5565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6001600160a01b0383166119375761193281601580546000838152601760205260408120829055600182018355919091527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750155565b61195a565b816001600160a01b0316836001600160a01b03161461195a5761195a8382611bac565b6001600160a01b0382166119715761096481611c49565b826001600160a01b0316826001600160a01b031614610964576109648282611cf8565b61199e8383611d3c565b6119ab60008484846119c7565b6109645760405162461bcd60e51b81526004016108c390612460565b60006001600160a01b0384163b15611ac957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611a0b90339089908890889060040161237f565b602060405180830381600087803b158015611a2557600080fd5b505af1925050508015611a55575060408051601f3d908101601f19168201909252611a5291810190612210565b60015b611aaf573d808015611a83576040519150601f19603f3d011682016040523d82523d6000602084013e611a88565b606091505b508051611aa75760405162461bcd60e51b81526004016108c390612460565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611384565b506001949350505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611b135772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611b3f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b5d57662386f26fc10000830492506010015b6305f5e1008310611b75576305f5e100830492506008015b6127108310611b8957612710830492506004015b60648310611b9b576064830492506002015b600a83106106e65760010192915050565b60006001611bb984610ca3565b611bc39190612542565b600083815260166020526040902054909150808214611c16576001600160a01b03841660009081526018602090815260408083208584528252808320548484528184208190558352601690915290208190555b5060009182526016602090815260408084208490556001600160a01b039094168352601881528383209183525290812055565b601554600090611c5b90600190612542565b60008381526017602052604081205460158054939450909284908110611c8357611c83612631565b906000526020600020015490508060158381548110611ca457611ca4612631565b6000918252602080832090910192909255828152601790915260408082208490558582528120556015805480611cdc57611cdc61261b565b6001900381819060005260206000200160009055905550505050565b6000611d0383610ca3565b6001600160a01b039093166000908152601860209081526040808320868452825280832085905593825260169052919091209190915550565b6001600160a01b038216611d925760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108c3565b6000818152600260205260409020546001600160a01b031615611df75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108c3565b611e03600083836118dc565b6000818152600260205260409020546001600160a01b031615611e685760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108c3565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611edf90612585565b90600052602060002090601f016020900481019282611f015760008555611f47565b82601f10611f1a57805160ff1916838001178555611f47565b82800160010185558215611f47579182015b82811115611f47578251825591602001919060010190611f2c565b50611f53929150611f57565b5090565b5b80821115611f535760008155600101611f58565b600067ffffffffffffffff80841115611f8757611f87612647565b604051601f8501601f19908116603f01168101908282118183101715611faf57611faf612647565b81604052809350858152868686011115611fc857600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146111c957600080fd5b803580151581146111c957600080fd5b60006020828403121561201b57600080fd5b61104582611fe2565b6000806040838503121561203757600080fd5b61204083611fe2565b915061204e60208401611fe2565b90509250929050565b60008060006060848603121561206c57600080fd5b61207584611fe2565b925061208360208501611fe2565b9150604084013590509250925092565b600080600080608085870312156120a957600080fd5b6120b285611fe2565b93506120c060208601611fe2565b925060408501359150606085013567ffffffffffffffff8111156120e357600080fd5b8501601f810187136120f457600080fd5b61210387823560208401611f6c565b91505092959194509250565b6000806040838503121561212257600080fd5b61212b83611fe2565b915061204e60208401611ff9565b6000806040838503121561214c57600080fd5b61215583611fe2565b946020939093013593505050565b6000806020838503121561217657600080fd5b823567ffffffffffffffff8082111561218e57600080fd5b818501915085601f8301126121a257600080fd5b8135818111156121b157600080fd5b8660208260051b85010111156121c657600080fd5b60209290920196919550909350505050565b6000602082840312156121ea57600080fd5b61104582611ff9565b60006020828403121561220557600080fd5b81356110458161265d565b60006020828403121561222257600080fd5b81516110458161265d565b60006020828403121561223f57600080fd5b813567ffffffffffffffff81111561225657600080fd5b8201601f8101841361226757600080fd5b61138484823560208401611f6c565b60006020828403121561228857600080fd5b5035919050565b600081518084526122a7816020860160208601612559565b601f01601f19169290920160200192915050565b6000845160206122ce8285838a01612559565b8551918401916122e18184848a01612559565b8554920191600090600181811c90808316806122fe57607f831692505b85831081141561231c57634e487b7160e01b85526022600452602485fd5b80801561233057600181146123415761236e565b60ff1985168852838801955061236e565b60008b81526020902060005b858110156123665781548a82015290840190880161234d565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906123b29083018461228f565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156123f4578351835292840192918401916001016123d8565b50909695505050505050565b602081526000611045602083018461228f565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6000821982111561250a5761250a6125ef565b500190565b60008261251e5761251e612605565b500490565b600081600019048311821515161561253d5761253d6125ef565b500290565b600082821015612554576125546125ef565b500390565b60005b8381101561257457818101518382015260200161255c565b83811115610eba5750506000910152565b600181811c9082168061259957607f821691505b602082108114156125ba57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156125d4576125d46125ef565b5060010190565b6000826125ea576125ea612605565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461110f57600080fdfea264697066735822122082c8f176bc1ca236a66d0c5ac4bc3f3c9249d2d8bb6ba224ff4179b054b855c964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000d486f414c6f7474657279456431000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005484f414c310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d587a35614b506a35436f3678576a6a36534b5a68454a6e694d566770323554566f6e4c365966665068386e6b2f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d6151566d623652317a4d734a576d44317138716a5152524864555868626e78455145457545583552767165322f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): HoALotteryEd1
Arg [1] : _symbol (string): HOAL1
Arg [2] : _initBaseURI (string): ipfs://QmXz5aKPj5Co6xWjj6SKZhEJniMVgp25TVonL6YffPh8nk/
Arg [3] : _initNotRevealedUri (string): ipfs://QmaQVmb6R1zMsJWmD1q8qjQRRHdUXhbnxEQEEuEX5Rvqe2/hidden.json
-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 486f414c6f747465727945643100000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 484f414c31000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d587a35614b506a35436f3678576a6a36534b5a68454a6e
Arg [10] : 694d566770323554566f6e4c365966665068386e6b2f00000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [12] : 697066733a2f2f516d6151566d623652317a4d734a576d44317138716a515252
Arg [13] : 4864555868626e78455145457545583552767165322f68696464656e2e6a736f
Arg [14] : 6e00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
136358:6868:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109358:305;;;;;;;;;;-1:-1:-1;109358:305:0;;;;;:::i;:::-;;:::i;:::-;;;8978:14:1;;8971:22;8953:41;;8941:2;8926:18;109358:305:0;;;;;;;;139899:79;;;;;;;;;;-1:-1:-1;139899:79:0;;;;;:::i;:::-;;:::i;:::-;;110286:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;111798:171::-;;;;;;;;;;-1:-1:-1;111798:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7639:32:1;;;7621:51;;7609:2;7594:18;111798:171:0;7475:203:1;136612:28:0;;;;;;;;;;;;;:::i;111316:416::-;;;;;;;;;;-1:-1:-1;111316:416:0;;;;;:::i;:::-;;:::i;136815:31::-;;;;;;;;;;;;;;;;;;;15635:25:1;;;15623:2;15608:18;136815:31:0;15489:177:1;67943:99:0;;;;;;;;;;-1:-1:-1;68022:12:0;;67943:99;;136712:33;;;;;;;;;;;;;;;;112498:335;;;;;;;;;;-1:-1:-1;112498:335:0;;;;;:::i;:::-;;:::i;140782:239::-;;;;;;;;;;-1:-1:-1;140782:239:0;;;;;:::i;:::-;;:::i;140369:385::-;;;:::i;112904:185::-;;;;;;;;;;-1:-1:-1;112904:185:0;;;;;:::i;:::-;;:::i;138244:403::-;;;;;;;;;;-1:-1:-1;138244:403:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;139401:88::-;;;;;;;;;;-1:-1:-1;139401:88:0;;;;;:::i;:::-;;:::i;136577:28::-;;;;;;;;;;-1:-1:-1;136577:28:0;;;;;;;;;;;139637:104;;;;;;;;;;-1:-1:-1;139637:104:0;;;;;:::i;:::-;;:::i;136545:25::-;;;;;;;;;;-1:-1:-1;136545:25:0;;;;;;;;109996:223;;;;;;;;;;-1:-1:-1;109996:223:0;;;;;:::i;:::-;;:::i;109727:207::-;;;;;;;;;;-1:-1:-1;109727:207:0;;;;;:::i;:::-;;:::i;135450:103::-;;;;;;;;;;;;;:::i;139501:124::-;;;;;;;;;;-1:-1:-1;139501:124:0;;;;;:::i;:::-;;:::i;134802:87::-;;;;;;;;;;-1:-1:-1;134875:6:0;;-1:-1:-1;;;;;134875:6:0;134802:87;;110455:104;;;;;;;;;;;;;:::i;68133:99::-;;;;;;;;;;;;;:::i;137696:536::-;;;;;;:::i;:::-;;:::i;112041:155::-;;;;;;;;;;-1:-1:-1;112041:155:0;;;;;:::i;:::-;;:::i;139195:68::-;;;;;;;;;;;;;:::i;113160:322::-;;;;;;;;;;-1:-1:-1;113160:322:0;;;;;:::i;:::-;;:::i;136668:37::-;;;;;;;;;;;;;:::i;138659:503::-;;;;;;;;;;-1:-1:-1;138659:503:0;;;;;:::i;:::-;;:::i;139759:128::-;;;;;;;;;;-1:-1:-1;139759:128:0;;;;;:::i;:::-;;:::i;68338:115::-;;;;;;;;;;;;;:::i;112267:164::-;;;;;;;;;;-1:-1:-1;112267:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;112388:25:0;;;112364:4;112388:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;112267:164;139271:122;;;;;;;;;;-1:-1:-1;139271:122:0;;;;;:::i;:::-;;:::i;135708:201::-;;;;;;;;;;-1:-1:-1;135708:201:0;;;;;:::i;:::-;;:::i;140014:190::-;;;;;;;;;;-1:-1:-1;140014:190:0;;;;;:::i;:::-;;:::i;109358:305::-;109460:4;-1:-1:-1;;;;;;109497:40:0;;-1:-1:-1;;;109497:40:0;;:105;;-1:-1:-1;;;;;;;109554:48:0;;-1:-1:-1;;;109554:48:0;109497:105;:158;;;-1:-1:-1;;;;;;;;;;99741:40:0;;;109619:36;109477:178;109358:305;-1:-1:-1;;109358:305:0:o;139899:79::-;134688:13;:11;:13::i;:::-;139955:6:::1;:15:::0;;-1:-1:-1;;139955:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;139899:79::o;110286:100::-;110340:13;110373:5;110366:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110286:100;:::o;111798:171::-;111874:7;111894:23;111909:7;111894:14;:23::i;:::-;-1:-1:-1;111937:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;111937:24:0;;111798:171::o;136612:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;111316:416::-;111397:13;111413:23;111428:7;111413:14;:23::i;:::-;111397:39;;111461:5;-1:-1:-1;;;;;111455:11:0;:2;-1:-1:-1;;;;;111455:11:0;;;111447:57;;;;-1:-1:-1;;;111447:57:0;;14859:2:1;111447:57:0;;;14841:21:1;14898:2;14878:18;;;14871:30;14937:34;14917:18;;;14910:62;-1:-1:-1;;;14988:18:1;;;14981:31;15029:19;;111447:57:0;;;;;;;;;107764:10;-1:-1:-1;;;;;111539:21:0;;;;:62;;-1:-1:-1;111564:37:0;111581:5;107764:10;112267:164;:::i;111564:37::-;111517:173;;;;-1:-1:-1;;;111517:173:0;;15261:2:1;111517:173:0;;;15243:21:1;15300:2;15280:18;;;15273:30;15339:34;15319:18;;;15312:62;15410:31;15390:18;;;15383:59;15459:19;;111517:173:0;15059:425:1;111517:173:0;111703:21;111712:2;111716:7;111703:8;:21::i;:::-;111386:346;111316:416;;:::o;112498:335::-;112693:41;107764:10;112726:7;112693:18;:41::i;:::-;112685:99;;;;-1:-1:-1;;;112685:99:0;;;;;;;:::i;:::-;112797:28;112807:4;112813:2;112817:7;112797:9;:28::i;140782:239::-;140862:7;140898:23;140915:5;140898:16;:23::i;:::-;140890:5;:31;140882:87;;;;-1:-1:-1;;;140882:87:0;;9845:2:1;140882:87:0;;;9827:21:1;9884:2;9864:18;;;9857:30;9923:34;9903:18;;;9896:62;-1:-1:-1;;;9974:18:1;;;9967:41;10025:19;;140882:87:0;9643:407:1;140882:87:0;-1:-1:-1;;;;;;140987:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;140782:239::o;140369:385::-;134688:13;:11;:13::i;:::-;140441:21:::1;140481:42;140473:80;140549:3;140534:12;140441:21:::0;140545:1:::1;140534:12;:::i;:::-;:18;;;;:::i;:::-;140473:80;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;140572:42:0::1;140564:80;140640:3;140625:12;:8:::0;140636:1:::1;140625:12;:::i;:::-;:18;;;;:::i;:::-;140564:80;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;140656:7;140677;134875:6:::0;;-1:-1:-1;;;;;134875:6:0;;134802:87;140677:7:::1;-1:-1:-1::0;;;;;140669:21:0::1;140698;140669:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;140655:69;;;140743:2;140735:11;;;::::0;::::1;;140414:340;;140369:385::o:0;112904:185::-;113042:39;113059:4;113065:2;113069:7;113042:39;;;;;;;;;;;;:16;:39::i;138244:403::-;138313:16;138346:23;138372:17;138382:6;138372:9;:17::i;:::-;138346:43;;138404:25;138446:15;138432:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;138432:30:0;;138404:58;;138495:9;138491:119;138510:15;138506:1;:19;138491:119;;;138564:30;138584:6;138592:1;138564:19;:30::i;:::-;138550:8;138559:1;138550:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;138527:3;;;;:::i;:::-;;;;138491:119;;;-1:-1:-1;138627:8:0;138244:403;-1:-1:-1;;;138244:403:0:o;139401:88::-;134688:13;:11;:13::i;:::-;139466:4:::1;:15:::0;139401:88::o;139637:104::-;134688:13;:11;:13::i;:::-;139712:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;109996:223::-:0;110068:7;114883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;114883:16:0;;110132:56;;;;-1:-1:-1;;;110132:56:0;;14506:2:1;110132:56:0;;;14488:21:1;14545:2;14525:18;;;14518:30;-1:-1:-1;;;14564:18:1;;;14557:54;14628:18;;110132:56:0;14304:348:1;109727:207:0;109799:7;-1:-1:-1;;;;;109827:19:0;;109819:73;;;;-1:-1:-1;;;109819:73:0;;12958:2:1;109819:73:0;;;12940:21:1;12997:2;12977:18;;;12970:30;13036:34;13016:18;;;13009:62;-1:-1:-1;;;13087:18:1;;;13080:39;13136:19;;109819:73:0;12756:405:1;109819:73:0;-1:-1:-1;;;;;;109910:16:0;;;;;:9;:16;;;;;;;109727:207::o;135450:103::-;134688:13;:11;:13::i;:::-;135515:30:::1;135542:1;135515:18;:30::i;:::-;135450:103::o:0;139501:124::-;134688:13;:11;:13::i;:::-;139584::::1;:33:::0;139501:124::o;110455:104::-;110511:13;110544:7;110537:14;;;;;:::i;68133:99::-;68176:7;68203:21;:11;66506:14;;66414:114;68203:21;68196:28;;68133:99;:::o;137696:536::-;68022:12;;137766;:10;:12::i;:::-;:16;;137781:1;137766:16;:::i;:::-;:33;;137757:43;;;;;;137847:1;137842;137818:21;:19;:21::i;:::-;:25;;;;:::i;:::-;:30;;137809:40;;;;;;134875:6;;-1:-1:-1;;;;;134875:6:0;137864:10;:21;137860:87;;137929:7;137922:4;;:14;;;;:::i;:::-;137909:9;:27;;137900:37;;;;;;137979:1;137963:257;137987:7;137982:1;:12;137963:257;;138011:10;138024:11;:9;:11::i;:::-;138011:24;;138046:25;138056:10;138068:2;138046:9;:25::i;:::-;138085:13;;138100:1;138085:16;:37;;;;138105:13;;138120:2;138105:17;138085:37;:58;;;;138126:13;;138141:2;138126:17;138085:58;138082:103;;;138163:10;138157:4;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;138082:103:0;138195:13;:15;;;:13;:15;;;:::i;:::-;;;;;;138000:220;137996:3;;;;;:::i;:::-;;;;137963:257;;112041:155;112136:52;107764:10;112169:8;112179;112136:18;:52::i;139195:68::-;134688:13;:11;:13::i;:::-;139240:8:::1;:15:::0;;-1:-1:-1;;139240:15:0::1;;;::::0;;139195:68::o;113160:322::-;113334:41;107764:10;113367:7;113334:18;:41::i;:::-;113326:99;;;;-1:-1:-1;;;113326:99:0;;;;;;;:::i;:::-;113436:38;113450:4;113456:2;113460:7;113469:4;113436:13;:38::i;:::-;113160:322;;;;:::o;136668:37::-;;;;;;;:::i;138659:503::-;115285:4;114883:16;;;:7;:16;;;;;;138742:13;;-1:-1:-1;;;;;114883:16:0;138771:103;;;;-1:-1:-1;;;138771:103:0;;14090:2:1;138771:103:0;;;14072:21:1;14129:2;14109:18;;;14102:30;14168:34;14148:18;;;14141:62;-1:-1:-1;;;14219:18:1;;;14212:45;14274:19;;138771:103:0;13888:411:1;138771:103:0;138894:8;;;;;;;138891:66;;138935:14;138928:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138659:503;;;:::o;138891:66::-;138981:28;139012:10;:8;:10::i;:::-;138981:41;;139070:1;139046:14;139040:28;:31;:114;;;;;;;;;;;;;;;;;139098:14;139114:18;:7;:16;:18::i;:::-;139134:13;139081:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;139040:114;139033:121;138659:503;-1:-1:-1;;;138659:503:0:o;139759:128::-;134688:13;:11;:13::i;:::-;139846:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;68338:115::-:0;68390:7;68433:12;:10;:12::i;:::-;68022;;68417:28;;;;:::i;139271:122::-;134688:13;:11;:13::i;:::-;139353:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;135708:201::-:0;134688:13;:11;:13::i;:::-;-1:-1:-1;;;;;135797:22:0;::::1;135789:73;;;::::0;-1:-1:-1;;;135789:73:0;;10676:2:1;135789:73:0::1;::::0;::::1;10658:21:1::0;10715:2;10695:18;;;10688:30;10754:34;10734:18;;;10727:62;-1:-1:-1;;;10805:18:1;;;10798:36;10851:19;;135789:73:0::1;10474:402:1::0;135789:73:0::1;135873:28;135892:8;135873:18;:28::i;:::-;135708:201:::0;:::o;140014:190::-;134688:13;:11;:13::i;:::-;140101:6:::1;140096:101;140113:21:::0;;::::1;140096:101;;;140156:29;140171:10;;140182:1;140171:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;140156:14;:29::i;:::-;140136:3:::0;::::1;::::0;::::1;:::i;:::-;;;;140096:101;;5317:114:::0;5367:59;5422:2;5383:42;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5383:42:0;;;;;;;;;;;;;;-1:-1:-1;;;;;5383:42:0;-1:-1:-1;;;5383:42:0;;;5367:15;:59::i;66414:114::-;66506:14;;66414:114::o;68563:173::-;68610:7;68630:13;68646:21;:11;66506:14;;66414:114;68646:21;68630:37;;68680:23;:11;66625:19;;66643:1;66625:19;;;66536:127;68680:23;68723:5;68563:173;-1:-1:-1;68563:173:0:o;66536:127::-;66625:19;;66643:1;66625:19;;;66536:127::o;88442:326::-;-1:-1:-1;;;;;88737:19:0;;:23;;;88442:326::o;134967:132::-;134875:6;;-1:-1:-1;;;;;134875:6:0;107764:10;135031:23;135023:68;;;;-1:-1:-1;;;135023:68:0;;13729:2:1;135023:68:0;;;13711:21:1;;;13748:18;;;13741:30;13807:34;13787:18;;;13780:62;13859:18;;135023:68:0;13527:356:1;121599:135:0;115285:4;114883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;114883:16:0;121673:53;;;;-1:-1:-1;;;121673:53:0;;14506:2:1;121673:53:0;;;14488:21:1;14545:2;14525:18;;;14518:30;-1:-1:-1;;;14564:18:1;;;14557:54;14628:18;;121673:53:0;14304:348:1;120878:174:0;120953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;120953:29:0;-1:-1:-1;;;;;120953:29:0;;;;;;;;:24;;121007:23;120953:24;121007:14;:23::i;:::-;-1:-1:-1;;;;;120998:46:0;;;;;;;;;;;120878:174;;:::o;115515:264::-;115608:4;115625:13;115641:23;115656:7;115641:14;:23::i;:::-;115625:39;;115694:5;-1:-1:-1;;;;;115683:16:0;:7;-1:-1:-1;;;;;115683:16:0;;:52;;;-1:-1:-1;;;;;;112388:25:0;;;112364:4;112388:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;115703:32;115683:87;;;;115763:7;-1:-1:-1;;;;;115739:31:0;:20;115751:7;115739:11;:20::i;:::-;-1:-1:-1;;;;;115739:31:0;;115683:87;115675:96;115515:264;-1:-1:-1;;;;115515:264:0:o;119502:1257::-;119661:4;-1:-1:-1;;;;;119634:31:0;:23;119649:7;119634:14;:23::i;:::-;-1:-1:-1;;;;;119634:31:0;;119626:81;;;;-1:-1:-1;;;119626:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;119726:16:0;;119718:65;;;;-1:-1:-1;;;119718:65:0;;11846:2:1;119718:65:0;;;11828:21:1;11885:2;11865:18;;;11858:30;11924:34;11904:18;;;11897:62;-1:-1:-1;;;11975:18:1;;;11968:34;12019:19;;119718:65:0;11644:400:1;119718:65:0;119796:39;119817:4;119823:2;119827:7;119796:20;:39::i;:::-;119965:4;-1:-1:-1;;;;;119938:31:0;:23;119953:7;119938:14;:23::i;:::-;-1:-1:-1;;;;;119938:31:0;;119930:81;;;;-1:-1:-1;;;119930:81:0;;;;;;;:::i;:::-;120083:24;;;;:15;:24;;;;;;;;120076:31;;-1:-1:-1;;;;;;120076:31:0;;;;;;-1:-1:-1;;;;;120559:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;120559:20:0;;;120594:13;;;;;;;;;:18;;120076:31;120594:18;;;120634:16;;;:7;:16;;;;;;:21;;;;;;;;;;120673:27;;120099:7;;120673:27;;;111386:346;111316:416;;:::o;136069:191::-;136162:6;;;-1:-1:-1;;;;;136179:17:0;;;-1:-1:-1;;;;;;136179:17:0;;;;;;;136212:40;;136162:6;;;136179:17;136162:6;;136212:40;;136143:16;;136212:40;136132:128;136069:191;:::o;70580:1264::-;70647:7;68878:1;68854:21;:19;:21::i;:::-;:25;68846:62;;;;-1:-1:-1;;;68846:62:0;;12605:2:1;68846:62:0;;;12587:21:1;12644:2;12624:18;;;12617:30;12683:26;12663:18;;;12656:54;12727:18;;68846:62:0;12403:348:1;68846:62:0;70667:16:::1;70702:12;:10;:12::i;:::-;68022::::0;;70686:28:::1;;;;:::i;:::-;70774:195;::::0;-1:-1:-1;;70809:10:0::1;5509:2:1::0;5505:15;;;5501:24;;70774:195:0::1;::::0;::::1;5489:37:1::0;70838:14:0::1;5560:15:1::0;;5556:24;5542:12;;;5535:46;70871:16:0::1;5597:12:1::0;;;5590:28;70906:14:0::1;5634:12:1::0;;;5627:28;70939:15:0::1;5671:13:1::0;;;5664:29;70667:47:0;;-1:-1:-1;70725:14:0::1;::::0;70667:47;;5709:13:1;;70774:195:0::1;;;;;;;;;;;;70750:230;;;;;;70742:239;;:250;;;;:::i;:::-;71005:13;71037:19:::0;;;:11:::1;:19;::::0;;;;;70725:267;;-1:-1:-1;71005:13:0;71033:304:::1;;-1:-1:-1::0;71182:6:0;71033:304:::1;;;-1:-1:-1::0;71306:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;71033:304:::1;71414:11;:25;71426:12;71437:1;71426:8:::0;:12:::1;:::i;:::-;71414:25;;;;;;;;;;;;71443:1;71414:30;71410:331;;;71548:12;71559:1;71548:8:::0;:12:::1;:::i;:::-;71526:19;::::0;;;:11:::1;:19;::::0;;;;:34;71410:331:::1;;;71704:11;:25;71716:12;71727:1;71716:8:::0;:12:::1;:::i;:::-;71704:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;71704:25:0;;;;71682:19;;;:11:::1;:19:::0;;;;:47;71410:331:::1;71782:17;:15;:17::i;:::-;-1:-1:-1::0;71827:9:0::1;::::0;71819:17:::1;::::0;:5;:17:::1;:::i;:::-;71812:24;;;;;70580:1264:::0;:::o;116121:110::-;116197:26;116207:2;116211:7;116197:26;;;;;;;;;;;;:9;:26::i;121195:315::-;121350:8;-1:-1:-1;;;;;121341:17:0;:5;-1:-1:-1;;;;;121341:17:0;;;121333:55;;;;-1:-1:-1;;;121333:55:0;;12251:2:1;121333:55:0;;;12233:21:1;12290:2;12270:18;;;12263:30;12329:27;12309:18;;;12302:55;12374:18;;121333:55:0;12049:349:1;121333:55:0;-1:-1:-1;;;;;121399:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;121399:46:0;;;;;;;;;;121461:41;;8953::1;;;121461::0;;8926:18:1;121461:41:0;;;;;;;121195:315;;;:::o;114363:313::-;114519:28;114529:4;114535:2;114539:7;114519:9;:28::i;:::-;114566:47;114589:4;114595:2;114599:7;114608:4;114566:22;:47::i;:::-;114558:110;;;;-1:-1:-1;;;114558:110:0;;;;;;;:::i;137566:108::-;137626:13;137659:7;137652:14;;;;;:::i;85262:716::-;85318:13;85369:14;85386:17;85397:5;85386:10;:17::i;:::-;85406:1;85386:21;85369:38;;85422:20;85456:6;85445:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;85445:18:0;-1:-1:-1;85422:41:0;-1:-1:-1;85587:28:0;;;85603:2;85587:28;85644:288;-1:-1:-1;;85676:5:0;-1:-1:-1;;;85813:2:0;85802:14;;85797:30;85676:5;85784:44;85874:2;85865:11;;;-1:-1:-1;85899:10:0;85895:21;;85911:5;;85895:21;85644:288;;140216:140;140277:15;140295:11;:9;:11::i;:::-;140277:29;;140317:31;140327:8;140337:10;140317:9;:31::i;252:295::-;341:14;;203:42;453:2;440:16;;317:21;;341:14;440:16;203:42;481:5;470:68;461:77;;414:129;;252:295;:::o;142629:589::-;-1:-1:-1;;;;;142835:18:0;;142831:187;;142870:40;142902:7;142557:10;:17;;142530:24;;;;:15;:24;;;;;:44;;;142585:24;;;;;;;;;;;;142453:164;142870:40;142831:187;;;142940:2;-1:-1:-1;;;;;142932:10:0;:4;-1:-1:-1;;;;;142932:10:0;;142928:90;;142959:47;142992:4;142998:7;142959:32;:47::i;:::-;-1:-1:-1;;;;;143032:16:0;;143028:183;;143065:45;143102:7;143065:36;:45::i;143028:183::-;143138:4;-1:-1:-1;;;;;143132:10:0;:2;-1:-1:-1;;;;;143132:10:0;;143128:83;;143159:40;143187:2;143191:7;143159:27;:40::i;116458:319::-;116587:18;116593:2;116597:7;116587:5;:18::i;:::-;116638:53;116669:1;116673:2;116677:7;116686:4;116638:22;:53::i;:::-;116616:153;;;;-1:-1:-1;;;116616:153:0;;;;;;;:::i;122298:853::-;122452:4;-1:-1:-1;;;;;122473:13:0;;88737:19;:23;122469:675;;122509:71;;-1:-1:-1;;;122509:71:0;;-1:-1:-1;;;;;122509:36:0;;;;;:71;;107764:10;;122560:4;;122566:7;;122575:4;;122509:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122509:71:0;;;;;;;;-1:-1:-1;;122509:71:0;;;;;;;;;;;;:::i;:::-;;;122505:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122750:13:0;;122746:328;;122793:60;;-1:-1:-1;;;122793:60:0;;;;;;;:::i;122746:328::-;123024:6;123018:13;123009:6;123005:2;123001:15;122994:38;122505:584;-1:-1:-1;;;;;;122631:51:0;-1:-1:-1;;;122631:51:0;;-1:-1:-1;122624:58:0;;122469:675;-1:-1:-1;123128:4:0;122298:853;;;;;;:::o;82075:922::-;82128:7;;-1:-1:-1;;;82206:15:0;;82202:102;;-1:-1:-1;;;82242:15:0;;;-1:-1:-1;82286:2:0;82276:12;82202:102;82331:6;82322:5;:15;82318:102;;82367:6;82358:15;;;-1:-1:-1;82402:2:0;82392:12;82318:102;82447:6;82438:5;:15;82434:102;;82483:6;82474:15;;;-1:-1:-1;82518:2:0;82508:12;82434:102;82563:5;82554;:14;82550:99;;82598:5;82589:14;;;-1:-1:-1;82632:1:0;82622:11;82550:99;82676:5;82667;:14;82663:99;;82711:5;82702:14;;;-1:-1:-1;82745:1:0;82735:11;82663:99;82789:5;82780;:14;82776:99;;82824:5;82815:14;;;-1:-1:-1;82858:1:0;82848:11;82776:99;82902:5;82893;:14;82889:66;;82938:1;82928:11;82983:6;82075:922;-1:-1:-1;;82075:922:0:o;141266:643::-;141358:22;141408:1;141383:22;141400:4;141383:16;:22::i;:::-;:26;;;;:::i;:::-;141420:18;141441:26;;;:17;:26;;;;;;141358:51;;-1:-1:-1;141482:28:0;;;141478:326;;-1:-1:-1;;;;;141549:18:0;;141527:19;141549:18;;;:12;:18;;;;;;;;:34;;;;;;;;;141598:30;;;;;;:44;;;141715:30;;:17;:30;;;;;:43;;;141478:326;-1:-1:-1;141823:26:0;;;;:17;:26;;;;;;;;141816:33;;;-1:-1:-1;;;;;141867:18:0;;;;;:12;:18;;;;;:34;;;;;;;141860:41;141266:643::o;141922:519::-;142031:10;:17;142006:22;;142031:21;;142051:1;;142031:21;:::i;:::-;142063:18;142084:24;;;:15;:24;;;;;;142143:10;:26;;142006:46;;-1:-1:-1;142084:24:0;;142006:46;;142143:26;;;;;;:::i;:::-;;;;;;;;;142121:48;;142207:11;142182:10;142193;142182:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;142287:28;;;:15;:28;;;;;;;:41;;;142382:24;;;;;142375:31;142417:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;141993:448;;;141922:519;:::o;141033:221::-;141118:14;141135:20;141152:2;141135:16;:20::i;:::-;-1:-1:-1;;;;;141166:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;141211:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;141033:221:0:o;117113:936::-;-1:-1:-1;;;;;117193:16:0;;117185:61;;;;-1:-1:-1;;;117185:61:0;;13368:2:1;117185:61:0;;;13350:21:1;;;13387:18;;;13380:30;13446:34;13426:18;;;13419:62;13498:18;;117185:61:0;13166:356:1;117185:61:0;115285:4;114883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;114883:16:0;115309:31;117257:58;;;;-1:-1:-1;;;117257:58:0;;11489:2:1;117257:58:0;;;11471:21:1;11528:2;11508:18;;;11501:30;11567;11547:18;;;11540:58;11615:18;;117257:58:0;11287:352:1;117257:58:0;117328:45;117357:1;117361:2;117365:7;117328:20;:45::i;:::-;115285:4;114883:16;;;:7;:16;;;;;;-1:-1:-1;;;;;114883:16:0;115309:31;117463:58;;;;-1:-1:-1;;;117463:58:0;;11489:2:1;117463:58:0;;;11471:21:1;11528:2;11508:18;;;11501:30;11567;11547:18;;;11540:58;11615:18;;117463:58:0;11287:352:1;117463:58:0;-1:-1:-1;;;;;117870:13:0;;;;;;:9;:13;;;;;;;;:18;;117887:1;117870:18;;;117912:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;117912:21:0;;;;;117951:33;117920:7;;117870:13;;117951:33;;117870:13;;117951:33;140414:340:::1;;140369:385::o:0;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:186;1052:6;1105:2;1093:9;1084:7;1080:23;1076:32;1073:52;;;1121:1;1118;1111:12;1073:52;1144:29;1163:9;1144:29;:::i;1184:260::-;1252:6;1260;1313:2;1301:9;1292:7;1288:23;1284:32;1281:52;;;1329:1;1326;1319:12;1281:52;1352:29;1371:9;1352:29;:::i;:::-;1342:39;;1400:38;1434:2;1423:9;1419:18;1400:38;:::i;:::-;1390:48;;1184:260;;;;;:::o;1449:328::-;1526:6;1534;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1634:29;1653:9;1634:29;:::i;:::-;1624:39;;1682:38;1716:2;1705:9;1701:18;1682:38;:::i;:::-;1672:48;;1767:2;1756:9;1752:18;1739:32;1729:42;;1449:328;;;;;:::o;1782:666::-;1877:6;1885;1893;1901;1954:3;1942:9;1933:7;1929:23;1925:33;1922:53;;;1971:1;1968;1961:12;1922:53;1994:29;2013:9;1994:29;:::i;:::-;1984:39;;2042:38;2076:2;2065:9;2061:18;2042:38;:::i;:::-;2032:48;;2127:2;2116:9;2112:18;2099:32;2089:42;;2182:2;2171:9;2167:18;2154:32;2209:18;2201:6;2198:30;2195:50;;;2241:1;2238;2231:12;2195:50;2264:22;;2317:4;2309:13;;2305:27;-1:-1:-1;2295:55:1;;2346:1;2343;2336:12;2295:55;2369:73;2434:7;2429:2;2416:16;2411:2;2407;2403:11;2369:73;:::i;:::-;2359:83;;;1782:666;;;;;;;:::o;2453:254::-;2518:6;2526;2579:2;2567:9;2558:7;2554:23;2550:32;2547:52;;;2595:1;2592;2585:12;2547:52;2618:29;2637:9;2618:29;:::i;:::-;2608:39;;2666:35;2697:2;2686:9;2682:18;2666:35;:::i;2712:254::-;2780:6;2788;2841:2;2829:9;2820:7;2816:23;2812:32;2809:52;;;2857:1;2854;2847:12;2809:52;2880:29;2899:9;2880:29;:::i;:::-;2870:39;2956:2;2941:18;;;;2928:32;;-1:-1:-1;;;2712:254:1:o;2971:615::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:52;;;3134:1;3131;3124:12;3086:52;3174:9;3161:23;3203:18;3244:2;3236:6;3233:14;3230:34;;;3260:1;3257;3250:12;3230:34;3298:6;3287:9;3283:22;3273:32;;3343:7;3336:4;3332:2;3328:13;3324:27;3314:55;;3365:1;3362;3355:12;3314:55;3405:2;3392:16;3431:2;3423:6;3420:14;3417:34;;;3447:1;3444;3437:12;3417:34;3500:7;3495:2;3485:6;3482:1;3478:14;3474:2;3470:23;3466:32;3463:45;3460:65;;;3521:1;3518;3511:12;3460:65;3552:2;3544:11;;;;;3574:6;;-1:-1:-1;2971:615:1;;-1:-1:-1;;;;2971:615:1:o;3591:180::-;3647:6;3700:2;3688:9;3679:7;3675:23;3671:32;3668:52;;;3716:1;3713;3706:12;3668:52;3739:26;3755:9;3739:26;:::i;3776:245::-;3834:6;3887:2;3875:9;3866:7;3862:23;3858:32;3855:52;;;3903:1;3900;3893:12;3855:52;3942:9;3929:23;3961:30;3985:5;3961:30;:::i;4026:249::-;4095:6;4148:2;4136:9;4127:7;4123:23;4119:32;4116:52;;;4164:1;4161;4154:12;4116:52;4196:9;4190:16;4215:30;4239:5;4215:30;:::i;4280:450::-;4349:6;4402:2;4390:9;4381:7;4377:23;4373:32;4370:52;;;4418:1;4415;4408:12;4370:52;4458:9;4445:23;4491:18;4483:6;4480:30;4477:50;;;4523:1;4520;4513:12;4477:50;4546:22;;4599:4;4591:13;;4587:27;-1:-1:-1;4577:55:1;;4628:1;4625;4618:12;4577:55;4651:73;4716:7;4711:2;4698:16;4693:2;4689;4685:11;4651:73;:::i;4735:180::-;4794:6;4847:2;4835:9;4826:7;4822:23;4818:32;4815:52;;;4863:1;4860;4853:12;4815:52;-1:-1:-1;4886:23:1;;4735:180;-1:-1:-1;4735:180:1:o;4920:257::-;4961:3;4999:5;4993:12;5026:6;5021:3;5014:19;5042:63;5098:6;5091:4;5086:3;5082:14;5075:4;5068:5;5064:16;5042:63;:::i;:::-;5159:2;5138:15;-1:-1:-1;;5134:29:1;5125:39;;;;5166:4;5121:50;;4920:257;-1:-1:-1;;4920:257:1:o;5733:1527::-;5957:3;5995:6;5989:13;6021:4;6034:51;6078:6;6073:3;6068:2;6060:6;6056:15;6034:51;:::i;:::-;6148:13;;6107:16;;;;6170:55;6148:13;6107:16;6192:15;;;6170:55;:::i;:::-;6314:13;;6247:20;;;6287:1;;6374;6396:18;;;;6449;;;;6476:93;;6554:4;6544:8;6540:19;6528:31;;6476:93;6617:2;6607:8;6604:16;6584:18;6581:40;6578:167;;;-1:-1:-1;;;6644:33:1;;6700:4;6697:1;6690:15;6730:4;6651:3;6718:17;6578:167;6761:18;6788:110;;;;6912:1;6907:328;;;;6754:481;;6788:110;-1:-1:-1;;6823:24:1;;6809:39;;6868:20;;;;-1:-1:-1;6788:110:1;;6907:328;15744:1;15737:14;;;15781:4;15768:18;;7002:1;7016:169;7030:8;7027:1;7024:15;7016:169;;;7112:14;;7097:13;;;7090:37;7155:16;;;;7047:10;;7016:169;;;7020:3;;7216:8;7209:5;7205:20;7198:27;;6754:481;-1:-1:-1;7251:3:1;;5733:1527;-1:-1:-1;;;;;;;;;;;5733:1527:1:o;7683:488::-;-1:-1:-1;;;;;7952:15:1;;;7934:34;;8004:15;;7999:2;7984:18;;7977:43;8051:2;8036:18;;8029:34;;;8099:3;8094:2;8079:18;;8072:31;;;7877:4;;8120:45;;8145:19;;8137:6;8120:45;:::i;:::-;8112:53;7683:488;-1:-1:-1;;;;;;7683:488:1:o;8176:632::-;8347:2;8399:21;;;8469:13;;8372:18;;;8491:22;;;8318:4;;8347:2;8570:15;;;;8544:2;8529:18;;;8318:4;8613:169;8627:6;8624:1;8621:13;8613:169;;;8688:13;;8676:26;;8757:15;;;;8722:12;;;;8649:1;8642:9;8613:169;;;-1:-1:-1;8799:3:1;;8176:632;-1:-1:-1;;;;;;8176:632:1:o;9005:219::-;9154:2;9143:9;9136:21;9117:4;9174:44;9214:2;9203:9;9199:18;9191:6;9174:44;:::i;9229:409::-;9431:2;9413:21;;;9470:2;9450:18;;;9443:30;9509:34;9504:2;9489:18;;9482:62;-1:-1:-1;;;9575:2:1;9560:18;;9553:43;9628:3;9613:19;;9229:409::o;10055:414::-;10257:2;10239:21;;;10296:2;10276:18;;;10269:30;10335:34;10330:2;10315:18;;10308:62;-1:-1:-1;;;10401:2:1;10386:18;;10379:48;10459:3;10444:19;;10055:414::o;10881:401::-;11083:2;11065:21;;;11122:2;11102:18;;;11095:30;11161:34;11156:2;11141:18;;11134:62;-1:-1:-1;;;11227:2:1;11212:18;;11205:35;11272:3;11257:19;;10881:401::o;15797:128::-;15837:3;15868:1;15864:6;15861:1;15858:13;15855:39;;;15874:18;;:::i;:::-;-1:-1:-1;15910:9:1;;15797:128::o;15930:120::-;15970:1;15996;15986:35;;16001:18;;:::i;:::-;-1:-1:-1;16035:9:1;;15930:120::o;16055:168::-;16095:7;16161:1;16157;16153:6;16149:14;16146:1;16143:21;16138:1;16131:9;16124:17;16120:45;16117:71;;;16168:18;;:::i;:::-;-1:-1:-1;16208:9:1;;16055:168::o;16228:125::-;16268:4;16296:1;16293;16290:8;16287:34;;;16301:18;;:::i;:::-;-1:-1:-1;16338:9:1;;16228:125::o;16358:258::-;16430:1;16440:113;16454:6;16451:1;16448:13;16440:113;;;16530:11;;;16524:18;16511:11;;;16504:39;16476:2;16469:10;16440:113;;;16571:6;16568:1;16565:13;16562:48;;;-1:-1:-1;;16606:1:1;16588:16;;16581:27;16358:258::o;16621:380::-;16700:1;16696:12;;;;16743;;;16764:61;;16818:4;16810:6;16806:17;16796:27;;16764:61;16871:2;16863:6;16860:14;16840:18;16837:38;16834:161;;;16917:10;16912:3;16908:20;16905:1;16898:31;16952:4;16949:1;16942:15;16980:4;16977:1;16970:15;16834:161;;16621:380;;;:::o;17006:135::-;17045:3;-1:-1:-1;;17066:17:1;;17063:43;;;17086:18;;:::i;:::-;-1:-1:-1;17133:1:1;17122:13;;17006:135::o;17146:112::-;17178:1;17204;17194:35;;17209:18;;:::i;:::-;-1:-1:-1;17243:9:1;;17146:112::o;17263:127::-;17324:10;17319:3;17315:20;17312:1;17305:31;17355:4;17352:1;17345:15;17379:4;17376:1;17369:15;17395:127;17456:10;17451:3;17447:20;17444:1;17437:31;17487:4;17484:1;17477:15;17511:4;17508:1;17501:15;17527:127;17588:10;17583:3;17579:20;17576:1;17569:31;17619:4;17616:1;17609:15;17643:4;17640:1;17633:15;17659:127;17720:10;17715:3;17711:20;17708:1;17701:31;17751:4;17748:1;17741:15;17775:4;17772:1;17765:15;17791:127;17852:10;17847:3;17843:20;17840:1;17833:31;17883:4;17880:1;17873:15;17907:4;17904:1;17897:15;17923:131;-1:-1:-1;;;;;;17997:32:1;;17987:43;;17977:71;;18044:1;18041;18034:12
Swarm Source
ipfs://82c8f176bc1ca236a66d0c5ac4bc3f3c9249d2d8bb6ba224ff4179b054b855c9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 24 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
MATIC | Polygon (MATIC) | 100.00% | $1.01 | 5 | $5.04 |
[ 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.