Overview ERC20
PRICE
n/a

ON-CHAIN MARKET CAP n/a

Total Supply:
1,000,000,000.00 SKIFROG

Holders:
8
Profile Summary
Blockchain:
Base (8453)


Decimals:
18
Contract Source Code Verified (Partial Match)
Contract Name:
MoonshotToken

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Created At:
Wed, 11 Dec 2024 15:23:29 GMT
draft-IERC6093.sol
@openzeppelin
contracts
interfaces
draft-IERC6093.sol


Contract ABI
[
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "string",
            "name": "name",
            "type": "string"
          },
          {
            "internalType": "string",
            "name": "symbol",
            "type": "string"
          },
          {
            "internalType": "address",
            "name": "creator",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "totalSupply",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "virtualTokenReserves",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "virtualCollateralReserves",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "feeBasisPoints",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "dexFeeBasisPoints",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "migrationFeeFixed",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "poolCreationFee",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "mcLowerLimit",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "mcUpperLimit",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "tokensMigrationThreshold",
            "type": "uint256"
          },
          {
            "internalType": "address",
            "name": "treasury",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "uniV2Router",
            "type": "address"
          },
          {
            "internalType": "address",
            "name": "dexTreasury",
            "type": "address"
          }
        ],
        "internalType": "struct IMoonshotToken.ConstructorParams",
        "name": "_params",
        "type": "tuple"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "allowance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientAllowance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "balance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientBalance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "approver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidApprover",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidReceiver",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSpender",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "FailedToSendETH",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InsufficientTokenReserves",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MarketcapThresholdReached",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NotEnoughETHReserves",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NotEnoughtETHToBuyTokens",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "OnlyFactory",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ReentrancyGuardReentrantCall",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SendingToPairIsNotAllowedBeforeMigration",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SlippageCheckFailed",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "TradingStopped",
    "type": "error"
  },
  {
    "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": 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"
  },
  {
    "inputs": [],
    "name": "MAX_BPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "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": "value",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "burn",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "burnFrom",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_amountOutMin",
        "type": "uint256"
      }
    ],
    "name": "buyExactIn",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "collateralToPayWithFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "helioFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "dexFee",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_tokenAmount",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_maxCollateralAmount",
        "type": "uint256"
      }
    ],
    "name": "buyExactOut",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "collateralToPayWithFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "helioFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "dexFee",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "creator",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "curveType",
    "outputs": [
      {
        "internalType": "enum IMoonshotToken.CurveType",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "dexFeeBPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "dexTreasury",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "factory",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "feeBPS",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "fixedMigrationFee",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_amountOut",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_reserveIn",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_reserveOut",
        "type": "uint256"
      },
      {
        "internalType": "bool",
        "name": "_paymentTokenIsOut",
        "type": "bool"
      }
    ],
    "name": "getAmountInAndFee",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "amountIn",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "fee",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_amountIn",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_reserveIn",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_reserveOut",
        "type": "uint256"
      },
      {
        "internalType": "bool",
        "name": "_paymentTokenIsIn",
        "type": "bool"
      }
    ],
    "name": "getAmountOutAndFee",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "amountOut",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "fee",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getCurveProgressBps",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getMarketCap",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "initalTokenSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "mcLowerLimit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "mcUpperLimit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "migrate",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "tokensToMigrate",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "tokensToBurn",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "collateralAmount",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pair",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "poolCreationFee",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_tokenAmount",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_amountCollateralMin",
        "type": "uint256"
      }
    ],
    "name": "sellExactIn",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "collateralToReceiveMinusFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "helioFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "dexFee",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "_tokenAmountMax",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "_amountCollateral",
        "type": "uint256"
      }
    ],
    "name": "sellExactOut",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "collateralToReceiveMinusFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "tokensOut",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "helioFee",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "dexFee",
        "type": "uint256"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "sendingToPairNotAllowed",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "tokensMigrationThreshold",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "tradingStopped",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "_value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "treasury",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "uniswapV2Router",
    "outputs": [
      {
        "internalType": "contract IUniswapV2Router02",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "virtualCollateralReserves",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "virtualCollateralReservesInitial",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "virtualTokenReserves",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]


Contract Creation Code
61024080604052346200068a57620027f0803803809162000021828562000a0a565b833981016020828203126200068a5781516001600160401b0381116200068a576102008184018303126200068a576040519161020083016001600160401b038111848210176200063957604052838201516001600160401b0381116200068a578162000091918487010162000a2e565b835283820160200151916001600160401b0383116200068a57620000c16101e0926200017d948388010162000a2e565b94856020860152620000d860408383010162000aa4565b6040860152808201606081810151908701526080808201519087015260a0808201519087015260c0808201519087015260e080820151908701526101008082015190870152610120808201519087015261014080820151908701526101608082015190870152610180808201519087015262000158906101a00162000aa4565b6101a08601526200016f6101c08383010162000aa4565b6101c0860152010162000aa4565b6101e0820152805180519092906001600160401b0381116200063957600354600181811c91168015620009ff575b6020821014620008fd57601f811162000999575b506020601f82116001146200092a57819293946000926200091e575b50508160011b916000199060031b1c1916176003555b8051906001600160401b038211620006395760045490600182811c9216801562000913575b6020831014620008fd5781601f8493116200088b575b50602090601f8311600114620007fc57600092620007f0575b50508160011b916000199060031b1c1916176004555b600160055561010061ff001960095416176009556060810151903015620007d757600254908282018211620007c15782600493602093016002553060005260008352604060002081815401905560405190815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843093a3606081015160065560a081015180600855608052608081015160075560018060a01b036040820151166101805260c081015160a05260e081015160c05260018060a01b036101a0820151166101c05260018060a01b036101e0820151166101e052610100810151610140526101208101516101605261014081015160e05261016081015161010052610180810151610120526101c060018060a01b039101511680610220523361020052604051928380926315ab88c960e31b82525afa90811562000698576000916200077f575b506000906001600160a01b0316301015620006e65750610220516040516315ab88c960e31b815290602090829060049082906001600160a01b03165afa80156200069857600090620006a4575b60049150305b6102205160405163c45a015560e01b81529360209185919082906001600160a01b03165afa92831562000698576000936200064f575b506040516001600160601b0319606092831b81166020830190815293831b811660348301526028825291810192918184106001600160401b03851117620006395760e092846040528251902090608083019560ff60f81b875260601b16608183015260958201527f96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f60b582015260558352019181831060018060401b0384111762000639576040839052905190206001600160a01b03166101a052611d36908162000aba82396080518181816105640152610a01015260a0518181816114b8015261195d015260c05181818161096801528181610dcb0152611989015260e051818181610f7e0152611b740152610100518181816111610152611bb30152610120518181816101fe01526114390152610140518181816104aa01526108d901526101605181818161052901526109170152610180518161175b01526101a0518181816105b00152818161062a0152610aae01526101c0518181816102f10152818161099801528181610e5601528181610fb60152818161106401526112da01526101e05181818161031b015281816109cf01528181610d5101528181610e800152818161108e0152611304015261020051818181610271015281816104e20152818161079c01528181610dfd01528181610ff901526112440152610220518181816107dd015261150f0152f35b634e487b7160e01b600052604160045260246000fd5b9092506020813d6020116200068f575b816200066e6020938362000a0a565b810103126200068a57620006829062000aa4565b91386200042c565b600080fd5b3d91506200065f565b6040513d6000823e3d90fd5b506020813d602011620006dd575b81620006c16020938362000a0a565b810103126200068a57620006d760049162000aa4565b620003f0565b3d9150620006b2565b610220516040516315ab88c960e31b81529190602090839060049082906001600160a01b03165afa908115620007735780916200072b575b50600491503090620003f6565b90506020823d6020116200076a575b81620007496020938362000a0a565b810103126200076757506200076060049162000aa4565b386200071e565b80fd5b3d91506200073a565b604051903d90823e3d90fd5b90506020813d602011620007b8575b816200079d6020938362000a0a565b810103126200068a57620007b19062000aa4565b38620003a3565b3d91506200078e565b634e487b7160e01b600052601160045260246000fd5b60405163ec442f0560e01b815260006004820152602490fd5b01519050388062000245565b6004600090815293507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b91905b601f19841685106200086f576001945083601f1981161062000855575b505050811b016004556200025b565b015160001960f88460031b161c1916905538808062000846565b8181015183556020948501946001909301929091019062000829565b60046000529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810160208510620008f5575b90849392915b601f830160051c82018110620008e55750506200022c565b60008155859450600101620008cd565b5080620008c7565b634e487b7160e01b600052602260045260246000fd5b91607f169162000216565b015190503880620001db565b600360005260206000209060005b601f1984168110620009805750600193949583601f1981161062000966575b505050811b01600355620001f1565b015160001960f88460031b161c1916905538808062000957565b9091602060018192858a01518155019301910162000938565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810160208410620009f7575b601f830160051c82018110620009ea575050620001bf565b60008155600101620009d2565b5080620009d2565b90607f1690620001ab565b601f909101601f19168101906001600160401b038211908210176200063957604052565b919080601f840112156200068a5782516001600160401b03811162000639576020906040519262000a6983601f19601f850116018562000a0a565b8184528282870101116200068a5760005b81811062000a9057508260009394955001015290565b858101830151848201840152820162000a7a565b51906001600160a01b03821682036200068a5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826302d05d3f146117475750816306fdde0314611650578163095ea7b3146115a6578163152044811461155d5781631655bc621461153e5781631694505e146114fa57816318160ddd146114db5781631a1c6e53146114a05781632368da32146113f057816323b872dd146113b357816325e17b5714611232578163313ce5671461121657816342966c68146111f857816349a30246146111845781634c7766b5146111495781634fb3fbe714610fe557816361d027b314610fa15781636d04eb9f14610f6657816370a0823114610f2f5781637187631814610dee57816371ea0d8e14610db357816379cc679014610d8057816385f377ca14610d3c5781638fd3ab801461077e57816390825c281461075a57816395d89b4114610659578163a8aa1b3114610615578163a9059cbb14610587578163b026a1211461054c578163be74615f14610511578163c45a0155146104cd578163c48afe1614610492578163c6d8b7781461046b578163c78d0b0e1461044c578163d3728de414610431578163dd62ed3e146103e8578163e8e70c4c146103c9578163e98d5cd51461026457508063fd62bcd714610241578063fd967f47146102255763fe94c269146101e857600080fd5b34610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5080fd5b5034610221578160031936011261022157602090516127108152f35b503461022157816003193601126102215760209060ff6009541690519015158152f35b8261026e3661182b565b917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036103ba5760ff600954166103ab576102ca6102b860085484611879565b6102c4846007546118a2565b906118af565b916102d48361194e565b9390956102ea856102e589856118cf565b6118cf565b95610315887f0000000000000000000000000000000000000000000000000000000000000000611beb565b61033f867f0000000000000000000000000000000000000000000000000000000000000000611beb565b861061039d57508161036a61037e9261035f6103999796956007546118a2565b6007556008546118cf565b6008556103778633611beb565b3033611a8c565b51938493846040919493926060820195825260208201520152565b0390f35b8351630a1c173f60e41b8152fd5b5163058aab2d60e21b81528390fd5b51630636a15760e11b81528390fd5b5050346102215781600319360112610221576020906008549051908152f35b505034610221578060031936011261022157806020926104066117d3565b61040e6117ee565b6001600160a01b0391821683526001865283832091168252845220549051908152f35b50503461022157816003193601126102215751908152602090f35b5050346102215781600319360112610221576020906006549051908152f35b50503461022157816003193601126102215760209060ff60095460081c1690519015158152f35b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610221578160031936011261022157517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b828434610612578160031936011261061257506105a26117d3565b916001600160a01b038084167f00000000000000000000000000000000000000000000000000000000000000009091161480610603575b6105f557506105ee6020926024359033611a8c565b5160018152f35b9051633b95747f60e21b8152fd5b5060ff60095460081c166105d9565b80fd5b505034610221578160031936011261022157517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b83833461022157816003193601126102215780519180938054916001908360011c9260018516948515610750575b602095868610811461073d5785895290811561071957506001146106c1575b61039987876106b7828c0383611841565b519182918261178a565b81529295507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8284106107065750505082610399946106b7928201019486806106a6565b80548685018801529286019281016106e8565b60ff19168887015250505050151560051b83010192506106b78261039986806106a6565b634e487b7160e01b845260228352602484fd5b93607f1693610687565b505034610221578160031936011261022157602090610777611913565b9051908152f35b91905034610b7e5782600319360112610b7e576001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082163303610d2d576009805461ff0019169055805163c45a015560e01b8082527f00000000000000000000000000000000000000000000000000000000000000008416929160209182828881885afa918215610bc4578892610d0e575b5083516315ab88c960e31b8082529284828a818a5afa918215610d0457918591610878938c92610ce5575b50875163e6a4390560e01b815230818d019081526001600160a01b03909316602084015293849283918c918391604090910190565b0392165afa908115610cdb579087918a91610cbe575b501615610bce575b5050308652858152818620549282519563095ea7b360e01b8752818188015284602488015282876044818b305af1968715610bc4576109c9959697610ba7575b507f000000000000000000000000000000000000000000000000000000000000000096610a2661090689476118cf565b6102e561095561094e61094561093d7f000000000000000000000000000000000000000000000000000000000000000080966118cf565b600754611879565b600854906118af565b809b6118cf565b9a6102e58c6109f961099561271061098d7f000000000000000000000000000000000000000000000000000000000000000087611879565b0480956118cf565b917f00000000000000000000000000000000000000000000000000000000000000009d8e6109c389866118a2565b90611beb565b6109f3857f0000000000000000000000000000000000000000000000000000000000000000611beb565b30611c61565b6102e56008547f0000000000000000000000000000000000000000000000000000000000000000906118cf565b95600a4201804211610b94579060608b94939260c48b8b8b51998a94859363f305d71960e01b8552308b860152806024860152604485015282606485015230608485015260a48401525af1948515610b8a579084939291879596610b48575b5060449291849147610b37575b508851968795869463a9059cbb60e01b865285015260248401527f0000000000000000000000000000000000000000000000000000000000000000165af18015610b2d5761039995969750610aff575b505051938493846040919493926060820195825260208201520152565b81610b1e92903d10610b26575b610b168183611841565b8101906118fb565b503880610ae2565b503d610b0c565b83513d89823e3d90fd5b610b42904790611beb565b38610a92565b94509450906060843d606011610b82575b81610b6660609383611841565b81010312610b7e579286015193859391906044610a85565b8280fd5b3d9150610b59565b87513d86823e3d90fd5b634e487b7160e01b8b526011845260248bfd5b610bbd90843d8611610b2657610b168183611841565b50386108d6565b84513d8a823e3d90fd5b835190815282818881885afa908115610bc4578891610ca1575b50835191825282828881885afa918215610bc457918391610c3f938a92610c82575b5085516364e329cb60e11b815230818b019081526001600160a01b03909316602084015293849283918c918b91849160400190565b0393165af18015610b2d57610c55575b80610896565b610c7490823d8411610c7b575b610c6c8183611841565b8101906118dc565b5038610c4f565b503d610c62565b610c9a919250833d8511610c7b57610c6c8183611841565b9038610c0a565b610cb89150833d8511610c7b57610c6c8183611841565b38610be8565b610cd59150853d8711610c7b57610c6c8183611841565b3861088e565b85513d8b823e3d90fd5b610cfd919250833d8511610c7b57610c6c8183611841565b9038610843565b86513d8c823e3d90fd5b610d26919250833d8511610c7b57610c6c8183611841565b9038610818565b51630636a15760e11b81529050fd5b505034610221578160031936011261022157517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346102215736600319011261061257610db0610d9c6117d3565b60243590610dab8233836119b9565b611c61565b80f35b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b9050610df93661182b565b92907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610f215760ff60095416610f1357610e3e8461194e565b929091610e4f846102e585896118cf565b94610e7a847f0000000000000000000000000000000000000000000000000000000000000000611beb565b610ea4857f0000000000000000000000000000000000000000000000000000000000000000611beb565b610ebf610eb360075489611879565b6102c4896008546118cf565b918211610f055750610ee4608096610ed8833033611a8c565b61035f836007546118a2565b600855610ef18533611beb565b815194855260208501528301526060820152f35b8251630a1c173f60e41b8152fd5b505163058aab2d60e21b8152fd5b5051630636a15760e11b8152fd5b5050346102215760203660031901126102215760209181906001600160a01b03610f576117d3565b16815280845220549051908152f35b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b505034610221578160031936011261022157517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b9190506020366003190112610b7e578135927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610f215760ff60095416610f1357818491308152806020522054111561113c5761104c3461194e565b93909261105d856102e586346118cf565b90611088857f0000000000000000000000000000000000000000000000000000000000000000611beb565b6110b2867f0000000000000000000000000000000000000000000000000000000000000000611beb565b6007546110bf8184611879565b916110d1600854936102c486866118a2565b94851061112e57506111029284926110f061039997966110f8946118cf565b6007556118a2565b6008553330611a8c565b61110a611b6a565b611112611ba9565b5192839234846040919493926060820195825260208201520152565b8551630a1c173f60e41b8152fd5b5163904db1ff60e01b8152fd5b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b8284346106125761119436611804565b9193509190156111d657906102c4826111c26111bb6111b56111c89661194e565b906118a2565b9582611879565b926118cf565b905b82519182526020820152f35b806111c26111e7946102c493611879565b6111f36111b58261194e565b6111ca565b83903461022157602036600319011261022157610db0903533611c61565b5050346102215781600319360112610221576020905160128152f35b905061123d3661182b565b90939092907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610f215760ff60095416610f1357818591308152806020522054111561113c576112a961129d60085486611879565b6102c4866007546118cf565b936112b38561194e565b9390956112c9856112c489846118a2565b6118a2565b9586116113a45761133f906112fe887f0000000000000000000000000000000000000000000000000000000000000000611beb565b611328867f0000000000000000000000000000000000000000000000000000000000000000611beb565b611334846007546118cf565b6007556008546118a2565b600855843411600014611380575090611370610399939261136961136387346118cf565b33611beb565b3330611a8c565b611378611b6a565b61037e611ba9565b8434106113965750906113706103999392611369565b82516367c45b4f60e11b8152fd5b508251630a1c173f60e41b8152fd5b505034610221576060366003190112610221576020906105ee6113d46117d3565b6113dc6117ee565b604435916113eb8333836119b9565b611a8c565b8284346106125780600319360112610612576114196006543083528260205283832054906118cf565b90612710918281029080820484149015171561148d576020945061145e907f0000000000000000000000000000000000000000000000000000000000000000906118af565b906064821015611475575050506064905b51908152f35b508181111561148657505b9061146f565b9050611480565b634e487b7160e01b825260118552602482fd5b505034610221578160031936011261022157602090517f00000000000000000000000000000000000000000000000000000000000000008152f35b5050346102215781600319360112610221576020906002549051908152f35b505034610221578160031936011261022157517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5050346102215781600319360112610221576020906007549051908152f35b8284346106125761156d36611804565b9093509091901561159557906102c48261158f6111bb6111b56111c89661194e565b926118a2565b8061158f6111e7946102c493611879565b905034610b7e5781600319360112610b7e576115c06117d3565b602435903315611639576001600160a01b031691821561162257508083602095338152600187528181208582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8351634a1406b160e11b8152908101859052602490fd5b835163e602df0560e01b8152808401869052602490fd5b91905034610b7e5782600319360112610b7e5780519183600354906001908260011c9260018116801561173d575b602095868610821461172a575084885290811561170857506001146116af575b61039986866106b7828b0383611841565b929550600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106116f55750505082610399946106b792820101943861169e565b80548685018801529286019281016116d8565b60ff191687860152505050151560051b83010192506106b7826103993861169e565b634e487b7160e01b845260229052602483fd5b93607f169361167e565b8490346102215781600319360112610221577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b6020808252825181830181905290939260005b8281106117bf57505060409293506000838284010152601f8019910116010190565b81810186015184820160400152850161179d565b600435906001600160a01b03821682036117e957565b600080fd5b602435906001600160a01b03821682036117e957565b60809060031901126117e95760043590602435906044359060643580151581036117e95790565b60409060031901126117e9576004359060243590565b90601f8019910116810190811067ffffffffffffffff82111761186357604052565b634e487b7160e01b600052604160045260246000fd5b8181029291811591840414171561188c57565b634e487b7160e01b600052601160045260246000fd5b9190820180921161188c57565b81156118b9570490565b634e487b7160e01b600052601260045260246000fd5b9190820391821161188c57565b908160209103126117e957516001600160a01b03811681036117e95790565b908160209103126117e9575180151581036117e95790565b600854670de0b6b3a7640000908181029080820483149015171561188c5761194161194a9160025490611879565b600754906118af565b0490565b6119b6611982916127109283917f000000000000000000000000000000000000000000000000000000000000000090611879565b04916119ae7f000000000000000000000000000000000000000000000000000000000000000084611879565b0480926118cf565b91565b9160018060a01b0380931691600093838552600160205260409384862091831691828752602052848620549260001984036119f8575b50505050505050565b848410611a5c57508015611a44578115611a2c578552600160205283852090855260205203912055388080808080806119ef565b8451634a1406b160e11b815260048101879052602490fd5b845163e602df0560e01b815260048101879052602490fd5b8551637dc7a0d960e11b81526001600160a01b039190911660048201526024810184905260448101859052606490fd5b916001600160a01b03808416928315611b515716928315611b385760009083825281602052604082205490838210611b06575091604082827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef958760209652828652038282205586815220818154019055604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101839052606490fd5b60405163ec442f0560e01b815260006004820152602490fd5b604051634b637e8f60e11b815260006004820152602490fd5b611b72611913565b7f000000000000000000000000000000000000000000000000000000000000000010611b9a57565b600160ff196009541617600955565b611bb1611913565b7f000000000000000000000000000000000000000000000000000000000000000010611bd957565b6040516353dfa97560e01b8152600490fd5b60008080809481945af1903d15611c5b573d9067ffffffffffffffff8211611c475760405191611c25601f8201601f191660200184611841565b825260203d92013e5b15611c3557565b6040516338822c1360e11b8152600490fd5b634e487b7160e01b81526041600452602490fd5b50611c2e565b906001600160a01b038216908115611b515760009282845283602052604084205490828210611cce5750817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef926020928587528684520360408620558060025403600255604051908152a3565b60405163391434e360e21b81526001600160a01b03919091166004820152602481019190915260448101829052606490fdfea2646970667358221220424a1d6e95d7584845dcdfc2c56d0d902df68e72dc0d75b9516812dce9373e3364736f6c634300081700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002400000000000000000000000007ea019e629550334103e5c27fd19624edc2118420000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000036ccfbb244887eea400000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000001770000000000000000000000000000000000000000000000000016345785d8a000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000015af1d78b58c4000000000000000000000000000000000000000000000000000176b344f2a78c0000000000000000000000000000000000000000000002955cf104607ca9a4370703000000000000000000000000c01ab97ec9371157de1fc7a5341f7b899894d6320000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000c654972dd50bf174629a5ce12fae7849100a073d000000000000000000000000000000000000000000000000000000000000000d534b49204d41534b2046524f47000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007534b4946524f4700000000000000000000000000000000000000000000000000