Contract
0x15c841043e13ffaa9a99fabea236d40f45615623
2
[ Download CSV Export ]
OVERVIEW
Tycoons are highly desirable, collectible NFTs, they also generate $BUSINESSES.Contract Name:
BusinessesV2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at snowtrace.io on 2022-02-15 */ // File: hardhat/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(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", 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, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", 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, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", 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(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", 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, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", 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, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", 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(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", 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: @openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() initializer {} * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { __Context_init_unchained(); } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol // OpenZeppelin Contracts v4.4.1 (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 IERC721ReceiverUpgradeable { /** * @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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.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 IERC165Upgradeable { /** * @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: @openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.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 IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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: @openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol // OpenZeppelin Contracts v4.4.1 (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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable 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. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); 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) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); 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 overriden 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 = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); 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: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 _owners[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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(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(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {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 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 IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @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` 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 {} uint256[44] private __gap; } // File: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; } // File: @openzeppelin/contracts/interfaces/IERC721.sol // OpenZeppelin Contracts v4.4.1 (interfaces/IERC721.sol) pragma solidity ^0.8.0; // File: @openzeppelin/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: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { 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: Authorizable.sol pragma solidity >=0.8.0; contract Authorizable is Ownable { mapping(address => bool) public authorized; modifier onlyAuthorized() { require(authorized[msg.sender] || owner() == msg.sender, "Not authorized"); _; } function addAuthorized(address _toAdd) onlyOwner public { require(_toAdd != address(0)); authorized[_toAdd] = true; } function removeAuthorized(address _toRemove) onlyOwner public { require(_toRemove != address(0)); require(_toRemove != msg.sender); authorized[_toRemove] = false; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens 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 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: VM_Tycoon.sol // contracts/ERC721.sol // upgradeable contract pragma solidity >=0.8.0; interface splitter { function split(uint256 value) external payable; } contract VM_Tycoon is ERC721Upgradeable { // Royalty address private _owner; address private _mintRoyaltiesAddr; // royality receiver for mint address private _buyRoyaltiesAddr; // royality receives for buy uint256 public royaltyPercentage; // royalty based on sales price mapping(address => bool) public excludedList; // list of people who dont have to pay fee //GB HOLDERS EARLY ACCESS TOKENS uint256 public constant gbHoldersMaxMint = 900; mapping(address => bool) public gbholders; address public GB_erc20_contract; uint256[] private _gbTokenSupply; // cost to mint uint256 public mintFeeAmount; // // NFT Meta data string public baseURL; uint256 public constant maxSupply = 10000; // enable flag for public and GB bool public openForGB; bool public openForPublic; // define VMTycoon struct struct VMTycoon { uint256 tokenId; // string tokenURI; address mintedBy; address currentOwner; uint256 previousPrice; uint256 price; uint256 numberOfTransfers; bool forSale; uint256 level; } using Counters for Counters.Counter; Counters.Counter private _tokenIds; // map id to VMTycoon obj mapping(uint256 => VMTycoon) public allVMTycoons; // implement the IERC721Enumerable which no longer come by default in openzeppelin 4.x // 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; //================================= Events ================================= // event GBERC20Checked(address indexed _holder, uint256 _bal, bool _result); event SaleToggle(uint256 vmtycoonNumber, bool isForSale, uint256 price); event PurchaseEvent(uint256 vmtycoonNumber, address from, address to, uint256 price); function initialize( address _contractOwner, address _mintRoyaltyReceiver, address _buyRoyaltyReceiver, uint256 _royaltyPercentage, uint256 _mintFeeAmount, string memory _baseURL, bool _openForPublic ) public initializer { // __ERC721_init("swng", "swng"); __ERC721_init("Vending Machines Tycoon", "VMT"); royaltyPercentage = _royaltyPercentage; _owner = _contractOwner; _mintRoyaltiesAddr = _mintRoyaltyReceiver; _buyRoyaltiesAddr = _buyRoyaltyReceiver; mintFeeAmount = _mintFeeAmount; excludedList[_buyRoyaltyReceiver] = true; baseURL = _baseURL; openForPublic = _openForPublic; } function mint(uint256 numberOfToken) public payable { // check if thic fucntion caller is not an zero address account require(openForPublic == true, "not open"); require(msg.sender != address(0)); require( _allTokens.length + numberOfToken <= maxSupply, "max supply" ); require(numberOfToken > 0, "Min 1"); require(numberOfToken <= 12, "Max 12"); uint256 price = 0; // pay for minting cost if (excludedList[msg.sender] == false) { // send token's worth of ethers to the owner price = mintFeeAmount * numberOfToken; require(msg.value == price, "Not enough fee"); payable(_mintRoyaltiesAddr).transfer(msg.value); splitter(_mintRoyaltiesAddr).split(msg.value); } else { // return money to sender // since its free payable(msg.sender).transfer(msg.value); } for (uint256 i = 1; i <= numberOfToken; i++) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _safeMint(msg.sender, newItemId); VMTycoon memory newVMTycoon = VMTycoon( newItemId, msg.sender, msg.sender, 0, price, 0, false, 100 ); // add the token id to the allVMTycoons allVMTycoons[newItemId] = newVMTycoon; } } function changeUrl(string memory url) external { require(msg.sender == _owner, "Only owner"); baseURL = url; } function totalSupply() public view returns (uint256) { return _allTokens.length; } // GB holder related functions function gbTotalSupply() public view returns (uint256) { return _gbTokenSupply.length; } function setPriceForSale( uint256 _tokenId, uint256 _newPrice, bool isForSale ) external { require(_exists(_tokenId), "token not found"); address tokenOwner = ownerOf(_tokenId); require(tokenOwner == msg.sender, "not owner"); VMTycoon memory vmtycoon = allVMTycoons[_tokenId]; vmtycoon.price = _newPrice; vmtycoon.forSale = isForSale; allVMTycoons[_tokenId] = vmtycoon; emit SaleToggle(_tokenId, isForSale, _newPrice); } function getAllSaleTokens() public view returns (uint256[] memory) { uint256 _totalSupply = totalSupply(); uint256[] memory _tokenForSales = new uint256[](_totalSupply); uint256 counter = 0; for (uint256 i = 1; i <= _totalSupply; i++) { if (allVMTycoons[i].forSale == true) { _tokenForSales[counter] = allVMTycoons[i].tokenId; counter++; } } return _tokenForSales; } /* struct VMTycoon { uint256 tokenId; // string tokenURI; address mintedBy; address currentOwner; uint256 previousPrice; uint256 price; uint256 numberOfTransfers; bool forSale; uint256 level; } */ function getAllTokensInfo(uint256[] calldata IDList) public view returns (uint256[] memory, address[] memory, uint256[] memory, uint256[] memory, bool[] memory, uint256[] memory) { uint256[] memory tokenId = new uint256[](IDList.length); address[] memory currentOwner = new address[](IDList.length); uint256[] memory previousPrice = new uint256[](IDList.length); uint256[] memory price = new uint256[](IDList.length); bool[] memory forSale = new bool[](IDList.length); uint256[] memory level = new uint256[](IDList.length); uint256 index = 0; for (; index < IDList.length; ++index) { uint256 currentIndex = IDList[index]; tokenId[index] = allVMTycoons[currentIndex].tokenId; currentOwner[index] = allVMTycoons[currentIndex].currentOwner; previousPrice[index] = allVMTycoons[currentIndex].previousPrice; price[index] = allVMTycoons[currentIndex].price; forSale[index] = allVMTycoons[currentIndex].forSale; level[index] = allVMTycoons[currentIndex].level; } return (tokenId, currentOwner, previousPrice, price, forSale, level); } // by a token by passing in the token's id function buyToken(uint256 _tokenId) public payable { // check if the token id of the token being bought exists or not require(_exists(_tokenId)); // get the token's owner address tokenOwner = ownerOf(_tokenId); // token's owner should not be an zero address account require(tokenOwner != address(0)); // the one who wants to buy the token should not be the token's owner require(tokenOwner != msg.sender); // get that token from all VMTycoons mapping and create a memory of it defined as (struct => VMTycoon) VMTycoon memory vmtycoon = allVMTycoons[_tokenId]; // price sent in to buy should be equal to or more than the token's price require(msg.value >= vmtycoon.price); // token should be for sale require(vmtycoon.forSale); uint256 amount = msg.value; uint256 _royaltiesAmount = (amount * royaltyPercentage) / 100; uint256 payOwnerAmount = amount - _royaltiesAmount; payable(_buyRoyaltiesAddr).transfer(_royaltiesAmount); payable(vmtycoon.currentOwner).transfer(payOwnerAmount); vmtycoon.previousPrice = vmtycoon.price; allVMTycoons[_tokenId] = vmtycoon; _transfer(tokenOwner, msg.sender, _tokenId); emit PurchaseEvent(_tokenId, vmtycoon.currentOwner, msg.sender, vmtycoon.price); } function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), "out of bounds"); return _ownedTokens[owner][index]; } // URI Storage override functions /** Overrides ERC-721's _baseURI function */ function _baseURI() internal view virtual override(ERC721Upgradeable) returns (string memory) { return baseURL; } function _burn(uint256 tokenId) internal override(ERC721Upgradeable) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721Upgradeable) returns (string memory) { return super.tokenURI(tokenId); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * 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(ERC721Upgradeable) { super._beforeTokenTransfer(from, to, tokenId); VMTycoon memory vmtycoon = allVMTycoons[tokenId]; vmtycoon.currentOwner = to; vmtycoon.numberOfTransfers += 1; vmtycoon.forSale = false; allVMTycoons[tokenId] = vmtycoon; 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); } } function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { uint256 lastTokenIndex = 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]; } 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 // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } // upgrade contract to support authorized mapping(address => bool) public authorized; modifier onlyAuthorized() { require(authorized[msg.sender] || msg.sender == _owner , "Not authorized"); _; } function addAuthorized(address _toAdd) public { require(msg.sender == _owner, 'Not owner'); require(_toAdd != address(0)); authorized[_toAdd] = true; } function removeAuthorized(address _toRemove) public { require(msg.sender == _owner, 'Not owner'); require(_toRemove != address(0)); require(_toRemove != msg.sender); authorized[_toRemove] = false; } // upgrade the contract function setLevel(uint256 _tokenId, uint256 _newLevel) external onlyAuthorized { VMTycoon memory vmtycoon = allVMTycoons[_tokenId]; vmtycoon.level = _newLevel; // set and update that token in the mapping allVMTycoons[_tokenId] = vmtycoon; } // Change owner. function changeOwner(address newOwner) external { require(msg.sender == _owner, 'Not owner'); require(newOwner != address(0)); require(newOwner != msg.sender); _owner = newOwner; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: BusinessesV2.sol //SPDX-License-Identifier: MIT pragma solidity >=0.8.0; contract BusinessesV2 is ERC20, Authorizable { using SafeMath for uint256; string private TOKEN_NAME = "$BUSINESSES"; string private TOKEN_SYMBOL = "BUSINESSES"; address public VMTYCOON_CONTRACT; // the base number of $BUSINESSES per vmtycoon (i.e. 0.75 $businesses) uint256 public BASE_HOLDER_BUSINESSES = 750000000000000000; // the number of $BUSINESSES per vmtycoon per day per level (i.e. 0.25 $businesses /vmtycoon /day /level) uint256 public BUSINESSES_PER_DAY_PER_LEVEL = 250000000000000000; // how much businesses it costs to skip the cooldown uint256 public COOLDOWN_BASE = 100000000000000000000; // base 100 // how much additional businesses it costs to skip the cooldown per level uint256 public COOLDOWN_BASE_FACTOR = 100000000000000000000; // additional 100 per level // how long to wait before skip cooldown can be re-invoked uint256 public COOLDOWN_CD_IN_SECS = 86400; // additional 100 per level uint256 public LEVELING_BASE = 25; uint256 public LEVELING_RATE = 2; uint256 public COOLDOWN_RATE = 3600; // 60 mins /** * Stores staked vmtycoon fields (=> 152 <= stored in order of size for optimal packing!) */ struct StakedVMTycoonObj { // the current level level (0 -> 16,777,216) uint24 level; // when to calculate businesses from (max 20/02/36812, 11:36:16) uint32 sinceTs; // for the skipCooldown's cooldown (max 20/02/36812, 11:36:16) uint32 lastSkippedTs; // how much this vmtycoon has been fed (in whole numbers) uint48 dollaAmount; // cooldown time until level up is allow (per level) uint32 cooldownTs; } // redundant struct - can't be packed? (max totalLevel = 167,772,160,000) uint40 public totalLevel; uint16 public totalStakedVMTycoon; StakedVMTycoonObj[100001] public stakedVMTycoon; // Events event Minted(address owner, uint256 businessesAmt); event Burned(address owner, uint256 businessesAmt); event Staked(uint256 tid, uint256 ts); event UnStaked(uint256 tid, uint256 ts); // Constructor constructor(address _vmtycoonContract) ERC20(TOKEN_NAME, TOKEN_SYMBOL) { VMTYCOON_CONTRACT = _vmtycoonContract; } // "READ" Functions // How much is required to be fed to level up per level function dollaLevelingRate(uint256 level) public view returns (uint256) { // need to divide the level by 100, and make sure the dolla level is at 18 decimals return LEVELING_BASE * ((level / 100)**LEVELING_RATE); } // when using the value, need to add the current block timestamp as well function cooldownRate(uint256 level) public view returns (uint256) { // need to divide the level by 100 return (level / 100) * COOLDOWN_RATE; } // Staking Functions // stake vmtycoon, check if is already staked, get all detail for vmtycoon such as function _stake(uint256 tid) internal { VM_Tycoon x = VM_Tycoon(VMTYCOON_CONTRACT); // verify user is the owner of the vmtycoon... require(x.ownerOf(tid) == msg.sender, "NOT OWNER"); // get calc'd values... (, , , , , , , uint256 level) = x.allVMTycoons(tid); // if lastSkippedTs is 0 its mean it never have a last skip timestamp StakedVMTycoonObj memory c = stakedVMTycoon[tid]; uint32 ts = uint32(block.timestamp); if (stakedVMTycoon[tid].level == 0) { // create staked vmtycoon... stakedVMTycoon[tid] = StakedVMTycoonObj( uint24(level), ts, c.lastSkippedTs > 0 ? c.lastSkippedTs : uint32(ts - COOLDOWN_CD_IN_SECS), uint48(0), uint32(ts) + uint32(cooldownRate(level)) ); // update snapshot values... // N.B. could be optimised for multi-stakes - but only saves 0.5c AUD per vmtycoon - not worth it, this is a one time operation. totalStakedVMTycoon += 1; totalLevel += uint24(level); // let ppl know! emit Staked(tid, block.timestamp); } } // function staking(uint256 tokenId) external { // _stake(tokenId); // } function stake(uint256[] calldata tids) external { for (uint256 i = 0; i < tids.length; i++) { _stake(tids[i]); } } /** * Calculates the amount of businesses that is claimable from a vmtycoon. */ function claimableView(uint256 tokenId) public view returns (uint256) { StakedVMTycoonObj memory c = stakedVMTycoon[tokenId]; if (c.level > 0) { uint256 businessesPerDay = ((BUSINESSES_PER_DAY_PER_LEVEL * (c.level / 100)) + BASE_HOLDER_BUSINESSES); uint256 deltaSeconds = block.timestamp - c.sinceTs; return deltaSeconds * (businessesPerDay / 86400); } else { return 0; } } function myStakedVMTycoon() public view returns (uint256[] memory) { VM_Tycoon x = VM_Tycoon(VMTYCOON_CONTRACT); uint256 vmtycoonCount = x.balanceOf(msg.sender); uint256[] memory tokenIds = new uint256[](vmtycoonCount); uint256 counter = 0; for (uint256 i = 0; i < vmtycoonCount; i++) { uint256 tokenId = x.tokenOfOwnerByIndex(msg.sender, i); StakedVMTycoonObj memory vmtycoon = stakedVMTycoon[tokenId]; if (vmtycoon.level > 0) { tokenIds[counter] = tokenId; counter++; } } return tokenIds; } /** * Calculates the TOTAL amount of businesses that is claimable from ALL vmtycoons. */ function myClaimableView() public view returns (uint256) { VM_Tycoon x = VM_Tycoon(VMTYCOON_CONTRACT); uint256 cnt = x.balanceOf(msg.sender); require(cnt > 0, "NO VMTYCOON"); uint256 totalClaimable = 0; for (uint256 i = 0; i < cnt; i++) { uint256 tokenId = x.tokenOfOwnerByIndex(msg.sender, i); StakedVMTycoonObj memory vmtycoon = stakedVMTycoon[tokenId]; // make sure that the token is staked if (vmtycoon.level > 0) { uint256 claimable = claimableView(tokenId); if (claimable > 0) { totalClaimable = totalClaimable + claimable; } } } return totalClaimable; } /** * Claims businesses from the provided vmtycoons. */ function _claimBusinesses(uint256[] calldata tokenIds) internal { VM_Tycoon x = VM_Tycoon(VMTYCOON_CONTRACT); uint256 totalClaimableBusinesses = 0; for (uint256 i = 0; i < tokenIds.length; i++) { require(x.ownerOf(tokenIds[i]) == msg.sender, "NOT OWNER"); StakedVMTycoonObj memory vmtycoon = stakedVMTycoon[tokenIds[i]]; // we only care about vmtycoon that have been staked (i.e. level > 0) ... if (vmtycoon.level > 0) { uint256 claimableBusinesses = claimableView(tokenIds[i]); if (claimableBusinesses > 0) { totalClaimableBusinesses = totalClaimableBusinesses + claimableBusinesses; // reset since, for the next calc... vmtycoon.sinceTs = uint32(block.timestamp); stakedVMTycoon[tokenIds[i]] = vmtycoon; } } } if (totalClaimableBusinesses > 0) { _mint(msg.sender, totalClaimableBusinesses); emit Minted(msg.sender, totalClaimableBusinesses); } } /** * Claims businesses from the provided vmtycoons. */ function claimBusinesses(uint256[] calldata tokenIds) external { _claimBusinesses(tokenIds); } /** * Unstakes a vmtycoon. Why you'd call this, I have no idea. */ function _unstake(uint256 tokenId) internal { VM_Tycoon x = VM_Tycoon(VMTYCOON_CONTRACT); // verify user is the owner of the vmtycoon... require(x.ownerOf(tokenId) == msg.sender, "NOT OWNER"); // update vmtycoon... StakedVMTycoonObj memory c = stakedVMTycoon[tokenId]; if (c.level > 0) { // update snapshot values... totalLevel -= uint24(c.level); totalStakedVMTycoon -= 1; c.level = 0; stakedVMTycoon[tokenId] = c; // let ppl know! emit UnStaked(tokenId, block.timestamp); } } function _unstakeMultiple(uint256[] calldata tids) internal { for (uint256 i = 0; i < tids.length; i++) { _unstake(tids[i]); } } /** * Unstakes MULTIPLE vmtycoon. Why you'd call this, I have no idea. */ function unstake(uint256[] calldata tids) external { _unstakeMultiple(tids); } /** * Unstakes MULTIPLE vmtycoon AND claims the businesses. */ function withdrawAllVMTycoonAndClaim(uint256[] calldata tids) external { _claimBusinesses(tids); _unstakeMultiple(tids); } /** * Public : update the vmtycoon's level level. */ function levelUpVMTycoon(uint256 tid) external { StakedVMTycoonObj memory c = stakedVMTycoon[tid]; require(c.level > 0, "NOT STAKED"); VM_Tycoon x = VM_Tycoon(VMTYCOON_CONTRACT); // NOTE Does it matter if sender is not owner? // require(x.ownerOf(vmtycoonId) == msg.sender, "NOT OWNER"); // check: vmtycoon has eaten enough... require(c.dollaAmount >= dollaLevelingRate(c.level), "MORE FOOD REQD"); // check: cooldown has passed... require(block.timestamp >= c.cooldownTs, "COOLDOWN NOT MET"); // increase level, reset eaten to 0, update next dolla level and cooldown time c.level = c.level + 100; c.dollaAmount = 0; c.cooldownTs = uint32(block.timestamp + cooldownRate(c.level)); stakedVMTycoon[tid] = c; // need to increase overall size totalLevel += uint24(100); // and update the vmtycoon contract x.setLevel(tid, c.level); } /** * Internal: burns the given amount of businesses from the wallet. */ function _burnBusinesses(address sender, uint256 businessesAmount) internal { // NOTE do we need to check this before burn? require(balanceOf(sender) >= businessesAmount, "NOT ENOUGH BUSINESSES"); _burn(sender, businessesAmount); emit Burned(sender, businessesAmount); } /** * Burns the given amount of businesses from the sender's wallet. */ function burnBusinesses(address sender, uint256 businessesAmount) external onlyAuthorized { _burnBusinesses(sender, businessesAmount); } /** * Skips the "levelUp" cooling down period, in return for burning businesses. */ function skipCoolingOff(uint256 tokenId, uint256 businessesAmount) external { StakedVMTycoonObj memory vmtycoon = stakedVMTycoon[tokenId]; require(vmtycoon.level != 0, "NOT STAKED"); uint32 ts = uint32(block.timestamp); // NOTE Does it matter if sender is not owner? // VMTycoon instance = VMTycoon(VMTYCOON_CONTRACT); // require(instance.ownerOf(vmtycoonId) == msg.sender, "NOT OWNER"); // check: enough businesses in wallet to pay uint256 walletBalance = balanceOf(msg.sender); require(walletBalance >= businessesAmount, "NOT ENOUGH businesses IN WALLET"); // check: provided businesses amount is enough to skip this level require(businessesAmount >= checkSkipCoolingOffAmt(vmtycoon.level), "NOT ENOUGH businesses TO SKIP"); // check: user hasn't skipped cooldown in last 24 hrs require((vmtycoon.lastSkippedTs + COOLDOWN_CD_IN_SECS) <= ts, "BLOCKED BY 24HR COOLDOWN"); // burn businesses _burnBusinesses(msg.sender, businessesAmount); // disable cooldown vmtycoon.cooldownTs = ts; // track last time cooldown was skipped (i.e. now) vmtycoon.lastSkippedTs = ts; stakedVMTycoon[tokenId] = vmtycoon; } /** * Calculates the cost of skipping cooldown. */ function checkSkipCoolingOffAmt(uint256 level) public view returns (uint256) { // NOTE cannot assert level is < 100... we can have large numbers! return ((level / 100) * COOLDOWN_BASE_FACTOR); } /** * Giving credis to vmtycoon */ function equipVMTycoon(uint256 tokenId, uint256 dollaAmount) external onlyAuthorized { StakedVMTycoonObj memory vmtycoon = stakedVMTycoon[tokenId]; require(vmtycoon.level > 0, "NOT STAKED"); require(dollaAmount > 0, "NOTHING TO EQUIP"); // update the block time as well as claimable vmtycoon.dollaAmount = uint48(dollaAmount / 1e18) + vmtycoon.dollaAmount; stakedVMTycoon[tokenId] = vmtycoon; } // NOTE What happens if we update the multiplier, and people have been staked for a year...? // We need to snapshot somehow... but we're physically unable to update 10k records!!! // ADMIN: to update the cost of skipping cooldown function updateSkipCooldownValues( uint256 a, uint256 b, uint256 c, uint256 d, uint256 e ) external onlyOwner { COOLDOWN_BASE = a; COOLDOWN_BASE_FACTOR = b; COOLDOWN_CD_IN_SECS = c; BASE_HOLDER_BUSINESSES = d; BUSINESSES_PER_DAY_PER_LEVEL = e; } // INTRA-CONTRACT: use this function to mint businesses to users // this also get called by the DOLLA contract function mintBusinesses(address sender, uint256 amount) external onlyAuthorized { _mint(sender, amount); emit Minted(sender, amount); } // ADMIN: drop businesses to the given vmtycoon wallet owners (within the vmtycoonId range from->to). function airdropToExistingHolder( uint256 from, uint256 to, uint256 amountOfBusinesses ) external onlyOwner { // mint 100 businesses to every owners VM_Tycoon instance = VM_Tycoon(VMTYCOON_CONTRACT); for (uint256 i = from; i <= to; i++) { address currentOwner = instance.ownerOf(i); if (currentOwner != address(0)) { _mint(currentOwner, amountOfBusinesses * 1e18); } } } // ADMIN: Rebalance user wallet by minting businesses (within the vmtycoonId range from->to). // NOTE: This is use when we need to update businesses production function rebalanceBusinessesClaimableToUserWallet(uint256 from, uint256 to) external onlyOwner { VM_Tycoon instance = VM_Tycoon(VMTYCOON_CONTRACT); for (uint256 i = from; i <= to; i++) { address currentOwner = instance.ownerOf(i); StakedVMTycoonObj memory vmtycoon = stakedVMTycoon[i]; // we only care about vmtycoon that have been staked (i.e. level > 0) ... if (vmtycoon.level > 0) { _mint(currentOwner, claimableView(i)); vmtycoon.sinceTs = uint32(block.timestamp); stakedVMTycoon[i] = vmtycoon; } } } }
[{"inputs":[{"internalType":"address","name":"_vmtycoonContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"businessesAmt","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"businessesAmt","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"BASE_HOLDER_BUSINESSES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BUSINESSES_PER_DAY_PER_LEVEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COOLDOWN_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COOLDOWN_BASE_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COOLDOWN_CD_IN_SECS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COOLDOWN_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEVELING_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEVELING_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VMTYCOON_CONTRACT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAdd","type":"address"}],"name":"addAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"amountOfBusinesses","type":"uint256"}],"name":"airdropToExistingHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"businessesAmount","type":"uint256"}],"name":"burnBusinesses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"checkSkipCoolingOffAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimBusinesses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimableView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"cooldownRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"level","type":"uint256"}],"name":"dollaLevelingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"dollaAmount","type":"uint256"}],"name":"equipVMTycoon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tid","type":"uint256"}],"name":"levelUpVMTycoon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintBusinesses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myClaimableView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"myStakedVMTycoon","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","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":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"rebalanceBusinessesClaimableToUserWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toRemove","type":"address"}],"name":"removeAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"businessesAmount","type":"uint256"}],"name":"skipCoolingOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tids","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakedVMTycoon","outputs":[{"internalType":"uint24","name":"level","type":"uint24"},{"internalType":"uint32","name":"sinceTs","type":"uint32"},{"internalType":"uint32","name":"lastSkippedTs","type":"uint32"},{"internalType":"uint48","name":"dollaAmount","type":"uint48"},{"internalType":"uint32","name":"cooldownTs","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLevel","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedVMTycoon","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tids","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"},{"internalType":"uint256","name":"d","type":"uint256"},{"internalType":"uint256","name":"e","type":"uint256"}],"name":"updateSkipCooldownValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tids","type":"uint256[]"}],"name":"withdrawAllVMTycoonAndClaim","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600b60808190526a24425553494e455353455360a81b60a09081526200002e9160079190620002c6565b5060408051808201909152600a80825269425553494e455353455360b01b60209092019182526200006291600891620002c6565b50670a688906bd8b0000600a556703782dace9d90000600b5568056bc75e2d63100000600c5568056bc75e2d63100000600d5562015180600e556019600f556002601055610e10601155348015620000b957600080fd5b506040516200373738038062003737833981016040819052620000dc916200036c565b60078054620000eb906200039e565b80601f016020809104026020016040519081016040528092919081815260200182805462000119906200039e565b80156200016a5780601f106200013e576101008083540402835291602001916200016a565b820191906000526020600020905b8154815290600101906020018083116200014c57829003601f168201915b5050505050600880546200017e906200039e565b80601f0160208091040260200160405190810160405280929190818152602001828054620001ac906200039e565b8015620001fd5780601f10620001d157610100808354040283529160200191620001fd565b820191906000526020600020905b815481529060010190602001808311620001df57829003601f168201915b5050845162000217935060039250602086019150620002c6565b5080516200022d906004906020840190620002c6565b5050506200024a620002446200027060201b60201c565b62000274565b600980546001600160a01b0319166001600160a01b0392909216919091179055620003db565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002d4906200039e565b90600052602060002090601f016020900481019282620002f8576000855562000343565b82601f106200031357805160ff191683800117855562000343565b8280016001018555821562000343579182015b828111156200034357825182559160200191906001019062000326565b506200035192915062000355565b5090565b5b8082111562000351576000815560010162000356565b6000602082840312156200037f57600080fd5b81516001600160a01b03811681146200039757600080fd5b9392505050565b600181811c90821680620003b357607f821691505b60208210811415620003d557634e487b7160e01b600052602260045260246000fd5b50919050565b61334c80620003eb6000396000f3fe608060405234801561001057600080fd5b50600436106102945760003560e01c8063802376b611610167578063b00cbdec116100ce578063dc4578aa11610087578063dc4578aa1461059d578063dd62ed3e146105b0578063e449f341146105e9578063e8b99e22146105fc578063eddbc3901461064e578063f2fde38b1461067857600080fd5b8063b00cbdec14610539578063b918161114610542578063bab3384d14610565578063c00b346e1461056e578063cf1c316a14610581578063dbac7bae1461059457600080fd5b806395d89b411161012057806395d89b41146104dc5780639af2726a146104e4578063a275cba1146104ed578063a457c2d714610500578063a9059cbb14610513578063aa668b5a1461052657600080fd5b8063802376b6146104605780638340dac4146104735780638ae9ff5c146104885780638da5cb5b1461049b5780638e2895e5146104ac578063902367aa146104d357600080fd5b8063313ce5671161020b5780635ab30dee116101c45780635ab30dee146103cb5780635c9489b9146103de57806370a08231146103f1578063715018a61461041a5780637e34889a146104225780637eab84541461044d57600080fd5b8063313ce56714610368578063395093511461037757806340f964dd1461038a5780634791284b1461039d578063485d7d94146103a5578063579dc17e146103b857600080fd5b8063095ea7b31161025d578063095ea7b3146103055780630fbf0a9314610328578063116be18e1461033b57806318160ddd146103445780631f6d15bd1461034c57806323b872dd1461035557600080fd5b8062f75f7c1461029957806303bb5f02146102bf578063060df8c4146102c857806306125cb9146102dd57806306fdde03146102f0575b600080fd5b6102ac6102a7366004612d89565b61068b565b6040519081526020015b60405180910390f35b6102ac600e5481565b6102db6102d6366004612e61565b6106ac565b005b6102db6102eb366004612e3f565b6107b5565b6102f8610a4a565b6040516102b69190612f0c565b610318610313366004612ce8565b610adc565b60405190151581526020016102b6565b6102db610336366004612d14565b610af2565b6102ac60105481565b6002546102ac565b6102ac600d5481565b610318610363366004612ca7565b610b35565b604051601281526020016102b6565b610318610385366004612ce8565b610bdf565b6102ac610398366004612d89565b610c1b565b6102ac610d17565b6102db6103b3366004612c2d565b610f23565b6102ac6103c6366004612d89565b610f97565b6102db6103d9366004612e8d565b610fbf565b6102db6103ec366004612ce8565b611000565b6102ac6103ff366004612c2d565b6001600160a01b031660009081526020819052604090205490565b6102db6110a4565b600954610435906001600160a01b031681565b6040516001600160a01b0390911681526020016102b6565b6102db61045b366004612e3f565b6110da565b6102db61046e366004612d14565b6112e6565b61047b6112fe565b6040516102b69190612ec8565b6102db610496366004612e3f565b611520565b6005546001600160a01b0316610435565b6012546104bd9064ffffffffff1681565b60405164ffffffffff90911681526020016102b6565b6102ac60115481565b6102f861173d565b6102ac600b5481565b6102db6104fb366004612d89565b61174c565b61031861050e366004612ce8565b611a35565b610318610521366004612ce8565b611ace565b6102db610534366004612d14565b611adb565b6102ac600c5481565b610318610550366004612c2d565b60066020526000908152604090205460ff1681565b6102ac600f5481565b6102ac61057c366004612d89565b611ae5565b6102db61058f366004612c2d565b611af6565b6102ac600a5481565b6102db6105ab366004612ce8565b611b57565b6102ac6105be366004612c6e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102db6105f7366004612d14565b6112f0565b61060f61060a366004612d89565b611bb4565b6040805162ffffff909616865263ffffffff94851660208701529284169285019290925265ffffffffffff16606084015216608082015260a0016102b6565b6012546106659065010000000000900461ffff1681565b60405161ffff90911681526020016102b6565b6102db610686366004612c2d565b611c04565b600d5460009061069c6064846130e3565b6106a691906131e2565b92915050565b6005546001600160a01b031633146106df5760405162461bcd60e51b81526004016106d690612f61565b60405180910390fd5b6009546001600160a01b0316835b8381116107ae576040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e9060240160206040518083038186803b15801561073757600080fd5b505afa15801561074b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076f9190612c51565b90506001600160a01b0381161561079b5761079b8161079686670de0b6b3a76400006131e2565b611c9f565b50806107a68161328e565b9150506106ed565b5050505050565b6000601383620186a181106107cc576107cc6132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b909104909116608083015290915061084a5760405162461bcd60e51b81526004016106d690612fb9565b336000908152602081905260409020544290838110156108ac5760405162461bcd60e51b815260206004820152601f60248201527f4e4f5420454e4f55474820627573696e657373657320494e2057414c4c45540060448201526064016106d6565b82516108bc9062ffffff1661068b565b84101561090b5760405162461bcd60e51b815260206004820152601d60248201527f4e4f5420454e4f55474820627573696e657373657320544f20534b495000000060448201526064016106d6565b8163ffffffff16600e54846040015163ffffffff1661092a9190613049565b11156109785760405162461bcd60e51b815260206004820152601860248201527f424c4f434b4544204259203234485220434f4f4c444f574e000000000000000060448201526064016106d6565b6109823385611d7e565b63ffffffff821660808401819052604084015282601386620186a181106109ab576109ab6132d5565b82519101805460208401516040850151606086015160809096015163ffffffff908116600160881b0263ffffffff60881b1965ffffffffffff909816600160581b0265ffffffffffff60581b19938316600160381b0293909316600160381b600160881b03199290941663010000000266ffffffffffffff1990951662ffffff9097169690961793909317929092161717929092161790555050505050565b606060038054610a5990613259565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8590613259565b8015610ad25780601f10610aa757610100808354040283529160200191610ad2565b820191906000526020600020905b815481529060010190602001808311610ab557829003601f168201915b5050505050905090565b6000610ae9338484611e2d565b50600192915050565b60005b81811015610b3057610b1e838383818110610b1257610b126132d5565b90506020020135611f51565b80610b288161328e565b915050610af5565b505050565b6000610b4284848461230b565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610bc75760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016106d6565b610bd48533858403611e2d565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610ae9918590610c16908690613049565b611e2d565b600080601383620186a18110610c3357610c336132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b909104909116608083015290915015610d08576000600a5460648360000151610cb091906130c1565b62ffffff16600b54610cc291906131e2565b610ccc9190613049565b90506000826020015163ffffffff1642610ce69190613224565b9050610cf562015180836130e3565b610cff90826131e2565b95945050505050565b50600092915050565b50919050565b6009546040516370a0823160e01b81523360048201526000916001600160a01b031690829082906370a082319060240160206040518083038186803b158015610d5f57600080fd5b505afa158015610d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d979190612da2565b905060008111610dd75760405162461bcd60e51b815260206004820152600b60248201526a2727902b26aa2ca1a7a7a760a91b60448201526064016106d6565b6000805b82811015610f1b57604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03861690632f745c599060440160206040518083038186803b158015610e2c57600080fd5b505afa158015610e40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e649190612da2565b90506000601382620186a18110610e7d57610e7d6132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b909104909116608083015290915015610f06576000610eef83610c1b565b90508015610f0457610f018186613049565b94505b505b50508080610f139061328e565b915050610ddb565b509392505050565b6005546001600160a01b03163314610f4d5760405162461bcd60e51b81526004016106d690612f61565b6001600160a01b038116610f6057600080fd5b6001600160a01b038116331415610f7657600080fd5b6001600160a01b03166000908152600660205260409020805460ff19169055565b601054600090610fa86064846130e3565b610fb2919061313a565b600f546106a691906131e2565b6005546001600160a01b03163314610fe95760405162461bcd60e51b81526004016106d690612f61565b600c94909455600d92909255600e55600a55600b55565b3360009081526006602052604090205460ff168061103757503361102c6005546001600160a01b031690565b6001600160a01b0316145b6110535760405162461bcd60e51b81526004016106d690612fdd565b61105d8282611c9f565b604080516001600160a01b0384168152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe91015b60405180910390a15050565b6005546001600160a01b031633146110ce5760405162461bcd60e51b81526004016106d690612f61565b6110d860006124d9565b565b3360009081526006602052604090205460ff16806111115750336111066005546001600160a01b031690565b6001600160a01b0316145b61112d5760405162461bcd60e51b81526004016106d690612fdd565b6000601383620186a18110611144576111446132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b90910490911660808301529091506111c25760405162461bcd60e51b81526004016106d690612fb9565b600082116112055760405162461bcd60e51b815260206004820152601060248201526f04e4f5448494e4720544f2045515549560841b60448201526064016106d6565b606081015161121c670de0b6b3a7640000846130e3565b61122691906130a0565b65ffffffffffff16606082015280601384620186a18110611249576112496132d5565b82519101805460208401516040850151606086015160809096015163ffffffff908116600160881b0263ffffffff60881b1965ffffffffffff909816600160581b0265ffffffffffff60581b19938316600160381b0293909316600160381b600160881b03199290941663010000000266ffffffffffffff1990951662ffffff909716969096179390931792909216171792909216179055505050565b6112f0828261252b565b6112fa8282612805565b5050565b6009546040516370a0823160e01b81523360048201526060916001600160a01b03169060009082906370a082319060240160206040518083038186803b15801561134757600080fd5b505afa15801561135b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137f9190612da2565b905060008167ffffffffffffffff81111561139c5761139c6132eb565b6040519080825280602002602001820160405280156113c5578160200160208202803683370190505b5090506000805b8381101561151657604051632f745c5960e01b8152336004820152602481018290526000906001600160a01b03871690632f745c599060440160206040518083038186803b15801561141d57600080fd5b505afa158015611431573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114559190612da2565b90506000601382620186a1811061146e5761146e6132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b90910490911660808301529091501561150157818585815181106114e8576114e86132d5565b6020908102919091010152836114fd8161328e565b9450505b5050808061150e9061328e565b9150506113cc565b5090949350505050565b6005546001600160a01b0316331461154a5760405162461bcd60e51b81526004016106d690612f61565b6009546001600160a01b0316825b828111611737576040516331a9108f60e11b8152600481018290526000906001600160a01b03841690636352211e9060240160206040518083038186803b1580156115a257600080fd5b505afa1580156115b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115da9190612c51565b90506000601383620186a181106115f3576115f36132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b909104909116608083015290915015611722576116678261079685610c1b565b63ffffffff4216602082015280601384620186a18110611689576116896132d5565b82519101805460208401516040850151606086015160809096015163ffffffff908116600160881b0263ffffffff60881b1965ffffffffffff909816600160581b0265ffffffffffff60581b19938316600160381b0293909316600160381b600160881b03199290941663010000000266ffffffffffffff1990951662ffffff9097169690961793909317929092161717929092161790555b5050808061172f9061328e565b915050611558565b50505050565b606060048054610a5990613259565b6000601382620186a18110611763576117636132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b90910490911660808301529091506117e15760405162461bcd60e51b81526004016106d690612fb9565b60095481516001600160a01b03909116906118009062ffffff16610f97565b826060015165ffffffffffff16101561184c5760405162461bcd60e51b815260206004820152600e60248201526d1353d491481193d3d1081491545160921b60448201526064016106d6565b816080015163ffffffff164210156118995760405162461bcd60e51b815260206004820152601060248201526f10d3d3d31113d5d3881393d50813515560821b60448201526064016106d6565b81516118a690606461302b565b62ffffff16808352600060608401526118be90611ae5565b6118c89042613049565b63ffffffff16608083015281601384620186a181106118e9576118e96132d5565b82519101805460208401516040850151606086015160809096015163ffffffff908116600160881b0263ffffffff60881b1965ffffffffffff909816600160581b0265ffffffffffff60581b19938316600160381b0293909316600160381b600160881b03199290941663010000000266ffffffffffffff1990951662ffffff909716969096179390931792909216171792909216179055601280546064919060009061199e90849064ffffffffff16613080565b92506101000a81548164ffffffffff021916908364ffffffffff160217905550806001600160a01b03166370a93b368484600001516040518363ffffffff1660e01b81526004016119fe92919091825262ffffff16602082015260400190565b600060405180830381600087803b158015611a1857600080fd5b505af1158015611a2c573d6000803e3d6000fd5b50505050505050565b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611ab75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016106d6565b611ac43385858403611e2d565b5060019392505050565b6000610ae933848461230b565b6112fa828261252b565b60115460009061069c6064846130e3565b6005546001600160a01b03163314611b205760405162461bcd60e51b81526004016106d690612f61565b6001600160a01b038116611b3357600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b3360009081526006602052604090205460ff1680611b8e575033611b836005546001600160a01b031690565b6001600160a01b0316145b611baa5760405162461bcd60e51b81526004016106d690612fdd565b6112fa8282611d7e565b601381620186a18110611bc657600080fd5b015462ffffff8116915063ffffffff63010000008204811691600160381b810482169165ffffffffffff600160581b83041691600160881b90041685565b6005546001600160a01b03163314611c2e5760405162461bcd60e51b81526004016106d690612f61565b6001600160a01b038116611c935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106d6565b611c9c816124d9565b50565b6001600160a01b038216611cf55760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106d6565b8060026000828254611d079190613049565b90915550506001600160a01b03821660009081526020819052604081208054839290611d34908490613049565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80611d9e836001600160a01b031660009081526020819052604090205490565b1015611de45760405162461bcd60e51b81526020600482015260156024820152744e4f5420454e4f55474820425553494e455353455360581b60448201526064016106d6565b611dee8282612843565b604080516001600160a01b0384168152602081018390527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79101611098565b6001600160a01b038316611e8f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106d6565b6001600160a01b038216611ef05760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106d6565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6009546040516331a9108f60e11b8152600481018390526001600160a01b039091169033908290636352211e9060240160206040518083038186803b158015611f9957600080fd5b505afa158015611fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd19190612c51565b6001600160a01b031614611ff75760405162461bcd60e51b81526004016106d690612f96565b60405163494a308f60e11b8152600481018390526000906001600160a01b03831690639294611e906024016101006040518083038186803b15801561203b57600080fd5b505afa15801561204f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120739190612dbb565b9750505050505050506000601384620186a18110612093576120936132d5565b6040805160a081018252929091015462ffffff8116835263ffffffff6301000000820481166020850152600160381b820481169284019290925265ffffffffffff600160581b8204166060840152600160881b9004166080820152905042601385620186a18110612106576121066132d5565b015462ffffff166107ae576040518060a001604052808462ffffff1681526020018263ffffffff1681526020016000846040015163ffffffff161161215d57600e546121589063ffffffff8516613224565b612163565b83604001515b63ffffffff1681526000602082015260400161217e85611ae5565b6121889084613061565b63ffffffff169052601386620186a181106121a5576121a56132d5565b82519101805460208401516040850151606086015160809096015163ffffffff908116600160881b0263ffffffff60881b1965ffffffffffff909816600160581b0265ffffffffffff60581b19938316600160381b0293909316600160381b600160881b03199290941663010000000266ffffffffffffff1990951662ffffff909716969096179390931792909216171792909216179055601280546001919060059061226190849061ffff6501000000000090910416613005565b92506101000a81548161ffff021916908361ffff1602179055508262ffffff16601260008282829054906101000a900464ffffffffff166122a29190613080565b92506101000a81548164ffffffffff021916908364ffffffffff1602179055507f925435fa7e37e5d9555bb18ce0d62bb9627d0846942e58e5291e9a2dded462ed85426040516122fc929190918252602082015260400190565b60405180910390a15050505050565b6001600160a01b03831661236f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016106d6565b6001600160a01b0382166123d15760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016106d6565b6001600160a01b038316600090815260208190526040902054818110156124495760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106d6565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290612480908490613049565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516124cc91815260200190565b60405180910390a3611737565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6009546001600160a01b03166000805b838110156127b557336001600160a01b038416636352211e878785818110612565576125656132d5565b905060200201356040518263ffffffff1660e01b815260040161258a91815260200190565b60206040518083038186803b1580156125a257600080fd5b505afa1580156125b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125da9190612c51565b6001600160a01b0316146126005760405162461bcd60e51b81526004016106d690612f96565b60006013868684818110612616576126166132d5565b90506020020135620186a1811061262f5761262f6132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b9091049091166080830152909150156127a25760006126b98787858181106126ad576126ad6132d5565b90506020020135610c1b565b905080156127a0576126cb8185613049565b63ffffffff4216602084015293508160138888868181106126ee576126ee6132d5565b90506020020135620186a18110612707576127076132d5565b82519101805460208401516040850151606086015160809096015163ffffffff908116600160881b0263ffffffff60881b1965ffffffffffff909816600160581b0265ffffffffffff60581b19938316600160381b0293909316600160381b600160881b03199290941663010000000266ffffffffffffff1990951662ffffff9097169690961793909317929092161717929092161790555b505b50806127ad8161328e565b91505061253b565b508015611737576127c63382611c9f565b60408051338152602081018390527f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe910160405180910390a150505050565b60005b81811015610b3057612831838383818110612825576128256132d5565b90506020020135612991565b8061283b8161328e565b915050612808565b6001600160a01b0382166128a35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106d6565b6001600160a01b038216600090815260208190526040902054818110156129175760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016106d6565b6001600160a01b0383166000908152602081905260408120838303905560028054849290612946908490613224565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6009546040516331a9108f60e11b8152600481018390526001600160a01b039091169033908290636352211e9060240160206040518083038186803b1580156129d957600080fd5b505afa1580156129ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a119190612c51565b6001600160a01b031614612a375760405162461bcd60e51b81526004016106d690612f96565b6000601383620186a18110612a4e57612a4e6132d5565b6040805160a081018252929091015462ffffff811680845263ffffffff6301000000830481166020860152600160381b830481169385019390935265ffffffffffff600160581b8304166060850152600160881b909104909116608083015290915015610b305780516012805462ffffff90921691600090612ad890849064ffffffffff1661323b565b92506101000a81548164ffffffffff021916908364ffffffffff1602179055506001601260058282829054906101000a900461ffff16612b189190613201565b825461ffff9182166101009390930a9283029190920219909116179055506000815280601384620186a18110612b5057612b506132d5565b825191018054602080850151604080870151606088015160809098015162ffffff90971666ffffffffffffff1990951694909417630100000063ffffffff9384160217600160381b600160881b031916600160381b9483169490940265ffffffffffff60581b191693909317600160581b65ffffffffffff909716969096029590951763ffffffff60881b1916600160881b9590941694909402929092179055805185815242928101929092527f69f6d6e6926b6914c628cca5ab19879a4099facaba2b44626e07d8e38ebd189b910160405180910390a1505050565b600060208284031215612c3f57600080fd5b8135612c4a81613301565b9392505050565b600060208284031215612c6357600080fd5b8151612c4a81613301565b60008060408385031215612c8157600080fd5b8235612c8c81613301565b91506020830135612c9c81613301565b809150509250929050565b600080600060608486031215612cbc57600080fd5b8335612cc781613301565b92506020840135612cd781613301565b929592945050506040919091013590565b60008060408385031215612cfb57600080fd5b8235612d0681613301565b946020939093013593505050565b60008060208385031215612d2757600080fd5b823567ffffffffffffffff80821115612d3f57600080fd5b818501915085601f830112612d5357600080fd5b813581811115612d6257600080fd5b8660208260051b8501011115612d7757600080fd5b60209290920196919550909350505050565b600060208284031215612d9b57600080fd5b5035919050565b600060208284031215612db457600080fd5b5051919050565b600080600080600080600080610100898b031215612dd857600080fd5b885197506020890151612dea81613301565b60408a0151909750612dfb81613301565b80965050606089015194506080890151935060a0890151925060c08901518015158114612e2757600080fd5b8092505060e089015190509295985092959890939650565b60008060408385031215612e5257600080fd5b50508035926020909101359150565b600080600060608486031215612e7657600080fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215612ea557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b6020808252825182820181905260009190848201906040850190845b81811015612f0057835183529284019291840191600101612ee4565b50909695505050505050565b600060208083528351808285015260005b81811015612f3957858101830151858201604001528201612f1d565b81811115612f4b576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600990820152682727aa1027aba722a960b91b604082015260600190565b6020808252600a90820152691393d50814d51052d15160b21b604082015260600190565b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b600061ffff808316818516808303821115613022576130226132a9565b01949350505050565b600062ffffff808316818516808303821115613022576130226132a9565b6000821982111561305c5761305c6132a9565b500190565b600063ffffffff808316818516808303821115613022576130226132a9565b600064ffffffffff808316818516808303821115613022576130226132a9565b600065ffffffffffff808316818516808303821115613022576130226132a9565b600062ffffff808416806130d7576130d76132bf565b92169190910492915050565b6000826130f2576130f26132bf565b500490565b600181815b80851115613132578160001904821115613118576131186132a9565b8085161561312557918102915b93841c93908002906130fc565b509250929050565b6000612c4a8383600082613150575060016106a6565b8161315d575060006106a6565b8160018114613173576002811461317d57613199565b60019150506106a6565b60ff84111561318e5761318e6132a9565b50506001821b6106a6565b5060208310610133831016604e8410600b84101617156131bc575081810a6106a6565b6131c683836130f7565b80600019048211156131da576131da6132a9565b029392505050565b60008160001904831182151516156131fc576131fc6132a9565b500290565b600061ffff8381169083168181101561321c5761321c6132a9565b039392505050565b600082821015613236576132366132a9565b500390565b600064ffffffffff8381169083168181101561321c5761321c6132a9565b600181811c9082168061326d57607f821691505b60208210811415610d1157634e487b7160e01b600052602260045260246000fd5b60006000198214156132a2576132a26132a9565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611c9c57600080fdfea26469706673582212205385f7219d66a52250bb128c8c1c85e3841a97ec6eed79960cb1dc186048a6b164736f6c634300080700330000000000000000000000005496b2e166ce7ecba67c526f2babccfcc0d3880d
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005496b2e166ce7ecba67c526f2babccfcc0d3880d
-----Decoded View---------------
Arg [0] : _vmtycoonContract (address): 0x5496b2e166ce7ecba67c526f2babccfcc0d3880d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005496b2e166ce7ecba67c526f2babccfcc0d3880d
Deployed ByteCode Sourcemap
149301:15737:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;161925:217;;;;;;:::i;:::-;;:::i;:::-;;;15978:25:1;;;15966:2;15951:18;161925:217:0;;;;;;;;150219:42;;;;;;163683:499;;;;;;:::i;:::-;;:::i;:::-;;160549:1300;;;;;;:::i;:::-;;:::i;118031:100::-;;;:::i;:::-;;;;;;;:::i;120198:169::-;;;;;;:::i;:::-;;:::i;:::-;;;5874:14:1;;5867:22;5849:41;;5837:2;5822:18;120198:169:0;5709:187:1;153692:151:0;;;;;;:::i;:::-;;:::i;150338:32::-;;;;;;119151:108;119239:12;;119151:108;;150061:59;;;;;;120849:492;;;;;;:::i;:::-;;:::i;118993:93::-;;;119076:2;16875:36:1;;16863:2;16848:18;118993:93:0;16733:184:1;121750:215:0;;;;;;:::i;:::-;;:::i;153948:483::-;;;;;;:::i;:::-;;:::i;155199:765::-;;;:::i;112064:196::-;;;;;;:::i;:::-;;:::i;151727:237::-;;;;;;:::i;:::-;;:::i;162934:347::-;;;;;;:::i;:::-;;:::i;163410:158::-;;;;;;:::i;:::-;;:::i;119322:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;119423:18:0;119396:7;119423:18;;;;;;;;;;;;119322:127;110807:103;;;:::i;149485:32::-;;;;;-1:-1:-1;;;;;149485:32:0;;;;;;-1:-1:-1;;;;;4749:32:1;;;4731:51;;4719:2;4704:18;149485:32:0;4585:203:1;162203:476:0;;;;;;:::i;:::-;;:::i;158553:145::-;;;;;;:::i;:::-;;:::i;154439:646::-;;;:::i;:::-;;;;;;;:::i;164360:675::-;;;;;;:::i;:::-;;:::i;110156:87::-;110229:6;;-1:-1:-1;;;;;110229:6:0;110156:87;;151130:24;;;;;;;;;;;;16708:12:1;16696:25;;;16678:44;;16666:2;16651:18;151130:24:0;16534:194:1;150377:35:0;;;;;;118250:104;;;:::i;149780:64::-;;;;;;158777:1006;;;;;;:::i;:::-;;:::i;122468:413::-;;;;;;:::i;:::-;;:::i;119662:175::-;;;;;;:::i;:::-;;:::i;157258:108::-;;;;;;:::i;:::-;;:::i;149911:52::-;;;;;;111725:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;150298:33;;;;;;152050:168;;;;;;:::i;:::-;;:::i;111916:140::-;;;;;;:::i;:::-;;:::i;149602:58::-;;;;;;160289:150;;;;;;:::i;:::-;;:::i;119900:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;120016:18:0;;;119989:7;120016:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;119900:151;158373:92;;;;;;:::i;:::-;;:::i;151203:47::-;;;;;;:::i;:::-;;:::i;:::-;;;;15561:8:1;15549:21;;;15531:40;;15590:10;15636:15;;;15631:2;15616:18;;15609:43;15688:15;;;15668:18;;;15661:43;;;;15752:14;15740:27;15735:2;15720:18;;15713:55;15805:15;15799:3;15784:19;;15777:44;15518:3;15503:19;151203:47:0;15282:545:1;151161:33:0;;;;;;;;;;;;;;;15263:6:1;15251:19;;;15233:38;;15221:2;15206:18;151161:33:0;15089:188:1;111065:201:0;;;;;;:::i;:::-;;:::i;161925:217::-;162113:20;;161993:7;;162098:11;162106:3;162098:5;:11;:::i;:::-;162097:36;;;;:::i;:::-;162089:45;161925:217;-1:-1:-1;;161925:217:0:o;163683:499::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;;;;;;;;;163913:17:::1;::::0;-1:-1:-1;;;;;163913:17:0::1;163959:4:::0;163942:233:::1;163970:2;163965:1;:7;163942:233;;164017:19;::::0;-1:-1:-1;;;164017:19:0;;::::1;::::0;::::1;15978:25:1::0;;;163994:20:0::1;::::0;-1:-1:-1;;;;;164017:16:0;::::1;::::0;::::1;::::0;15951:18:1;;164017:19:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;163994:42:::0;-1:-1:-1;;;;;;164055:26:0;::::1;::::0;164051:113:::1;;164102:46;164108:12:::0;164122:25:::1;:18:::0;164143:4:::1;164122:25;:::i;:::-;164102:5;:46::i;:::-;-1:-1:-1::0;163974:3:0;::::1;::::0;::::1;:::i;:::-;;;;163942:233;;;;163823:359;163683:499:::0;;;:::o;160549:1300::-;160636:33;160672:14;160687:7;160672:23;;;;;;;:::i;:::-;160636:59;;;;;;;;160672:23;;;;160636:59;;;;;;;;;;;;;;;;;-1:-1:-1;;;160636:59:0;;;;;;;;;;;;-1:-1:-1;;;160636:59:0;;;;;;;-1:-1:-1;;;160636:59:0;;;;;;;;;;;;-1:-1:-1;160706:42:0;;;;-1:-1:-1;;;160706:42:0;;;;;;;:::i;:::-;161094:10;160761:9;119423:18;;;;;;;;;;;160780:15;;161124:33;;;;161116:77;;;;-1:-1:-1;;;161116:77:0;;10887:2:1;161116:77:0;;;10869:21:1;10926:2;10906:18;;;10899:30;10965:33;10945:18;;;10938:61;11016:18;;161116:77:0;10685:355:1;161116:77:0;161332:14;;161309:38;;;;:22;:38::i;:::-;161289:16;:58;;161281:100;;;;-1:-1:-1;;;161281:100:0;;10168:2:1;161281:100:0;;;10150:21:1;10207:2;10187:18;;;10180:30;10246:31;10226:18;;;10219:59;10295:18;;161281:100:0;9966:353:1;161281:100:0;161515:2;161465:52;;161491:19;;161466:8;:22;;;:44;;;;;;:::i;:::-;161465:52;;161457:89;;;;-1:-1:-1;;;161457:89:0;;13486:2:1;161457:89:0;;;13468:21:1;13525:2;13505:18;;;13498:30;13564:26;13544:18;;;13537:54;13608:18;;161457:89:0;13284:348:1;161457:89:0;161587:45;161603:10;161615:16;161587:15;:45::i;:::-;161674:24;;;:19;;;:24;;;161769:22;;;:27;161674:8;161807:14;161822:7;161807:23;;;;;;;:::i;:::-;:34;;:23;;:34;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;161807:34:0;-1:-1:-1;;;;161807:34:0;;;;-1:-1:-1;;;161807:34:0;-1:-1:-1;;;;161807:34:0;;;-1:-1:-1;;;161807:34:0;;;;;-1:-1:-1;;;;;;;;161807:34:0;;;;;;-1:-1:-1;;161807:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;160549:1300:0:o;118031:100::-;118085:13;118118:5;118111:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118031:100;:::o;120198:169::-;120281:4;120298:39;108960:10;120321:7;120330:6;120298:8;:39::i;:::-;-1:-1:-1;120355:4:0;120198:169;;;;:::o;153692:151::-;153757:9;153752:84;153772:15;;;153752:84;;;153809:15;153816:4;;153821:1;153816:7;;;;;;;:::i;:::-;;;;;;;153809:6;:15::i;:::-;153789:3;;;;:::i;:::-;;;;153752:84;;;;153692:151;;:::o;120849:492::-;120989:4;121006:36;121016:6;121024:9;121035:6;121006:9;:36::i;:::-;-1:-1:-1;;;;;121082:19:0;;121055:24;121082:19;;;:11;:19;;;;;;;;108960:10;121082:33;;;;;;;;121134:26;;;;121126:79;;;;-1:-1:-1;;;121126:79:0;;9759:2:1;121126:79:0;;;9741:21:1;9798:2;9778:18;;;9771:30;9837:34;9817:18;;;9810:62;-1:-1:-1;;;9888:18:1;;;9881:38;9936:19;;121126:79:0;9557:404:1;121126:79:0;121241:57;121250:6;108960:10;121291:6;121272:16;:25;121241:8;:57::i;:::-;-1:-1:-1;121329:4:0;;120849:492;-1:-1:-1;;;;120849:492:0:o;121750:215::-;108960:10;121838:4;121887:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;121887:34:0;;;;;;;;;;121838:4;;121855:80;;121878:7;;121887:47;;121924:10;;121887:47;:::i;:::-;121855:8;:80::i;153948:483::-;154009:7;154029:26;154058:14;154073:7;154058:23;;;;;;;:::i;:::-;154029:52;;;;;;;;154058:23;;;;154029:52;;;;;;;;;;;;;;;;;-1:-1:-1;;;154029:52:0;;;;;;;;;;;;-1:-1:-1;;;154029:52:0;;;;;;;-1:-1:-1;;;154029:52:0;;;;;;;;;;;;-1:-1:-1;154096:11:0;154092:332;;154124:24;154220:22;;154195:3;154185:1;:7;;;:13;;;;:::i;:::-;154153:46;;:28;;:46;;;;:::i;:::-;154152:90;;;;:::i;:::-;154124:119;;154258:20;154299:1;:9;;;154281:27;;:15;:27;;;;:::i;:::-;154258:50;-1:-1:-1;154346:24:0;154365:5;154346:16;:24;:::i;:::-;154330:41;;:12;:41;:::i;:::-;154323:48;153948:483;-1:-1:-1;;;;;153948:483:0:o;154092:332::-;-1:-1:-1;154411:1:0;;153948:483;-1:-1:-1;;153948:483:0:o;154092:332::-;154018:413;153948:483;;;:::o;155199:765::-;155291:17;;155334:23;;-1:-1:-1;;;155334:23:0;;155346:10;155334:23;;;4731:51:1;155247:7:0;;-1:-1:-1;;;;;155291:17:0;;155247:7;;155291:17;;155334:11;;4704:18:1;;155334:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;155320:37;;155382:1;155376:3;:7;155368:31;;;;-1:-1:-1;;;155368:31:0;;9074:2:1;155368:31:0;;;9056:21:1;9113:2;9093:18;;;9086:30;-1:-1:-1;;;9132:18:1;;;9125:41;9183:18;;155368:31:0;8872:335:1;155368:31:0;155410:22;155452:9;155447:478;155471:3;155467:1;:7;155447:478;;;155514:36;;-1:-1:-1;;;155514:36:0;;155536:10;155514:36;;;4967:51:1;5034:18;;;5027:34;;;155496:15:0;;-1:-1:-1;;;;;155514:21:0;;;;;4940:18:1;;155514:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;155496:54;;155565:33;155601:14;155616:7;155601:23;;;;;;;:::i;:::-;155565:59;;;;;;;;155601:23;;;;155565:59;;;;;;;;;;;;;;;;;-1:-1:-1;;;155565:59:0;;;;;;;;;;;;-1:-1:-1;;;155565:59:0;;;;;;;-1:-1:-1;;;155565:59:0;;;;;;;;;;;;-1:-1:-1;155694:18:0;155690:224;;155733:17;155753:22;155767:7;155753:13;:22::i;:::-;155733:42;-1:-1:-1;155798:13:0;;155794:105;;155853:26;155870:9;155853:14;:26;:::i;:::-;155836:43;;155794:105;155714:200;155690:224;155481:444;;155476:3;;;;;:::i;:::-;;;;155447:478;;;-1:-1:-1;155942:14:0;155199:765;-1:-1:-1;;;155199:765:0:o;112064:196::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;112145:23:0;::::1;112137:32;;;::::0;::::1;;-1:-1:-1::0;;;;;112188:23:0;::::1;112201:10;112188:23;;112180:32;;;::::0;::::1;;-1:-1:-1::0;;;;;112223:21:0::1;112247:5;112223:21:::0;;;:10:::1;:21;::::0;;;;:29;;-1:-1:-1;;112223:29:0::1;::::0;;112064:196::o;151727:237::-;151942:13;;151790:7;;151928:11;151936:3;151928:5;:11;:::i;:::-;151927:28;;;;:::i;:::-;151910:13;;:46;;;;:::i;162934:347::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;163107:13:::1;:17:::0;;;;163135:20:::1;:24:::0;;;;163170:19:::1;:23:::0;163204:22:::1;:26:::0;163241:28:::1;:32:::0;162934:347::o;163410:158::-;111832:10;111821:22;;;;:10;:22;;;;;;;;;:48;;-1:-1:-1;111859:10:0;111848:7;110229:6;;-1:-1:-1;;;;;110229:6:0;;110156:87;111848:7;-1:-1:-1;;;;;111848:21:0;;111821:48;111813:75;;;;-1:-1:-1;;;111813:75:0;;;;;;;:::i;:::-;163501:21:::1;163507:6;163515;163501:5;:21::i;:::-;163538:22;::::0;;-1:-1:-1;;;;;4985:32:1;;4967:51;;5049:2;5034:18;;5027:34;;;163538:22:0::1;::::0;4940:18:1;163538:22:0::1;;;;;;;;163410:158:::0;;:::o;110807:103::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;110872:30:::1;110899:1;110872:18;:30::i;:::-;110807:103::o:0;162203:476::-;111832:10;111821:22;;;;:10;:22;;;;;;;;;:48;;-1:-1:-1;111859:10:0;111848:7;110229:6;;-1:-1:-1;;;;;110229:6:0;;110156:87;111848:7;-1:-1:-1;;;;;111848:21:0;;111821:48;111813:75;;;;-1:-1:-1;;;111813:75:0;;;;;;;:::i;:::-;162322:33:::1;162358:14;162373:7;162358:23;;;;;;;:::i;:::-;162322:59;::::0;;::::1;::::0;::::1;::::0;;162358:23;;;::::1;162322:59:::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;-1:-1:-1;;;162322:59:0;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;162322:59:0;::::1;;::::0;;;;-1:-1:-1;;;162322:59:0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;162392:41:0::1;;;;-1:-1:-1::0;;;162392:41:0::1;;;;;;;:::i;:::-;162466:1;162452:11;:15;162444:44;;;::::0;-1:-1:-1;;;162444:44:0;;8729:2:1;162444:44:0::1;::::0;::::1;8711:21:1::0;8768:2;8748:18;;;8741:30;-1:-1:-1;;;8787:18:1;;;8780:46;8843:18;;162444:44:0::1;8527:340:1::0;162444:44:0::1;162606:20;::::0;::::1;::::0;162584:18:::1;162598:4;162584:11:::0;:18:::1;:::i;:::-;162577:49;;;;:::i;:::-;162554:72;;:20;::::0;::::1;:72:::0;:8;162637:14:::1;162652:7:::0;162637:23:::1;::::0;::::1;;;;;:::i;:::-;:34:::0;;:23;::::1;:34:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;162637:34:0::1;-1:-1:-1::0;;;;162637:34:0::1;::::0;;::::1;-1:-1:-1::0;;;162637:34:0::1;-1:-1:-1::0;;;;162637:34:0;;::::1;-1:-1:-1::0;;;162637:34:0::1;::::0;;;;-1:-1:-1;;;;;;;;162637:34:0;;;::::1;::::0;::::1;-1:-1:-1::0;;162637:34:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;162203:476:0:o;158553:145::-;158635:22;158652:4;;158635:16;:22::i;:::-;158668;158685:4;;158668:16;:22::i;:::-;158553:145;;:::o;154439:646::-;154541:17;;154594:23;;-1:-1:-1;;;154594:23:0;;154606:10;154594:23;;;4731:51:1;154488:16:0;;-1:-1:-1;;;;;154541:17:0;;154517:11;;154541:17;;154594:11;;4704:18:1;;154594:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;154570:47;;154628:25;154670:13;154656:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;154656:28:0;;154628:56;;154695:15;154730:9;154725:327;154749:13;154745:1;:17;154725:327;;;154802:36;;-1:-1:-1;;;154802:36:0;;154824:10;154802:36;;;4967:51:1;5034:18;;;5027:34;;;154784:15:0;;-1:-1:-1;;;;;154802:21:0;;;;;4940:18:1;;154802:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;154784:54;;154853:33;154889:14;154904:7;154889:23;;;;;;;:::i;:::-;154853:59;;;;;;;;154889:23;;;;154853:59;;;;;;;;;;;;;;;;;-1:-1:-1;;;154853:59:0;;;;;;;;;;;;-1:-1:-1;;;154853:59:0;;;;;;;-1:-1:-1;;;154853:59:0;;;;;;;;;;;;-1:-1:-1;154931:18:0;154927:114;;154990:7;154970:8;154979:7;154970:17;;;;;;;;:::i;:::-;;;;;;;;;;:27;155016:9;;;;:::i;:::-;;;;154927:114;154769:283;;154764:3;;;;;:::i;:::-;;;;154725:327;;;-1:-1:-1;155069:8:0;;154439:646;-1:-1:-1;;;;154439:646:0:o;164360:675::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;164520:17:::1;::::0;-1:-1:-1;;;;;164520:17:0::1;164566:4:::0;164549:479:::1;164577:2;164572:1;:7;164549:479;;164624:19;::::0;-1:-1:-1;;;164624:19:0;;::::1;::::0;::::1;15978:25:1::0;;;164601:20:0::1;::::0;-1:-1:-1;;;;;164624:16:0;::::1;::::0;::::1;::::0;15951:18:1;;164624:19:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;164601:42;;164658:33;164694:14;164709:1;164694:17;;;;;;;:::i;:::-;164658:53;::::0;;::::1;::::0;::::1;::::0;;164694:17;;;::::1;164658:53:::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;-1:-1:-1;;;164658:53:0;::::1;::::0;::::1;::::0;;;;;;;::::1;-1:-1:-1::0;;;164658:53:0;::::1;;::::0;;;;-1:-1:-1;;;164658:53:0;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;164817:18:0;164813:204:::1;;164856:37;164862:12;164876:16;164890:1;164876:13;:16::i;164856:37::-;164912:42;164938:15;164912:42;:16;::::0;::::1;:42:::0;:8;164973:14:::1;164988:1:::0;164973:17:::1;::::0;::::1;;;;;:::i;:::-;:28:::0;;:17;::::1;:28:::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;164973:28:0::1;-1:-1:-1::0;;;;164973:28:0::1;::::0;;::::1;-1:-1:-1::0;;;164973:28:0::1;-1:-1:-1::0;;;;164973:28:0;;::::1;-1:-1:-1::0;;;164973:28:0::1;::::0;;;;-1:-1:-1;;;;;;;;164973:28:0;;;::::1;::::0;::::1;-1:-1:-1::0;;164973:28:0;;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;;::::0;;164813:204:::1;164586:442;;164581:3;;;;;:::i;:::-;;;;164549:479;;;;164478:557;164360:675:::0;;:::o;118250:104::-;118306:13;118339:7;118332:14;;;;;:::i;158777:1006::-;158835:26;158864:14;158879:3;158864:19;;;;;;;:::i;:::-;158835:48;;;;;;;;158864:19;;;;158835:48;;;;;;;;;;;;;;;;;-1:-1:-1;;;158835:48:0;;;;;;;;;;;;-1:-1:-1;;;158835:48:0;;;;;;;-1:-1:-1;;;158835:48:0;;;;;;;;;;;;-1:-1:-1;158894:34:0;;;;-1:-1:-1;;;158894:34:0;;;;;;;:::i;:::-;158965:17;;159214:7;;-1:-1:-1;;;;;158965:17:0;;;;159196:26;;;;:17;:26::i;:::-;159179:1;:13;;;:43;;;;159171:70;;;;-1:-1:-1;;;159171:70:0;;13839:2:1;159171:70:0;;;13821:21:1;13878:2;13858:18;;;13851:30;-1:-1:-1;;;13897:18:1;;;13890:44;13951:18;;159171:70:0;13637:338:1;159171:70:0;159321:1;:12;;;159302:31;;:15;:31;;159294:60;;;;-1:-1:-1;;;159294:60:0;;9414:2:1;159294:60:0;;;9396:21:1;9453:2;9433:18;;;9426:30;-1:-1:-1;;;9472:18:1;;;9465:46;9528:18;;159294:60:0;9212:340:1;159294:60:0;159465:7;;:13;;159475:3;159465:13;:::i;:::-;159455:23;;;;;:7;159489:13;;;:17;159557:21;;:12;:21::i;:::-;159539:39;;:15;:39;:::i;:::-;159517:62;;:12;;;:62;:1;159590:14;159605:3;159590:19;;;;;;;:::i;:::-;:23;;:19;;:23;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;159590:23:0;-1:-1:-1;;;;159590:23:0;;;;-1:-1:-1;;;159590:23:0;-1:-1:-1;;;;159590:23:0;;;-1:-1:-1;;;159590:23:0;;;;;-1:-1:-1;;;;;;;;159590:23:0;;;;;;-1:-1:-1;;159590:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;159668:10;:25;;159689:3;;159668:10;159590:23;;159668:25;;159689:3;;159668:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;159751:1;-1:-1:-1;;;;;159751:10:0;;159762:3;159767:1;:7;;;159751:24;;;;;;;;;;;;;;;16187:25:1;;;16260:8;16248:21;16243:2;16228:18;;16221:49;16175:2;16160:18;;16014:262;159751:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158824:959;;158777:1006;:::o;122468:413::-;108960:10;122561:4;122605:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;122605:34:0;;;;;;;;;;122658:35;;;;122650:85;;;;-1:-1:-1;;;122650:85:0;;14182:2:1;122650:85:0;;;14164:21:1;14221:2;14201:18;;;14194:30;14260:34;14240:18;;;14233:62;-1:-1:-1;;;14311:18:1;;;14304:35;14356:19;;122650:85:0;13980:401:1;122650:85:0;122771:67;108960:10;122794:7;122822:15;122803:16;:34;122771:8;:67::i;:::-;-1:-1:-1;122869:4:0;;122468:413;-1:-1:-1;;;122468:413:0:o;119662:175::-;119748:4;119765:42;108960:10;119789:9;119800:6;119765:9;:42::i;157258:108::-;157332:26;157349:8;;157332:16;:26::i;152050:168::-;152197:13;;152108:7;;152182:11;152190:3;152182:5;:11;:::i;111916:140::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111991:20:0;::::1;111983:29;;;::::0;::::1;;-1:-1:-1::0;;;;;112023:18:0::1;;::::0;;;:10:::1;:18;::::0;;;;:25;;-1:-1:-1;;112023:25:0::1;112044:4;112023:25;::::0;;111916:140::o;160289:150::-;111832:10;111821:22;;;;:10;:22;;;;;;;;;:48;;-1:-1:-1;111859:10:0;111848:7;110229:6;;-1:-1:-1;;;;;110229:6:0;;110156:87;111848:7;-1:-1:-1;;;;;111848:21:0;;111821:48;111813:75;;;;-1:-1:-1;;;111813:75:0;;;;;;;:::i;:::-;160390:41:::1;160406:6;160414:16;160390:15;:41::i;151203:47::-:0;;;;;;;;;;;;;;;;;;-1:-1:-1;151203:47:0;;;;;;;-1:-1:-1;;;151203:47:0;;;;;;-1:-1:-1;;;151203:47:0;;;;-1:-1:-1;;;151203:47:0;;;;:::o;111065:201::-;110229:6;;-1:-1:-1;;;;;110229:6:0;108960:10;110376:23;110368:68;;;;-1:-1:-1;;;110368:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111154:22:0;::::1;111146:73;;;::::0;-1:-1:-1;;;111146:73:0;;7512:2:1;111146:73:0::1;::::0;::::1;7494:21:1::0;7551:2;7531:18;;;7524:30;7590:34;7570:18;;;7563:62;-1:-1:-1;;;7641:18:1;;;7634:36;7687:19;;111146:73:0::1;7310:402:1::0;111146:73:0::1;111230:28;111249:8;111230:18;:28::i;:::-;111065:201:::0;:::o;124391:399::-;-1:-1:-1;;;;;124475:21:0;;124467:65;;;;-1:-1:-1;;;124467:65:0;;14931:2:1;124467:65:0;;;14913:21:1;14970:2;14950:18;;;14943:30;15009:33;14989:18;;;14982:61;15060:18;;124467:65:0;14729:355:1;124467:65:0;124623:6;124607:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;124640:18:0;;:9;:18;;;;;;;;;;:28;;124662:6;;124640:9;:28;;124662:6;;124640:28;:::i;:::-;;;;-1:-1:-1;;124684:37:0;;15978:25:1;;;-1:-1:-1;;;;;124684:37:0;;;124701:1;;124684:37;;15966:2:1;15951:18;124684:37:0;;;;;;;158553:145;;:::o;159881:311::-;160052:16;160031:17;160041:6;-1:-1:-1;;;;;119423:18:0;119396:7;119423:18;;;;;;;;;;;;119322:127;160031:17;:37;;160023:71;;;;-1:-1:-1;;;160023:71:0;;12055:2:1;160023:71:0;;;12037:21:1;12094:2;12074:18;;;12067:30;-1:-1:-1;;;12113:18:1;;;12106:51;12174:18;;160023:71:0;11853:345:1;160023:71:0;160105:31;160111:6;160119:16;160105:5;:31::i;:::-;160152:32;;;-1:-1:-1;;;;;4985:32:1;;4967:51;;5049:2;5034:18;;5027:34;;;160152:32:0;;4940:18:1;160152:32:0;4793:274:1;126152:380:0;-1:-1:-1;;;;;126288:19:0;;126280:68;;;;-1:-1:-1;;;126280:68:0;;12405:2:1;126280:68:0;;;12387:21:1;12444:2;12424:18;;;12417:30;12483:34;12463:18;;;12456:62;-1:-1:-1;;;12534:18:1;;;12527:34;12578:19;;126280:68:0;12203:400:1;126280:68:0;-1:-1:-1;;;;;126367:21:0;;126359:68;;;;-1:-1:-1;;;126359:68:0;;7919:2:1;126359:68:0;;;7901:21:1;7958:2;7938:18;;;7931:30;7997:34;7977:18;;;7970:62;-1:-1:-1;;;8048:18:1;;;8041:32;8090:19;;126359:68:0;7717:398:1;126359:68:0;-1:-1:-1;;;;;126440:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;126492:32;;15978:25:1;;;126492:32:0;;15951:18:1;126492:32:0;;;;;;;126152:380;;;:::o;152342:1248::-;152415:17;;152510:14;;-1:-1:-1;;;152510:14:0;;;;;15978:25:1;;;-1:-1:-1;;;;;152415:17:0;;;;152528:10;;152415:17;;152510:9;;15951:18:1;;152510:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;152510:28:0;;152502:50;;;;-1:-1:-1;;;152502:50:0;;;;;;;:::i;:::-;152630:19;;-1:-1:-1;;;152630:19:0;;;;;15978:25:1;;;152613:13:0;;-1:-1:-1;;;;;152630:14:0;;;;;15951:18:1;;152630:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;152598:51;;;;;;;;;152739:26;152768:14;152783:3;152768:19;;;;;;;:::i;:::-;152739:48;;;;;;;;152768:19;;;;152739:48;;;;;;;;;;;;;;;;-1:-1:-1;;;152739:48:0;;;;;;;;;;;;-1:-1:-1;;;152739:48:0;;;;;;;-1:-1:-1;;;152739:48:0;;;;;;;;-1:-1:-1;152817:15:0;152848:14;152863:3;152848:19;;;;;;;:::i;:::-;;:25;;;152844:739;;152959:265;;;;;;;;153002:5;152959:265;;;;;;153027:2;152959:265;;;;;;153066:1;153048;:15;;;:19;;;:73;;153101:19;;153096:24;;;;;;:::i;:::-;153048:73;;;153070:1;:15;;;153048:73;152959:265;;;;153147:1;152959:265;;;;;;153188:19;153201:5;153188:12;:19::i;:::-;153168:40;;153175:2;153168:40;:::i;:::-;152959:265;;;;152937:14;152952:3;152937:19;;;;;;;:::i;:::-;:287;;:19;;:287;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;152937:287:0;-1:-1:-1;;;;152937:287:0;;;;-1:-1:-1;;;152937:287:0;-1:-1:-1;;;;152937:287:0;;;-1:-1:-1;;;152937:287:0;;;;;-1:-1:-1;;;;;;;;152937:287:0;;;;;;-1:-1:-1;;152937:287:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;153425:19;:24;;152937:287;;153425:19;;;:24;;152937:287;;153425:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;153485:5;153464:27;;:10;;:27;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;153543:28;153550:3;153555:15;153543:28;;;;;;16455:25:1;;;16511:2;16496:18;;16489:34;16443:2;16428:18;;16281:248;153543:28:0;;;;;;;;152380:1210;;;;152342:1248;:::o;123371:733::-;-1:-1:-1;;;;;123511:20:0;;123503:70;;;;-1:-1:-1;;;123503:70:0;;11649:2:1;123503:70:0;;;11631:21:1;11688:2;11668:18;;;11661:30;11727:34;11707:18;;;11700:62;-1:-1:-1;;;11778:18:1;;;11771:35;11823:19;;123503:70:0;11447:401:1;123503:70:0;-1:-1:-1;;;;;123592:23:0;;123584:71;;;;-1:-1:-1;;;123584:71:0;;6705:2:1;123584:71:0;;;6687:21:1;6744:2;6724:18;;;6717:30;6783:34;6763:18;;;6756:62;-1:-1:-1;;;6834:18:1;;;6827:33;6877:19;;123584:71:0;6503:399:1;123584:71:0;-1:-1:-1;;;;;123752:17:0;;123728:21;123752:17;;;;;;;;;;;123788:23;;;;123780:74;;;;-1:-1:-1;;;123780:74:0;;8322:2:1;123780:74:0;;;8304:21:1;8361:2;8341:18;;;8334:30;8400:34;8380:18;;;8373:62;-1:-1:-1;;;8451:18:1;;;8444:36;8497:19;;123780:74:0;8120:402:1;123780:74:0;-1:-1:-1;;;;;123890:17:0;;;:9;:17;;;;;;;;;;;123910:22;;;123890:42;;123954:20;;;;;;;;:30;;123926:6;;123890:9;123954:30;;123926:6;;123954:30;:::i;:::-;;;;;;;;124019:9;-1:-1:-1;;;;;124002:35:0;124011:6;-1:-1:-1;;;;;124002:35:0;;124030:6;124002:35;;;;15978:25:1;;15966:2;15951:18;;15832:177;124002:35:0;;;;;;;;124050:46;153692:151;111426:191;111519:6;;;-1:-1:-1;;;;;111536:17:0;;;-1:-1:-1;;;;;;111536:17:0;;;;;;;111569:40;;111519:6;;;111536:17;111519:6;;111569:40;;111500:16;;111569:40;111489:128;111426:191;:::o;156045:1132::-;156144:17;;-1:-1:-1;;;;;156144:17:0;156120:11;;156220:772;156240:19;;;156220:772;;;156315:10;-1:-1:-1;;;;;156289:9:0;;;156299:8;;156308:1;156299:11;;;;;;;:::i;:::-;;;;;;;156289:22;;;;;;;;;;;;;15978:25:1;;15966:2;15951:18;;15832:177;156289:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;156289:36:0;;156281:58;;;;-1:-1:-1;;;156281:58:0;;;;;;;:::i;:::-;156354:33;156390:14;156405:8;;156414:1;156405:11;;;;;;;:::i;:::-;;;;;;;156390:27;;;;;;;:::i;:::-;156354:63;;;;;;;;156390:27;;;;156354:63;;;;;;;;;;;;;;;;;-1:-1:-1;;;156354:63:0;;;;;;;;;;;;-1:-1:-1;;;156354:63:0;;;;;;;-1:-1:-1;;;156354:63:0;;;;;;;;;;;;-1:-1:-1;156523:18:0;156519:462;;156562:27;156592:26;156606:8;;156615:1;156606:11;;;;;;;:::i;:::-;;;;;;;156592:13;:26::i;:::-;156562:56;-1:-1:-1;156641:23:0;;156637:329;;156716:46;156743:19;156716:24;:46;:::i;:::-;156843:42;156869:15;156843:42;:16;;;:42;156689:73;-1:-1:-1;156843:8:0;156908:14;156923:8;;156932:1;156923:11;;;;;;;:::i;:::-;;;;;;;156908:27;;;;;;;:::i;:::-;:38;;:27;;:38;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;156908:38:0;-1:-1:-1;;;;156908:38:0;;;;-1:-1:-1;;;156908:38:0;-1:-1:-1;;;;156908:38:0;;;-1:-1:-1;;;156908:38:0;;;;;-1:-1:-1;;;;;;;;156908:38:0;;;;;;-1:-1:-1;;156908:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;156637:329;156543:438;156519:462;-1:-1:-1;156261:3:0;;;;:::i;:::-;;;;156220:772;;;-1:-1:-1;157006:28:0;;157002:168;;157051:43;157057:10;157069:24;157051:5;:43::i;:::-;157114:44;;;157121:10;4967:51:1;;5049:2;5034:18;;5027:34;;;157114:44:0;;4940:18:1;157114:44:0;;;;;;;156109:1068;;156045:1132;;:::o;158110:164::-;158186:9;158181:86;158201:15;;;158181:86;;;158238:17;158247:4;;158252:1;158247:7;;;;;;;:::i;:::-;;;;;;;158238:8;:17::i;:::-;158218:3;;;;:::i;:::-;;;;158181:86;;125123:591;-1:-1:-1;;;;;125207:21:0;;125199:67;;;;-1:-1:-1;;;125199:67:0;;11247:2:1;125199:67:0;;;11229:21:1;11286:2;11266:18;;;11259:30;11325:34;11305:18;;;11298:62;-1:-1:-1;;;11376:18:1;;;11369:31;11417:19;;125199:67:0;11045:397:1;125199:67:0;-1:-1:-1;;;;;125366:18:0;;125341:22;125366:18;;;;;;;;;;;125403:24;;;;125395:71;;;;-1:-1:-1;;;125395:71:0;;7109:2:1;125395:71:0;;;7091:21:1;7148:2;7128:18;;;7121:30;7187:34;7167:18;;;7160:62;-1:-1:-1;;;7238:18:1;;;7231:32;7280:19;;125395:71:0;6907:398:1;125395:71:0;-1:-1:-1;;;;;125502:18:0;;:9;:18;;;;;;;;;;125523:23;;;125502:44;;125568:12;:22;;125540:6;;125502:9;125568:22;;125540:6;;125568:22;:::i;:::-;;;;-1:-1:-1;;125608:37:0;;15978:25:1;;;125634:1:0;;-1:-1:-1;;;;;125608:37:0;;;;;15966:2:1;15951:18;125608:37:0;;;;;;;153752:84;153692:151;;:::o;157458:644::-;157537:17;;157632:18;;-1:-1:-1;;;157632:18:0;;;;;15978:25:1;;;-1:-1:-1;;;;;157537:17:0;;;;157654:10;;157537:17;;157632:9;;15951:18:1;;157632::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;157632:32:0;;157624:54;;;;-1:-1:-1;;;157624:54:0;;;;;;;:::i;:::-;157722:26;157751:14;157766:7;157751:23;;;;;;;:::i;:::-;157722:52;;;;;;;;157751:23;;;;157722:52;;;;;;;;;;;;;;;;;-1:-1:-1;;;157722:52:0;;;;;;;;;;;;-1:-1:-1;;;157722:52:0;;;;;;;-1:-1:-1;;;157722:52:0;;;;;;;;;;;;-1:-1:-1;157789:11:0;157785:310;;157880:7;;157859:10;:29;;;;;;;157880:7;;157859:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;157926:1;157903:19;;:24;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;157944:11:0;;:1;157970:14;157985:7;157970:23;;;;;;;:::i;:::-;:27;;:23;;:27;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;157970:27:0;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;157970:27:0;-1:-1:-1;;;157970:27:0;;;;;;;-1:-1:-1;;;;157970:27:0;;;;;-1:-1:-1;;;157970:27:0;;;;;;;;;;;;-1:-1:-1;;;;157970:27:0;-1:-1:-1;;;157970:27:0;;;;;;;;;;;;;;158049:34;;16455:25:1;;;158067:15:0;16496:18:1;;;16489:34;;;;158049::0;;16428:18:1;158049:34:0;;;;;;;157502:600;;157458:644;:::o;14:247:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;:::-;250:5;14:247;-1:-1:-1;;;14:247:1:o;266:251::-;336:6;389:2;377:9;368:7;364:23;360:32;357:52;;;405:1;402;395:12;357:52;437:9;431:16;456:31;481:5;456:31;:::i;522:388::-;590:6;598;651:2;639:9;630:7;626:23;622:32;619:52;;;667:1;664;657:12;619:52;706:9;693:23;725:31;750:5;725:31;:::i;:::-;775:5;-1:-1:-1;832:2:1;817:18;;804:32;845:33;804:32;845:33;:::i;:::-;897:7;887:17;;;522:388;;;;;:::o;915:456::-;992:6;1000;1008;1061:2;1049:9;1040:7;1036:23;1032:32;1029:52;;;1077:1;1074;1067:12;1029:52;1116:9;1103:23;1135:31;1160:5;1135:31;:::i;:::-;1185:5;-1:-1:-1;1242:2:1;1227:18;;1214:32;1255:33;1214:32;1255:33;:::i;:::-;915:456;;1307:7;;-1:-1:-1;;;1361:2:1;1346:18;;;;1333:32;;915:456::o;1376:315::-;1444:6;1452;1505:2;1493:9;1484:7;1480:23;1476:32;1473:52;;;1521:1;1518;1511:12;1473:52;1560:9;1547:23;1579:31;1604:5;1579:31;:::i;:::-;1629:5;1681:2;1666:18;;;;1653:32;;-1:-1:-1;;;1376:315:1:o;1696:615::-;1782:6;1790;1843:2;1831:9;1822:7;1818:23;1814:32;1811:52;;;1859:1;1856;1849:12;1811:52;1899:9;1886:23;1928:18;1969:2;1961:6;1958:14;1955:34;;;1985:1;1982;1975:12;1955:34;2023:6;2012:9;2008:22;1998:32;;2068:7;2061:4;2057:2;2053:13;2049:27;2039:55;;2090:1;2087;2080:12;2039:55;2130:2;2117:16;2156:2;2148:6;2145:14;2142:34;;;2172:1;2169;2162:12;2142:34;2225:7;2220:2;2210:6;2207:1;2203:14;2199:2;2195:23;2191:32;2188:45;2185:65;;;2246:1;2243;2236:12;2185:65;2277:2;2269:11;;;;;2299:6;;-1:-1:-1;1696:615:1;;-1:-1:-1;;;;1696:615:1:o;2316:180::-;2375:6;2428:2;2416:9;2407:7;2403:23;2399:32;2396:52;;;2444:1;2441;2434:12;2396:52;-1:-1:-1;2467:23:1;;2316:180;-1:-1:-1;2316:180:1:o;2501:184::-;2571:6;2624:2;2612:9;2603:7;2599:23;2595:32;2592:52;;;2640:1;2637;2630:12;2592:52;-1:-1:-1;2663:16:1;;2501:184;-1:-1:-1;2501:184:1:o;2690:857::-;2820:6;2828;2836;2844;2852;2860;2868;2876;2929:3;2917:9;2908:7;2904:23;2900:33;2897:53;;;2946:1;2943;2936:12;2897:53;2975:9;2969:16;2959:26;;3028:2;3017:9;3013:18;3007:25;3041:31;3066:5;3041:31;:::i;:::-;3141:2;3126:18;;3120:25;3091:5;;-1:-1:-1;3154:33:1;3120:25;3154:33;:::i;:::-;3206:7;3196:17;;;3253:2;3242:9;3238:18;3232:25;3222:35;;3297:3;3286:9;3282:19;3276:26;3266:36;;3342:3;3331:9;3327:19;3321:26;3311:36;;3392:3;3381:9;3377:19;3371:26;3442:7;3435:15;3428:23;3419:7;3416:36;3406:64;;3466:1;3463;3456:12;3406:64;3489:7;3479:17;;;3536:3;3525:9;3521:19;3515:26;3505:36;;2690:857;;;;;;;;;;;:::o;3552:248::-;3620:6;3628;3681:2;3669:9;3660:7;3656:23;3652:32;3649:52;;;3697:1;3694;3687:12;3649:52;-1:-1:-1;;3720:23:1;;;3790:2;3775:18;;;3762:32;;-1:-1:-1;3552:248:1:o;3805:316::-;3882:6;3890;3898;3951:2;3939:9;3930:7;3926:23;3922:32;3919:52;;;3967:1;3964;3957:12;3919:52;-1:-1:-1;;3990:23:1;;;4060:2;4045:18;;4032:32;;-1:-1:-1;4111:2:1;4096:18;;;4083:32;;3805:316;-1:-1:-1;3805:316:1:o;4126:454::-;4221:6;4229;4237;4245;4253;4306:3;4294:9;4285:7;4281:23;4277:33;4274:53;;;4323:1;4320;4313:12;4274:53;-1:-1:-1;;4346:23:1;;;4416:2;4401:18;;4388:32;;-1:-1:-1;4467:2:1;4452:18;;4439:32;;4518:2;4503:18;;4490:32;;-1:-1:-1;4569:3:1;4554:19;4541:33;;-1:-1:-1;4126:454:1;-1:-1:-1;4126:454:1:o;5072:632::-;5243:2;5295:21;;;5365:13;;5268:18;;;5387:22;;;5214:4;;5243:2;5466:15;;;;5440:2;5425:18;;;5214:4;5509:169;5523:6;5520:1;5517:13;5509:169;;;5584:13;;5572:26;;5653:15;;;;5618:12;;;;5545:1;5538:9;5509:169;;;-1:-1:-1;5695:3:1;;5072:632;-1:-1:-1;;;;;;5072:632:1:o;5901:597::-;6013:4;6042:2;6071;6060:9;6053:21;6103:6;6097:13;6146:6;6141:2;6130:9;6126:18;6119:34;6171:1;6181:140;6195:6;6192:1;6189:13;6181:140;;;6290:14;;;6286:23;;6280:30;6256:17;;;6275:2;6252:26;6245:66;6210:10;;6181:140;;;6339:6;6336:1;6333:13;6330:91;;;6409:1;6404:2;6395:6;6384:9;6380:22;6376:31;6369:42;6330:91;-1:-1:-1;6482:2:1;6461:15;-1:-1:-1;;6457:29:1;6442:45;;;;6489:2;6438:54;;5901:597;-1:-1:-1;;;5901:597:1:o;10324:356::-;10526:2;10508:21;;;10545:18;;;10538:30;10604:34;10599:2;10584:18;;10577:62;10671:2;10656:18;;10324:356::o;12608:332::-;12810:2;12792:21;;;12849:1;12829:18;;;12822:29;-1:-1:-1;;;12882:2:1;12867:18;;12860:39;12931:2;12916:18;;12608:332::o;12945:334::-;13147:2;13129:21;;;13186:2;13166:18;;;13159:30;-1:-1:-1;;;13220:2:1;13205:18;;13198:40;13270:2;13255:18;;12945:334::o;14386:338::-;14588:2;14570:21;;;14627:2;14607:18;;;14600:30;-1:-1:-1;;;14661:2:1;14646:18;;14639:44;14715:2;14700:18;;14386:338::o;16922:224::-;16961:3;16989:6;17022:2;17019:1;17015:10;17052:2;17049:1;17045:10;17083:3;17079:2;17075:12;17070:3;17067:21;17064:47;;;17091:18;;:::i;:::-;17127:13;;16922:224;-1:-1:-1;;;;16922:224:1:o;17151:226::-;17190:3;17218:8;17253:2;17250:1;17246:10;17283:2;17280:1;17276:10;17314:3;17310:2;17306:12;17301:3;17298:21;17295:47;;;17322:18;;:::i;17382:128::-;17422:3;17453:1;17449:6;17446:1;17443:13;17440:39;;;17459:18;;:::i;:::-;-1:-1:-1;17495:9:1;;17382:128::o;17515:228::-;17554:3;17582:10;17619:2;17616:1;17612:10;17649:2;17646:1;17642:10;17680:3;17676:2;17672:12;17667:3;17664:21;17661:47;;;17688:18;;:::i;17748:230::-;17787:3;17815:12;17854:2;17851:1;17847:10;17884:2;17881:1;17877:10;17915:3;17911:2;17907:12;17902:3;17899:21;17896:47;;;17923:18;;:::i;17983:232::-;18022:3;18050:14;18091:2;18088:1;18084:10;18121:2;18118:1;18114:10;18152:3;18148:2;18144:12;18139:3;18136:21;18133:47;;;18160:18;;:::i;18220:189::-;18259:1;18285:8;18320:2;18317:1;18313:10;18342:3;18332:37;;18349:18;;:::i;:::-;18387:10;;18383:20;;;;;18220:189;-1:-1:-1;;18220:189:1:o;18414:120::-;18454:1;18480;18470:35;;18485:18;;:::i;:::-;-1:-1:-1;18519:9:1;;18414:120::o;18539:422::-;18628:1;18671:5;18628:1;18685:270;18706:7;18696:8;18693:21;18685:270;;;18765:4;18761:1;18757:6;18753:17;18747:4;18744:27;18741:53;;;18774:18;;:::i;:::-;18824:7;18814:8;18810:22;18807:55;;;18844:16;;;;18807:55;18923:22;;;;18883:15;;;;18685:270;;;18689:3;18539:422;;;;;:::o;18966:131::-;19026:5;19055:36;19082:8;19076:4;19151:5;19181:8;19171:80;;-1:-1:-1;19222:1:1;19236:5;;19171:80;19270:4;19260:76;;-1:-1:-1;19307:1:1;19321:5;;19260:76;19352:4;19370:1;19365:59;;;;19438:1;19433:130;;;;19345:218;;19365:59;19395:1;19386:10;;19409:5;;;19433:130;19470:3;19460:8;19457:17;19454:43;;;19477:18;;:::i;:::-;-1:-1:-1;;19533:1:1;19519:16;;19548:5;;19345:218;;19647:2;19637:8;19634:16;19628:3;19622:4;19619:13;19615:36;19609:2;19599:8;19596:16;19591:2;19585:4;19582:12;19578:35;19575:77;19572:159;;;-1:-1:-1;19684:19:1;;;19716:5;;19572:159;19763:34;19788:8;19782:4;19763:34;:::i;:::-;19833:6;19829:1;19825:6;19821:19;19812:7;19809:32;19806:58;;;19844:18;;:::i;:::-;19882:20;;19102:806;-1:-1:-1;;;19102:806:1:o;19913:168::-;19953:7;20019:1;20015;20011:6;20007:14;20004:1;20001:21;19996:1;19989:9;19982:17;19978:45;19975:71;;;20026:18;;:::i;:::-;-1:-1:-1;20066:9:1;;19913:168::o;20086:217::-;20125:4;20154:6;20210:10;;;;20180;;20232:12;;;20229:38;;;20247:18;;:::i;:::-;20284:13;;20086:217;-1:-1:-1;;;20086:217:1:o;20308:125::-;20348:4;20376:1;20373;20370:8;20367:34;;;20381:18;;:::i;:::-;-1:-1:-1;20418:9:1;;20308:125::o;20438:223::-;20477:4;20506:12;20568:10;;;;20538;;20590:12;;;20587:38;;;20605:18;;:::i;20666:380::-;20745:1;20741:12;;;;20788;;;20809:61;;20863:4;20855:6;20851:17;20841:27;;20809:61;20916:2;20908:6;20905:14;20885:18;20882:38;20879:161;;;20962:10;20957:3;20953:20;20950:1;20943:31;20997:4;20994:1;20987:15;21025:4;21022:1;21015:15;21051:135;21090:3;-1:-1:-1;;21111:17:1;;21108:43;;;21131:18;;:::i;:::-;-1:-1:-1;21178:1:1;21167:13;;21051:135::o;21191:127::-;21252:10;21247:3;21243:20;21240:1;21233:31;21283:4;21280:1;21273:15;21307:4;21304:1;21297:15;21323:127;21384:10;21379:3;21375:20;21372:1;21365:31;21415:4;21412:1;21405:15;21439:4;21436:1;21429:15;21455:127;21516:10;21511:3;21507:20;21504:1;21497:31;21547:4;21544:1;21537:15;21571:4;21568:1;21561:15;21587:127;21648:10;21643:3;21639:20;21636:1;21629:31;21679:4;21676:1;21669:15;21703:4;21700:1;21693:15;21719:131;-1:-1:-1;;;;;21794:31:1;;21784:42;;21774:70;;21840:1;21837;21830:12
Swarm Source
ipfs://5385f7219d66a52250bb128c8c1c85e3841a97ec6eed79960cb1dc186048a6b1
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.