-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path2102.bandle.js
1 lines (1 loc) · 163 KB
/
2102.bandle.js
1
"use strict";(self.webpackChunkhedge=self.webpackChunkhedge||[]).push([[2102],{22102:module=>{eval('module.exports = JSON.parse(\'{"address":"0x8DaB85712CB6DeE470b72D6c54A3F8426010ce28","abi":[{"inputs":[{"internalType":"contract IHegicOperationalTreasury","name":"_pool","type":"address"},{"internalType":"contract AggregatorV3Interface","name":"_priceProvider","type":"address"},{"internalType":"contract IPremiumCalculator","name":"_pricer","type":"address"},{"internalType":"uint8","name":"_spotDecimals","type":"uint8"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"strike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"Acquired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atmStrike","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"otmStrike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"AcquiredSpread","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"premium","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"callStrike","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"putStrike","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"expiration","type":"uint32"}],"name":"AcquiredStrangle","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":"limit","type":"uint256"}],"name":"SetLimit","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint256","name":"strike","type":"uint256"}],"name":"buy","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"strike","type":"uint256"}],"name":"calculatePremium","outputs":[{"internalType":"uint256","name":"premium","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralizationRatio","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionID","type":"uint256"}],"name":"exercise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLockedByStrategy","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"k","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"contract IHegicOperationalTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceProvider","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricer","outputs":[{"internalType":"contract IPremiumCalculator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"optionID","type":"uint256"}],"name":"profitOf","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPremiumCalculator","name":"value","type":"address"}],"name":"setPricer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyData","outputs":[{"internalType":"uint128","name":"amount","type":"uint128"},{"internalType":"uint128","name":"strike","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"transactionHash":"0x83c99e5cd1bd09c445038c9cdd4cb39b80d6b674c20b09571ef98d927a08b3cc","receipt":{"to":null,"from":"0xF15968a096Fc8F47650001585d23bEE819b5affb","contractAddress":"0x8DaB85712CB6DeE470b72D6c54A3F8426010ce28","transactionIndex":0,"gasUsed":"25042833","logsBloom":"0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008001000000000000000000000000000000000000020000000000000000000800000000000000800000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000004000000000010000000000000000000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000","blockHash":"0x8c1ee36367465b631f7e65eb3c0547642eaf7491d9b184a3c3ca52f2c23af6b3","transactionHash":"0x83c99e5cd1bd09c445038c9cdd4cb39b80d6b674c20b09571ef98d927a08b3cc","logs":[{"transactionIndex":0,"blockNumber":9862462,"transactionHash":"0x83c99e5cd1bd09c445038c9cdd4cb39b80d6b674c20b09571ef98d927a08b3cc","address":"0x8DaB85712CB6DeE470b72D6c54A3F8426010ce28","topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f15968a096fc8f47650001585d23bee819b5affb"],"data":"0x","logIndex":0,"blockHash":"0x8c1ee36367465b631f7e65eb3c0547642eaf7491d9b184a3c3ca52f2c23af6b3"}],"blockNumber":9862462,"cumulativeGasUsed":"11349093","status":1,"byzantium":true},"args":["0xB0F9F032158510cd4a926F9263Abc86bAF7b4Ab3","0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612","0x1518Fe51352AbECEfD0E829A01C86920530550EC",18,90000000000],"solcInputHash":"264ee48953aea33f233d54b8c17bc0e4","metadata":"{\\\\"compiler\\\\":{\\\\"version\\\\":\\\\"0.8.6+commit.11564f7e\\\\"},\\\\"language\\\\":\\\\"Solidity\\\\",\\\\"output\\\\":{\\\\"abi\\\\":[{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IHegicOperationalTreasury\\\\",\\\\"name\\\\":\\\\"_pool\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"contract AggregatorV3Interface\\\\",\\\\"name\\\\":\\\\"_priceProvider\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"_pricer\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"_spotDecimals\\\\",\\\\"type\\\\":\\\\"uint8\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"limit\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"constructor\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"Acquired\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"atmStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"otmStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"AcquiredSpread\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"anonymous\\\\":false,\\\\"inputs\\\\":[{\\\\"indexed\\\\":true,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"callStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"putStrike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"indexed\\\\":false,\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"expiration\\\\",\\\\"type\\\\":\\\\"uint32\\\\"}],\\\\"name\\\\":\\\\"AcquiredStrangle\\\\",\\\\"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\\\\":\\\\"limit\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"SetLimit\\\\",\\\\"type\\\\":\\\\"event\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"holder\\\\",\\\\"type\\\\":\\\\"address\\\\"},{\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"period\\\\",\\\\"type\\\\":\\\\"uint32\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"buy\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"id\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint32\\\\",\\\\"name\\\\":\\\\"period\\\\",\\\\"type\\\\":\\\\"uint32\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"calculatePremium\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"premium\\\\",\\\\"type\\\\":\\\\"uint256\\\\"},{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"available\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"collateralizationRatio\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint8\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint8\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"optionID\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"exercise\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"getLockedByStrategy\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"k\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"lockedLimit\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"owner\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"pool\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IHegicOperationalTreasury\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"priceProvider\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract AggregatorV3Interface\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"pricer\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"optionID\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"profitOf\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[],\\\\"name\\\\":\\\\"renounceOwnership\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"setK\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"setLimit\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"contract IPremiumCalculator\\\\",\\\\"name\\\\":\\\\"value\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"setPricer\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"uint256\\\\",\\\\"name\\\\":\\\\"\\\\",\\\\"type\\\\":\\\\"uint256\\\\"}],\\\\"name\\\\":\\\\"strategyData\\\\",\\\\"outputs\\\\":[{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"amount\\\\",\\\\"type\\\\":\\\\"uint128\\\\"},{\\\\"internalType\\\\":\\\\"uint128\\\\",\\\\"name\\\\":\\\\"strike\\\\",\\\\"type\\\\":\\\\"uint128\\\\"}],\\\\"stateMutability\\\\":\\\\"view\\\\",\\\\"type\\\\":\\\\"function\\\\"},{\\\\"inputs\\\\":[{\\\\"internalType\\\\":\\\\"address\\\\",\\\\"name\\\\":\\\\"newOwner\\\\",\\\\"type\\\\":\\\\"address\\\\"}],\\\\"name\\\\":\\\\"transferOwnership\\\\",\\\\"outputs\\\\":[],\\\\"stateMutability\\\\":\\\\"nonpayable\\\\",\\\\"type\\\\":\\\\"function\\\\"}],\\\\"devdoc\\\\":{\\\\"kind\\\\":\\\\"dev\\\\",\\\\"methods\\\\":{\\\\"buy(address,uint32,uint128,uint256)\\\\":{\\\\"params\\\\":{\\\\"amount\\\\":\\\\"The option/strategy amount\\\\",\\\\"holder\\\\":\\\\"The holder address\\\\",\\\\"period\\\\":\\\\"The option/strategy period\\\\",\\\\"strike\\\\":\\\\"The option/strategy strike*\\\\"}},\\\\"exercise(uint256)\\\\":{\\\\"params\\\\":{\\\\"optionID\\\\":\\\\"The option/strategy ID*\\\\"}},\\\\"owner()\\\\":{\\\\"details\\\\":\\\\"Returns the address of the current owner.\\\\"},\\\\"profitOf(uint256)\\\\":{\\\\"params\\\\":{\\\\"amount\\\\":\\\\"The unrealized profits amount*\\\\",\\\\"optionID\\\\":\\\\"The option/strategy ID\\\\"}},\\\\"renounceOwnership()\\\\":{\\\\"details\\\\":\\\\"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.\\\\"},\\\\"setK(uint256)\\\\":{\\\\"params\\\\":{\\\\"value\\\\":\\\\"The collateralization coefficient*\\\\"}},\\\\"setLimit(uint256)\\\\":{\\\\"params\\\\":{\\\\"value\\\\":\\\\"The maximum locked liquidity*\\\\"}},\\\\"transferOwnership(address)\\\\":{\\\\"details\\\\":\\\\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\\\\"}},\\\\"version\\\\":1},\\\\"userdoc\\\\":{\\\\"kind\\\\":\\\\"user\\\\",\\\\"methods\\\\":{\\\\"buy(address,uint32,uint128,uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for buying options/strategies\\\\"},\\\\"exercise(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for exercising an in-the-money option/strategy and taking profits\\\\"},\\\\"getLockedByStrategy()\\\\":{\\\\"notice\\\\":\\\\"Used for viewing the total liquidity locked up for a specific options strategy*\\\\"},\\\\"profitOf(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for calculating the holder\\\'s option/strategy unrealized profits\\\\"},\\\\"setK(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for setting the collateralization coefficient\\\\"},\\\\"setLimit(uint256)\\\\":{\\\\"notice\\\\":\\\\"Used for setting a limit on the total locked liquidity\\\\"}},\\\\"version\\\\":1}},\\\\"settings\\\\":{\\\\"compilationTarget\\\\":{\\\\"contracts/Strategies/HegicStrategyPut.sol\\\\":\\\\"HegicStrategyPut\\\\"},\\\\"evmVersion\\\\":\\\\"berlin\\\\",\\\\"libraries\\\\":{},\\\\"metadata\\\\":{\\\\"bytecodeHash\\\\":\\\\"ipfs\\\\",\\\\"useLiteralContent\\\\":true},\\\\"optimizer\\\\":{\\\\"enabled\\\\":true,\\\\"runs\\\\":200},\\\\"remappings\\\\":[]},\\\\"sources\\\\":{\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\npragma solidity >=0.7.0;\\\\\\\\n\\\\\\\\ninterface AggregatorV3Interface {\\\\\\\\n\\\\\\\\n function decimals() external view returns (uint8);\\\\\\\\n function description() external view returns (string memory);\\\\\\\\n function version() external view returns (uint256);\\\\\\\\n\\\\\\\\n // getRoundData and latestRoundData should both raise \\\\\\\\\\\\"No data present\\\\\\\\\\\\"\\\\\\\\n // if they do not have data to report, instead of returning unset values\\\\\\\\n // which could be misinterpreted as actual reported values.\\\\\\\\n function getRoundData(uint80 _roundId)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n uint80 roundId,\\\\\\\\n int256 answer,\\\\\\\\n uint256 startedAt,\\\\\\\\n uint256 updatedAt,\\\\\\\\n uint80 answeredInRound\\\\\\\\n );\\\\\\\\n function latestRoundData()\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n uint80 roundId,\\\\\\\\n int256 answer,\\\\\\\\n uint256 startedAt,\\\\\\\\n uint256 updatedAt,\\\\\\\\n uint80 answeredInRound\\\\\\\\n );\\\\\\\\n\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x78af5c13ec137bdbb22ec9d65c730fb6f138d3a61a3fdbb63be4838ce7faf2a6\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/access/Ownable.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module which provides a basic access control mechanism, where\\\\\\\\n * there is an account (an owner) that can be granted exclusive access to\\\\\\\\n * specific functions.\\\\\\\\n *\\\\\\\\n * By default, the owner account will be the one that deploys the contract. This\\\\\\\\n * can later be changed with {transferOwnership}.\\\\\\\\n *\\\\\\\\n * This module is used through inheritance. It will make available the modifier\\\\\\\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\\\\\\\n * the owner.\\\\\\\\n */\\\\\\\\nabstract contract Ownable is Context {\\\\\\\\n address private _owner;\\\\\\\\n\\\\\\\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Initializes the contract setting the deployer as the initial owner.\\\\\\\\n */\\\\\\\\n constructor() {\\\\\\\\n _setOwner(_msgSender());\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the address of the current owner.\\\\\\\\n */\\\\\\\\n function owner() public view virtual returns (address) {\\\\\\\\n return _owner;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Throws if called by any account other than the owner.\\\\\\\\n */\\\\\\\\n modifier onlyOwner() {\\\\\\\\n require(owner() == _msgSender(), \\\\\\\\\\\\"Ownable: caller is not the owner\\\\\\\\\\\\");\\\\\\\\n _;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Leaves the contract without owner. It will not be possible to call\\\\\\\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\\\\\\\n *\\\\\\\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\\\\\\\n * thereby removing any functionality that is only available to the owner.\\\\\\\\n */\\\\\\\\n function renounceOwnership() public virtual onlyOwner {\\\\\\\\n _setOwner(address(0));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\\\\\\\n * Can only be called by the current owner.\\\\\\\\n */\\\\\\\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\\\\\\\n require(newOwner != address(0), \\\\\\\\\\\\"Ownable: new owner is the zero address\\\\\\\\\\\\");\\\\\\\\n _setOwner(newOwner);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _setOwner(address newOwner) private {\\\\\\\\n address oldOwner = _owner;\\\\\\\\n _owner = newOwner;\\\\\\\\n emit OwnershipTransferred(oldOwner, newOwner);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x6bb804a310218875e89d12c053e94a13a4607cdf7cc2052f3e52bd32a0dc50a1\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Contract module that helps prevent reentrant calls to a function.\\\\\\\\n *\\\\\\\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\\\\\\\n * available, which can be applied to functions to make sure there are no nested\\\\\\\\n * (reentrant) calls to them.\\\\\\\\n *\\\\\\\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\\\\\\\n * `nonReentrant` may not call one another. This can be worked around by making\\\\\\\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\\\\\\\n * points to them.\\\\\\\\n *\\\\\\\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\\\\\\\n * to protect against it, check out our blog post\\\\\\\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\\\\\\\n */\\\\\\\\nabstract contract ReentrancyGuard {\\\\\\\\n // Booleans are more expensive than uint256 or any type that takes up a full\\\\\\\\n // word because each write operation emits an extra SLOAD to first read the\\\\\\\\n // slot\\\'s contents, replace the bits taken up by the boolean, and then write\\\\\\\\n // back. This is the compiler\\\'s defense against contract upgrades and\\\\\\\\n // pointer aliasing, and it cannot be disabled.\\\\\\\\n\\\\\\\\n // The values being non-zero value makes deployment a bit more expensive,\\\\\\\\n // but in exchange the refund on every call to nonReentrant will be lower in\\\\\\\\n // amount. Since refunds are capped to a percentage of the total\\\\\\\\n // transaction\\\'s gas, it is best to keep them low in cases like this one, to\\\\\\\\n // increase the likelihood of the full refund coming into effect.\\\\\\\\n uint256 private constant _NOT_ENTERED = 1;\\\\\\\\n uint256 private constant _ENTERED = 2;\\\\\\\\n\\\\\\\\n uint256 private _status;\\\\\\\\n\\\\\\\\n constructor() {\\\\\\\\n _status = _NOT_ENTERED;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\\\\\\\n * Calling a `nonReentrant` function from another `nonReentrant`\\\\\\\\n * function is not supported. It is possible to prevent this from happening\\\\\\\\n * by making the `nonReentrant` function external, and make it call a\\\\\\\\n * `private` function that does the actual work.\\\\\\\\n */\\\\\\\\n modifier nonReentrant() {\\\\\\\\n // On the first call to nonReentrant, _notEntered will be true\\\\\\\\n require(_status != _ENTERED, \\\\\\\\\\\\"ReentrancyGuard: reentrant call\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n // Any calls to nonReentrant after this point will fail\\\\\\\\n _status = _ENTERED;\\\\\\\\n\\\\\\\\n _;\\\\\\\\n\\\\\\\\n // By storing the original value once again, a refund is triggered (see\\\\\\\\n // https://eips.ethereum.org/EIPS/eip-2200)\\\\\\\\n _status = _NOT_ENTERED;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./extensions/IERC20Metadata.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of the {IERC20} interface.\\\\\\\\n *\\\\\\\\n * This implementation is agnostic to the way tokens are created. This means\\\\\\\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\\\\\\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\\\\\\\n *\\\\\\\\n * TIP: For a detailed writeup see our guide\\\\\\\\n * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How\\\\\\\\n * to implement supply mechanisms].\\\\\\\\n *\\\\\\\\n * We have followed general OpenZeppelin guidelines: functions revert instead\\\\\\\\n * of returning `false` on failure. This behavior is nonetheless conventional\\\\\\\\n * and does not conflict with the expectations of ERC20 applications.\\\\\\\\n *\\\\\\\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\\\\\\\n * This allows applications to reconstruct the allowance for all accounts just\\\\\\\\n * by listening to said events. Other implementations of the EIP may not emit\\\\\\\\n * these events, as it isn\\\'t required by the specification.\\\\\\\\n *\\\\\\\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\\\\\\\n * functions have been added to mitigate the well-known issues around setting\\\\\\\\n * allowances. See {IERC20-approve}.\\\\\\\\n */\\\\\\\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\\\\\\\n mapping(address => uint256) private _balances;\\\\\\\\n\\\\\\\\n mapping(address => mapping(address => uint256)) private _allowances;\\\\\\\\n\\\\\\\\n uint256 private _totalSupply;\\\\\\\\n\\\\\\\\n string private _name;\\\\\\\\n string private _symbol;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets the values for {name} and {symbol}.\\\\\\\\n *\\\\\\\\n * The default value of {decimals} is 18. To select a different value for\\\\\\\\n * {decimals} you should overload it.\\\\\\\\n *\\\\\\\\n * All two of these values are immutable: they can only be set once during\\\\\\\\n * construction.\\\\\\\\n */\\\\\\\\n constructor(string memory name_, string memory symbol_) {\\\\\\\\n _name = name_;\\\\\\\\n _symbol = symbol_;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the name of the token.\\\\\\\\n */\\\\\\\\n function name() public view virtual override returns (string memory) {\\\\\\\\n return _name;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the symbol of the token, usually a shorter version of the\\\\\\\\n * name.\\\\\\\\n */\\\\\\\\n function symbol() public view virtual override returns (string memory) {\\\\\\\\n return _symbol;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the number of decimals used to get its user representation.\\\\\\\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\\\\\\\n * be displayed to a user as `5,05` (`505 / 10 ** 2`).\\\\\\\\n *\\\\\\\\n * Tokens usually opt for a value of 18, imitating the relationship between\\\\\\\\n * Ether and Wei. This is the value {ERC20} uses, unless this function is\\\\\\\\n * overridden;\\\\\\\\n *\\\\\\\\n * NOTE: This information is only used for _display_ purposes: it in\\\\\\\\n * no way affects any of the arithmetic of the contract, including\\\\\\\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\\\\\\\n */\\\\\\\\n function decimals() public view virtual override returns (uint8) {\\\\\\\\n return 18;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-totalSupply}.\\\\\\\\n */\\\\\\\\n function totalSupply() public view virtual override returns (uint256) {\\\\\\\\n return _totalSupply;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-balanceOf}.\\\\\\\\n */\\\\\\\\n function balanceOf(address account) public view virtual override returns (uint256) {\\\\\\\\n return _balances[account];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-transfer}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `recipient` cannot be the zero address.\\\\\\\\n * - the caller must have a balance of at least `amount`.\\\\\\\\n */\\\\\\\\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\\\\\\\\n _transfer(_msgSender(), recipient, amount);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-allowance}.\\\\\\\\n */\\\\\\\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\\\\\\\n return _allowances[owner][spender];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\\\\\\\n _approve(_msgSender(), spender, amount);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC20-transferFrom}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance. This is not\\\\\\\\n * required by the EIP. See the note at the beginning of {ERC20}.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `sender` and `recipient` cannot be the zero address.\\\\\\\\n * - `sender` must have a balance of at least `amount`.\\\\\\\\n * - the caller must have allowance for ``sender``\\\'s tokens of at least\\\\\\\\n * `amount`.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) public virtual override returns (bool) {\\\\\\\\n _transfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n uint256 currentAllowance = _allowances[sender][_msgSender()];\\\\\\\\n require(currentAllowance >= amount, \\\\\\\\\\\\"ERC20: transfer amount exceeds allowance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _approve(sender, _msgSender(), currentAllowance - amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\\\\\\\n *\\\\\\\\n * This is an alternative to {approve} that can be used as a mitigation for\\\\\\\\n * problems described in {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\\\\\\\n _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\\\\\\\n *\\\\\\\\n * This is an alternative to {approve} that can be used as a mitigation for\\\\\\\\n * problems described in {IERC20-approve}.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event indicating the updated allowance.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n * - `spender` must have allowance for the caller of at least\\\\\\\\n * `subtractedValue`.\\\\\\\\n */\\\\\\\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\\\\\\\n uint256 currentAllowance = _allowances[_msgSender()][spender];\\\\\\\\n require(currentAllowance >= subtractedValue, \\\\\\\\\\\\"ERC20: decreased allowance below zero\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _approve(_msgSender(), spender, currentAllowance - subtractedValue);\\\\\\\\n }\\\\\\\\n\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` of tokens from `sender` to `recipient`.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to {transfer}, and can be used to\\\\\\\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `sender` cannot be the zero address.\\\\\\\\n * - `recipient` cannot be the zero address.\\\\\\\\n * - `sender` must have a balance of at least `amount`.\\\\\\\\n */\\\\\\\\n function _transfer(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {\\\\\\\\n require(sender != address(0), \\\\\\\\\\\\"ERC20: transfer from the zero address\\\\\\\\\\\\");\\\\\\\\n require(recipient != address(0), \\\\\\\\\\\\"ERC20: transfer to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n uint256 senderBalance = _balances[sender];\\\\\\\\n require(senderBalance >= amount, \\\\\\\\\\\\"ERC20: transfer amount exceeds balance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _balances[sender] = senderBalance - amount;\\\\\\\\n }\\\\\\\\n _balances[recipient] += amount;\\\\\\\\n\\\\\\\\n emit Transfer(sender, recipient, amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(sender, recipient, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\\\\\\\n * the total supply.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event with `from` set to the zero address.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `account` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function _mint(address account, uint256 amount) internal virtual {\\\\\\\\n require(account != address(0), \\\\\\\\\\\\"ERC20: mint to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(address(0), account, amount);\\\\\\\\n\\\\\\\\n _totalSupply += amount;\\\\\\\\n _balances[account] += amount;\\\\\\\\n emit Transfer(address(0), account, amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(address(0), account, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Destroys `amount` tokens from `account`, reducing the\\\\\\\\n * total supply.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event with `to` set to the zero address.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `account` cannot be the zero address.\\\\\\\\n * - `account` must have at least `amount` tokens.\\\\\\\\n */\\\\\\\\n function _burn(address account, uint256 amount) internal virtual {\\\\\\\\n require(account != address(0), \\\\\\\\\\\\"ERC20: burn from the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(account, address(0), amount);\\\\\\\\n\\\\\\\\n uint256 accountBalance = _balances[account];\\\\\\\\n require(accountBalance >= amount, \\\\\\\\\\\\"ERC20: burn amount exceeds balance\\\\\\\\\\\\");\\\\\\\\n unchecked {\\\\\\\\n _balances[account] = accountBalance - amount;\\\\\\\\n }\\\\\\\\n _totalSupply -= amount;\\\\\\\\n\\\\\\\\n emit Transfer(account, address(0), amount);\\\\\\\\n\\\\\\\\n _afterTokenTransfer(account, address(0), amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to `approve`, and can be used to\\\\\\\\n * e.g. set automatic allowances for certain subsystems, etc.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `owner` cannot be the zero address.\\\\\\\\n * - `spender` cannot be the zero address.\\\\\\\\n */\\\\\\\\n function _approve(\\\\\\\\n address owner,\\\\\\\\n address spender,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC20: approve from the zero address\\\\\\\\\\\\");\\\\\\\\n require(spender != address(0), \\\\\\\\\\\\"ERC20: approve to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _allowances[owner][spender] = amount;\\\\\\\\n emit Approval(owner, spender, amount);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called before any transfer of tokens. This includes\\\\\\\\n * minting and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\\\'s tokens\\\\\\\\n * will be transferred to `to`.\\\\\\\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\\\\\\\n * - when `to` is zero, `amount` of ``from``\\\'s tokens will be burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _beforeTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {}\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called after any transfer of tokens. This includes\\\\\\\\n * minting and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - when `from` and `to` are both non-zero, `amount` of ``from``\\\'s tokens\\\\\\\\n * has been transferred to `to`.\\\\\\\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\\\\\\\n * - when `to` is zero, `amount` of ``from``\\\'s tokens have been burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _afterTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 amount\\\\\\\\n ) internal virtual {}\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x418cfe64226a974419f8ab7287ad4bb413156a4d7af8ab5d9bcaa5678d1a2f22\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\\\\\\\n */\\\\\\\\ninterface IERC20 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the amount of tokens in existence.\\\\\\\\n */\\\\\\\\n function totalSupply() external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the amount of tokens owned by `account`.\\\\\\\\n */\\\\\\\\n function balanceOf(address account) external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` tokens from the caller\\\'s account to `recipient`.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transfer(address recipient, uint256 amount) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the remaining number of tokens that `spender` will be\\\\\\\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\\\\\\\n * zero by default.\\\\\\\\n *\\\\\\\\n * This value changes when {approve} or {transferFrom} are called.\\\\\\\\n */\\\\\\\\n function allowance(address owner, address spender) external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Sets `amount` as the allowance of `spender` over the caller\\\'s tokens.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\\\\\\\n * that someone may use both the old and the new allowance by unfortunate\\\\\\\\n * transaction ordering. One possible solution to mitigate this race\\\\\\\\n * condition is to first reduce the spender\\\'s allowance to 0 and set the\\\\\\\\n * desired value afterwards:\\\\\\\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n */\\\\\\\\n function approve(address spender, uint256 amount) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Moves `amount` tokens from `sender` to `recipient` using the\\\\\\\\n * allowance mechanism. `amount` is then deducted from the caller\\\'s\\\\\\\\n * allowance.\\\\\\\\n *\\\\\\\\n * Returns a boolean value indicating whether the operation succeeded.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address sender,\\\\\\\\n address recipient,\\\\\\\\n uint256 amount\\\\\\\\n ) external returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\\\\\\\n * another (`to`).\\\\\\\\n *\\\\\\\\n * Note that `value` may be zero.\\\\\\\\n */\\\\\\\\n event Transfer(address indexed from, address indexed to, uint256 value);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\\\\\\\n * a call to {approve}. `value` is the new allowance.\\\\\\\\n */\\\\\\\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC20.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\\\\\\\n *\\\\\\\\n * _Available since v4.1._\\\\\\\\n */\\\\\\\\ninterface IERC20Metadata is IERC20 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the name of the token.\\\\\\\\n */\\\\\\\\n function name() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the symbol of the token.\\\\\\\\n */\\\\\\\\n function symbol() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the decimals places of the token.\\\\\\\\n */\\\\\\\\n function decimals() external view returns (uint8);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../../utils/Address.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title SafeERC20\\\\\\\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\\\\\\\n * contract returns false). Tokens that return no value (and instead revert or\\\\\\\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\\\\\\\n * successful.\\\\\\\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\\\\\\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\\\\\\\n */\\\\\\\\nlibrary SafeERC20 {\\\\\\\\n using Address for address;\\\\\\\\n\\\\\\\\n function safeTransfer(\\\\\\\\n IERC20 token,\\\\\\\\n address to,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeTransferFrom(\\\\\\\\n IERC20 token,\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Deprecated. This function has issues similar to the ones found in\\\\\\\\n * {IERC20-approve}, and its usage is discouraged.\\\\\\\\n *\\\\\\\\n * Whenever possible, use {safeIncreaseAllowance} and\\\\\\\\n * {safeDecreaseAllowance} instead.\\\\\\\\n */\\\\\\\\n function safeApprove(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n // safeApprove should only be called when setting an initial allowance,\\\\\\\\n // or when resetting it to zero. To increase and decrease it, use\\\\\\\\n // \\\'safeIncreaseAllowance\\\' and \\\'safeDecreaseAllowance\\\'\\\\\\\\n require(\\\\\\\\n (value == 0) || (token.allowance(address(this), spender) == 0),\\\\\\\\n \\\\\\\\\\\\"SafeERC20: approve from non-zero to non-zero allowance\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeIncreaseAllowance(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n uint256 newAllowance = token.allowance(address(this), spender) + value;\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function safeDecreaseAllowance(\\\\\\\\n IERC20 token,\\\\\\\\n address spender,\\\\\\\\n uint256 value\\\\\\\\n ) internal {\\\\\\\\n unchecked {\\\\\\\\n uint256 oldAllowance = token.allowance(address(this), spender);\\\\\\\\n require(oldAllowance >= value, \\\\\\\\\\\\"SafeERC20: decreased allowance below zero\\\\\\\\\\\\");\\\\\\\\n uint256 newAllowance = oldAllowance - value;\\\\\\\\n _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\\\\\\\n * on the return value: the return value is optional (but if data is returned, it must not be false).\\\\\\\\n * @param token The token targeted by the call.\\\\\\\\n * @param data The call data (encoded using abi.encode or one of its variants).\\\\\\\\n */\\\\\\\\n function _callOptionalReturn(IERC20 token, bytes memory data) private {\\\\\\\\n // We need to perform a low level call here, to bypass Solidity\\\'s return data size checking mechanism, since\\\\\\\\n // we\\\'re implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\\\\\\\n // the target address contains contract code and also asserts for success in the low-level call.\\\\\\\\n\\\\\\\\n bytes memory returndata = address(token).functionCall(data, \\\\\\\\\\\\"SafeERC20: low-level call failed\\\\\\\\\\\\");\\\\\\\\n if (returndata.length > 0) {\\\\\\\\n // Return data is optional\\\\\\\\n require(abi.decode(returndata, (bool)), \\\\\\\\\\\\"SafeERC20: ERC20 operation did not succeed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC721.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./IERC721Receiver.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./extensions/IERC721Metadata.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Address.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Context.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/Strings.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../../utils/introspection/ERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\\\\\\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\\\\\\\n * {ERC721Enumerable}.\\\\\\\\n */\\\\\\\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\\\\\\\n using Address for address;\\\\\\\\n using Strings for uint256;\\\\\\\\n\\\\\\\\n // Token name\\\\\\\\n string private _name;\\\\\\\\n\\\\\\\\n // Token symbol\\\\\\\\n string private _symbol;\\\\\\\\n\\\\\\\\n // Mapping from token ID to owner address\\\\\\\\n mapping(uint256 => address) private _owners;\\\\\\\\n\\\\\\\\n // Mapping owner address to token count\\\\\\\\n mapping(address => uint256) private _balances;\\\\\\\\n\\\\\\\\n // Mapping from token ID to approved address\\\\\\\\n mapping(uint256 => address) private _tokenApprovals;\\\\\\\\n\\\\\\\\n // Mapping from owner to operator approvals\\\\\\\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\\\\\\\n */\\\\\\\\n constructor(string memory name_, string memory symbol_) {\\\\\\\\n _name = name_;\\\\\\\\n _symbol = symbol_;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\\\\\\\n return\\\\\\\\n interfaceId == type(IERC721).interfaceId ||\\\\\\\\n interfaceId == type(IERC721Metadata).interfaceId ||\\\\\\\\n super.supportsInterface(interfaceId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-balanceOf}.\\\\\\\\n */\\\\\\\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC721: balance query for the zero address\\\\\\\\\\\\");\\\\\\\\n return _balances[owner];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-ownerOf}.\\\\\\\\n */\\\\\\\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\\\\\\\n address owner = _owners[tokenId];\\\\\\\\n require(owner != address(0), \\\\\\\\\\\\"ERC721: owner query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n return owner;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-name}.\\\\\\\\n */\\\\\\\\n function name() public view virtual override returns (string memory) {\\\\\\\\n return _name;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-symbol}.\\\\\\\\n */\\\\\\\\n function symbol() public view virtual override returns (string memory) {\\\\\\\\n return _symbol;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721Metadata-tokenURI}.\\\\\\\\n */\\\\\\\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721Metadata: URI query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n string memory baseURI = _baseURI();\\\\\\\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\\\\\\\\\\"\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\\\\\\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\\\\\\\n * by default, can be overriden in child contracts.\\\\\\\\n */\\\\\\\\n function _baseURI() internal view virtual returns (string memory) {\\\\\\\\n return \\\\\\\\\\\\"\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-approve}.\\\\\\\\n */\\\\\\\\n function approve(address to, uint256 tokenId) public virtual override {\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n require(to != owner, \\\\\\\\\\\\"ERC721: approval to current owner\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n require(\\\\\\\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\\\\\\\n \\\\\\\\\\\\"ERC721: approve caller is not owner nor approved for all\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n _approve(to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-getApproved}.\\\\\\\\n */\\\\\\\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721: approved query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n return _tokenApprovals[tokenId];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-setApprovalForAll}.\\\\\\\\n */\\\\\\\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\\\\\\\n require(operator != _msgSender(), \\\\\\\\\\\\"ERC721: approve to caller\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _operatorApprovals[_msgSender()][operator] = approved;\\\\\\\\n emit ApprovalForAll(_msgSender(), operator, approved);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-isApprovedForAll}.\\\\\\\\n */\\\\\\\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\\\\\\\n return _operatorApprovals[owner][operator];\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-transferFrom}.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) public virtual override {\\\\\\\\n //solhint-disable-next-line max-line-length\\\\\\\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\\\\\\\\\\"ERC721: transfer caller is not owner nor approved\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _transfer(from, to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-safeTransferFrom}.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) public virtual override {\\\\\\\\n safeTransferFrom(from, to, tokenId, \\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev See {IERC721-safeTransferFrom}.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) public virtual override {\\\\\\\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\\\\\\\\\\"ERC721: transfer caller is not owner nor approved\\\\\\\\\\\\");\\\\\\\\n _safeTransfer(from, to, tokenId, _data);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\\\\\\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\\\\\\\n *\\\\\\\\n * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\\\\\\\n *\\\\\\\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\\\\\\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _safeTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) internal virtual {\\\\\\\\n _transfer(from, to, tokenId);\\\\\\\\n require(_checkOnERC721Received(from, to, tokenId, _data), \\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns whether `tokenId` exists.\\\\\\\\n *\\\\\\\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\\\\\\\n *\\\\\\\\n * Tokens start existing when they are minted (`_mint`),\\\\\\\\n * and stop existing when they are burned (`_burn`).\\\\\\\\n */\\\\\\\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\\\\\\\n return _owners[tokenId] != address(0);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\\\\\\\n require(_exists(tokenId), \\\\\\\\\\\\"ERC721: operator query for nonexistent token\\\\\\\\\\\\");\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must not exist.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\\\\\\\n _safeMint(to, tokenId, \\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\\\\\\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\\\\\\\n */\\\\\\\\n function _safeMint(\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) internal virtual {\\\\\\\\n _mint(to, tokenId);\\\\\\\\n require(\\\\\\\\n _checkOnERC721Received(address(0), to, tokenId, _data),\\\\\\\\n \\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Mints `tokenId` and transfers it to `to`.\\\\\\\\n *\\\\\\\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must not exist.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _mint(address to, uint256 tokenId) internal virtual {\\\\\\\\n require(to != address(0), \\\\\\\\\\\\"ERC721: mint to the zero address\\\\\\\\\\\\");\\\\\\\\n require(!_exists(tokenId), \\\\\\\\\\\\"ERC721: token already minted\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(address(0), to, tokenId);\\\\\\\\n\\\\\\\\n _balances[to] += 1;\\\\\\\\n _owners[tokenId] = to;\\\\\\\\n\\\\\\\\n emit Transfer(address(0), to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Destroys `tokenId`.\\\\\\\\n * The approval is cleared when the token is burned.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _burn(uint256 tokenId) internal virtual {\\\\\\\\n address owner = ERC721.ownerOf(tokenId);\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(owner, address(0), tokenId);\\\\\\\\n\\\\\\\\n // Clear approvals\\\\\\\\n _approve(address(0), tokenId);\\\\\\\\n\\\\\\\\n _balances[owner] -= 1;\\\\\\\\n delete _owners[tokenId];\\\\\\\\n\\\\\\\\n emit Transfer(owner, address(0), tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers `tokenId` from `from` to `to`.\\\\\\\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must be owned by `from`.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function _transfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) internal virtual {\\\\\\\\n require(ERC721.ownerOf(tokenId) == from, \\\\\\\\\\\\"ERC721: transfer of token that is not own\\\\\\\\\\\\");\\\\\\\\n require(to != address(0), \\\\\\\\\\\\"ERC721: transfer to the zero address\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n _beforeTokenTransfer(from, to, tokenId);\\\\\\\\n\\\\\\\\n // Clear approvals from the previous owner\\\\\\\\n _approve(address(0), tokenId);\\\\\\\\n\\\\\\\\n _balances[from] -= 1;\\\\\\\\n _balances[to] += 1;\\\\\\\\n _owners[tokenId] = to;\\\\\\\\n\\\\\\\\n emit Transfer(from, to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Approve `to` to operate on `tokenId`\\\\\\\\n *\\\\\\\\n * Emits a {Approval} event.\\\\\\\\n */\\\\\\\\n function _approve(address to, uint256 tokenId) internal virtual {\\\\\\\\n _tokenApprovals[tokenId] = to;\\\\\\\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\\\\\\\n * The call is not executed if the target address is not a contract.\\\\\\\\n *\\\\\\\\n * @param from address representing the previous owner of the given token ID\\\\\\\\n * @param to target address that will receive the tokens\\\\\\\\n * @param tokenId uint256 ID of the token to be transferred\\\\\\\\n * @param _data bytes optional data to send along with the call\\\\\\\\n * @return bool whether the call correctly returned the expected magic value\\\\\\\\n */\\\\\\\\n function _checkOnERC721Received(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes memory _data\\\\\\\\n ) private returns (bool) {\\\\\\\\n if (to.isContract()) {\\\\\\\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {\\\\\\\\n return retval == IERC721Receiver(to).onERC721Received.selector;\\\\\\\\n } catch (bytes memory reason) {\\\\\\\\n if (reason.length == 0) {\\\\\\\\n revert(\\\\\\\\\\\\"ERC721: transfer to non ERC721Receiver implementer\\\\\\\\\\\\");\\\\\\\\n } else {\\\\\\\\n assembly {\\\\\\\\n revert(add(32, reason), mload(reason))\\\\\\\\n }\\\\\\\\n }\\\\\\\\n }\\\\\\\\n } else {\\\\\\\\n return true;\\\\\\\\n }\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Hook that is called before any token transfer. This includes minting\\\\\\\\n * and burning.\\\\\\\\n *\\\\\\\\n * Calling conditions:\\\\\\\\n *\\\\\\\\n * - When `from` and `to` are both non-zero, ``from``\\\'s `tokenId` will be\\\\\\\\n * transferred to `to`.\\\\\\\\n * - When `from` is zero, `tokenId` will be minted for `to`.\\\\\\\\n * - When `to` is zero, ``from``\\\'s `tokenId` will be burned.\\\\\\\\n * - `from` and `to` are never both zero.\\\\\\\\n *\\\\\\\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\\\\\\\n */\\\\\\\\n function _beforeTokenTransfer(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) internal virtual {}\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd644260d8e4e64563a7adba96d774dbaac6ae89c2ee58ef49a19850ff1239b08\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../../utils/introspection/IERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Required interface of an ERC721 compliant contract.\\\\\\\\n */\\\\\\\\ninterface IERC721 is IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\\\\\\\n */\\\\\\\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\\\\\\\n */\\\\\\\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\\\\\\\n */\\\\\\\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the number of tokens in ``owner``\\\'s account.\\\\\\\\n */\\\\\\\\n function balanceOf(address owner) external view returns (uint256 balance);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the owner of the `tokenId` token.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\\\\\\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Transfers `tokenId` token from `from` to `to`.\\\\\\\\n *\\\\\\\\n * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function transferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\\\\\\\n * The approval is cleared when the token is transferred.\\\\\\\\n *\\\\\\\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - The caller must own the token or be an approved operator.\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n *\\\\\\\\n * Emits an {Approval} event.\\\\\\\\n */\\\\\\\\n function approve(address to, uint256 tokenId) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the account approved for `tokenId` token.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `tokenId` must exist.\\\\\\\\n */\\\\\\\\n function getApproved(uint256 tokenId) external view returns (address operator);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Approve or remove `operator` as an operator for the caller.\\\\\\\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - The `operator` cannot be the caller.\\\\\\\\n *\\\\\\\\n * Emits an {ApprovalForAll} event.\\\\\\\\n */\\\\\\\\n function setApprovalForAll(address operator, bool _approved) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\\\\\\\n *\\\\\\\\n * See {setApprovalForAll}\\\\\\\\n */\\\\\\\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `from` cannot be the zero address.\\\\\\\\n * - `to` cannot be the zero address.\\\\\\\\n * - `tokenId` token must exist and be owned by `from`.\\\\\\\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\\\\\\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\\\\\\\n *\\\\\\\\n * Emits a {Transfer} event.\\\\\\\\n */\\\\\\\\n function safeTransferFrom(\\\\\\\\n address from,\\\\\\\\n address to,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes calldata data\\\\\\\\n ) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xf101e8720213560fab41104d53b3cc7ba0456ef3a98455aa7f022391783144a0\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title ERC721 token receiver interface\\\\\\\\n * @dev Interface for any contract that wants to support safeTransfers\\\\\\\\n * from ERC721 asset contracts.\\\\\\\\n */\\\\\\\\ninterface IERC721Receiver {\\\\\\\\n /**\\\\\\\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\\\\\\\n * by `operator` from `from`, this function is called.\\\\\\\\n *\\\\\\\\n * It must return its Solidity selector to confirm the token transfer.\\\\\\\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\\\\\\\n *\\\\\\\\n * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\\\\\\\n */\\\\\\\\n function onERC721Received(\\\\\\\\n address operator,\\\\\\\\n address from,\\\\\\\\n uint256 tokenId,\\\\\\\\n bytes calldata data\\\\\\\\n ) external returns (bytes4);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd9517254724276e2e8de3769183c1f738f445f0095c26fd9b86d3c6687e887b9\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"../IERC721.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\\\\\\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\\\\\\\n */\\\\\\\\ninterface IERC721Metadata is IERC721 {\\\\\\\\n /**\\\\\\\\n * @dev Returns the token collection name.\\\\\\\\n */\\\\\\\\n function name() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the token collection symbol.\\\\\\\\n */\\\\\\\\n function symbol() external view returns (string memory);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\\\\\\\n */\\\\\\\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xd32fb7f530a914b1083d10a6bed3a586f2451952fec04fe542bcc670a82f7ba5\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Address.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Collection of functions related to the address type\\\\\\\\n */\\\\\\\\nlibrary Address {\\\\\\\\n /**\\\\\\\\n * @dev Returns true if `account` is a contract.\\\\\\\\n *\\\\\\\\n * [IMPORTANT]\\\\\\\\n * ====\\\\\\\\n * It is unsafe to assume that an address for which this function returns\\\\\\\\n * false is an externally-owned account (EOA) and not a contract.\\\\\\\\n *\\\\\\\\n * Among others, `isContract` will return false for the following\\\\\\\\n * types of addresses:\\\\\\\\n *\\\\\\\\n * - an externally-owned account\\\\\\\\n * - a contract in construction\\\\\\\\n * - an address where a contract will be created\\\\\\\\n * - an address where a contract lived, but was destroyed\\\\\\\\n * ====\\\\\\\\n */\\\\\\\\n function isContract(address account) internal view returns (bool) {\\\\\\\\n // This method relies on extcodesize, which returns 0 for contracts in\\\\\\\\n // construction, since the code is only stored at the end of the\\\\\\\\n // constructor execution.\\\\\\\\n\\\\\\\\n uint256 size;\\\\\\\\n assembly {\\\\\\\\n size := extcodesize(account)\\\\\\\\n }\\\\\\\\n return size > 0;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Replacement for Solidity\\\'s `transfer`: sends `amount` wei to\\\\\\\\n * `recipient`, forwarding all available gas and reverting on errors.\\\\\\\\n *\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\\\\\\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\\\\\\\n * imposed by `transfer`, making them unable to receive funds via\\\\\\\\n * `transfer`. {sendValue} removes this limitation.\\\\\\\\n *\\\\\\\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\\\\\\\n *\\\\\\\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\\\\\\\n * taken to not create reentrancy vulnerabilities. Consider using\\\\\\\\n * {ReentrancyGuard} or the\\\\\\\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\\\\\\\n */\\\\\\\\n function sendValue(address payable recipient, uint256 amount) internal {\\\\\\\\n require(address(this).balance >= amount, \\\\\\\\\\\\"Address: insufficient balance\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, ) = recipient.call{value: amount}(\\\\\\\\\\\\"\\\\\\\\\\\\");\\\\\\\\n require(success, \\\\\\\\\\\\"Address: unable to send value, recipient may have reverted\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Performs a Solidity function call using a low level `call`. A\\\\\\\\n * plain `call` is an unsafe replacement for a function call: use this\\\\\\\\n * function instead.\\\\\\\\n *\\\\\\\\n * If `target` reverts with a revert reason, it is bubbled up by this\\\\\\\\n * function (like regular Solidity function calls).\\\\\\\\n *\\\\\\\\n * Returns the raw returned data. To convert to the expected return value,\\\\\\\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - `target` must be a contract.\\\\\\\\n * - calling `target` with `data` must not revert.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\\\\\\\n return functionCall(target, data, \\\\\\\\\\\\"Address: low-level call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\\\\\\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n return functionCallWithValue(target, data, 0, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but also transferring `value` wei to `target`.\\\\\\\\n *\\\\\\\\n * Requirements:\\\\\\\\n *\\\\\\\\n * - the calling contract must have an ETH balance of at least `value`.\\\\\\\\n * - the called Solidity function must be `payable`.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCallWithValue(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n uint256 value\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n return functionCallWithValue(target, data, value, \\\\\\\\\\\\"Address: low-level call with value failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\\\\\\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\\\\\\\n *\\\\\\\\n * _Available since v3.1._\\\\\\\\n */\\\\\\\\n function functionCallWithValue(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n uint256 value,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n require(address(this).balance >= value, \\\\\\\\\\\\"Address: insufficient balance for call\\\\\\\\\\\\");\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but performing a static call.\\\\\\\\n *\\\\\\\\n * _Available since v3.3._\\\\\\\\n */\\\\\\\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\\\\\\\n return functionStaticCall(target, data, \\\\\\\\\\\\"Address: low-level static call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\\\\\\\n * but performing a static call.\\\\\\\\n *\\\\\\\\n * _Available since v3.3._\\\\\\\\n */\\\\\\\\n function functionStaticCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal view returns (bytes memory) {\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: static call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.staticcall(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\\\\\\\n * but performing a delegate call.\\\\\\\\n *\\\\\\\\n * _Available since v3.4._\\\\\\\\n */\\\\\\\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\\\\\\\n return functionDelegateCall(target, data, \\\\\\\\\\\\"Address: low-level delegate call failed\\\\\\\\\\\\");\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\\\\\\\n * but performing a delegate call.\\\\\\\\n *\\\\\\\\n * _Available since v3.4._\\\\\\\\n */\\\\\\\\n function functionDelegateCall(\\\\\\\\n address target,\\\\\\\\n bytes memory data,\\\\\\\\n string memory errorMessage\\\\\\\\n ) internal returns (bytes memory) {\\\\\\\\n require(isContract(target), \\\\\\\\\\\\"Address: delegate call to non-contract\\\\\\\\\\\\");\\\\\\\\n\\\\\\\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\\\\\\\n return _verifyCallResult(success, returndata, errorMessage);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _verifyCallResult(\\\\\\\\n bool success,\\\\\\\\n bytes memory returndata,\\\\\\\\n string memory errorMessage\\\\\\\\n ) private pure returns (bytes memory) {\\\\\\\\n if (success) {\\\\\\\\n return returndata;\\\\\\\\n } else {\\\\\\\\n // Look for revert reason and bubble it up if present\\\\\\\\n if (returndata.length > 0) {\\\\\\\\n // The easiest way to bubble the revert reason is using memory via assembly\\\\\\\\n\\\\\\\\n assembly {\\\\\\\\n let returndata_size := mload(returndata)\\\\\\\\n revert(add(32, returndata), returndata_size)\\\\\\\\n }\\\\\\\\n } else {\\\\\\\\n revert(errorMessage);\\\\\\\\n }\\\\\\\\n }\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x3b4820cac4f127869f6eb496c1d74fa6ac86ed24071e0f94742e6aef20e7252c\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Context.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/*\\\\\\\\n * @dev Provides information about the current execution context, including the\\\\\\\\n * sender of the transaction and its data. While these are generally available\\\\\\\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\\\\\\\n * manner, since when dealing with meta-transactions the account sending and\\\\\\\\n * paying for execution may not be the actual sender (as far as an application\\\\\\\\n * is concerned).\\\\\\\\n *\\\\\\\\n * This contract is only required for intermediate, library-like contracts.\\\\\\\\n */\\\\\\\\nabstract contract Context {\\\\\\\\n function _msgSender() internal view virtual returns (address) {\\\\\\\\n return msg.sender;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _msgData() internal view virtual returns (bytes calldata) {\\\\\\\\n return msg.data;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x95098bd1d9c8dec4d80d3dedb88a0d949fa0d740ee99f2aa466bc308216ca6d5\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/Strings.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev String operations.\\\\\\\\n */\\\\\\\\nlibrary Strings {\\\\\\\\n bytes16 private constant _HEX_SYMBOLS = \\\\\\\\\\\\"0123456789abcdef\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\\\\\\\n */\\\\\\\\n function toString(uint256 value) internal pure returns (string memory) {\\\\\\\\n // Inspired by OraclizeAPI\\\'s implementation - MIT licence\\\\\\\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\\\\\\\n\\\\\\\\n if (value == 0) {\\\\\\\\n return \\\\\\\\\\\\"0\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n uint256 temp = value;\\\\\\\\n uint256 digits;\\\\\\\\n while (temp != 0) {\\\\\\\\n digits++;\\\\\\\\n temp /= 10;\\\\\\\\n }\\\\\\\\n bytes memory buffer = new bytes(digits);\\\\\\\\n while (value != 0) {\\\\\\\\n digits -= 1;\\\\\\\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\\\\\\\n value /= 10;\\\\\\\\n }\\\\\\\\n return string(buffer);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\\\\\\\n */\\\\\\\\n function toHexString(uint256 value) internal pure returns (string memory) {\\\\\\\\n if (value == 0) {\\\\\\\\n return \\\\\\\\\\\\"0x00\\\\\\\\\\\\";\\\\\\\\n }\\\\\\\\n uint256 temp = value;\\\\\\\\n uint256 length = 0;\\\\\\\\n while (temp != 0) {\\\\\\\\n length++;\\\\\\\\n temp >>= 8;\\\\\\\\n }\\\\\\\\n return toHexString(value, length);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\\\\\\\n */\\\\\\\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\\\\\\\n bytes memory buffer = new bytes(2 * length + 2);\\\\\\\\n buffer[0] = \\\\\\\\\\\\"0\\\\\\\\\\\\";\\\\\\\\n buffer[1] = \\\\\\\\\\\\"x\\\\\\\\\\\\";\\\\\\\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\\\\\\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\\\\\\\n value >>= 4;\\\\\\\\n }\\\\\\\\n require(value == 0, \\\\\\\\\\\\"Strings: hex length insufficient\\\\\\\\\\\\");\\\\\\\\n return string(buffer);\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x391d3ba97ab6856a16b225d6ee29617ad15ff00db70f3b4df1ab5ea33aa47c9d\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./IERC165.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Implementation of the {IERC165} interface.\\\\\\\\n *\\\\\\\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\\\\\\\n * for the additional interface id that will be supported. For example:\\\\\\\\n *\\\\\\\\n * ```solidity\\\\\\\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\\\\\\\n * }\\\\\\\\n * ```\\\\\\\\n *\\\\\\\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\\\\\\\n */\\\\\\\\nabstract contract ERC165 is IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev See {IERC165-supportsInterface}.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\\\\\\\n return interfaceId == type(IERC165).interfaceId;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x5718c5df9bd67ac68a796961df938821bb5dc0cd4c6118d77e9145afb187409b\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\\":{\\\\"content\\\\":\\\\"// SPDX-License-Identifier: MIT\\\\\\\\n\\\\\\\\npragma solidity ^0.8.0;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @dev Interface of the ERC165 standard, as defined in the\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\\\\\\\n *\\\\\\\\n * Implementers can declare support of contract interfaces, which can then be\\\\\\\\n * queried by others ({ERC165Checker}).\\\\\\\\n *\\\\\\\\n * For an implementation, see {ERC165}.\\\\\\\\n */\\\\\\\\ninterface IERC165 {\\\\\\\\n /**\\\\\\\\n * @dev Returns true if this contract implements the interface defined by\\\\\\\\n * `interfaceId`. See the corresponding\\\\\\\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\\\\\\\n * to learn more about how these ids are created.\\\\\\\\n *\\\\\\\\n * This function call must use less than 30 000 gas.\\\\\\\\n */\\\\\\\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xa28007762d9da9db878dd421960c8cb9a10471f47ab5c1b3309bfe48e9e79ff4\\\\",\\\\"license\\\\":\\\\"MIT\\\\"},\\\\"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity >=0.6.2;\\\\\\\\n\\\\\\\\ninterface IUniswapV2Router01 {\\\\\\\\n function factory() external pure returns (address);\\\\\\\\n function WETH() external pure returns (address);\\\\\\\\n\\\\\\\\n function addLiquidity(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint amountADesired,\\\\\\\\n uint amountBDesired,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountA, uint amountB, uint liquidity);\\\\\\\\n function addLiquidityETH(\\\\\\\\n address token,\\\\\\\\n uint amountTokenDesired,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external payable returns (uint amountToken, uint amountETH, uint liquidity);\\\\\\\\n function removeLiquidity(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountA, uint amountB);\\\\\\\\n function removeLiquidityETH(\\\\\\\\n address token,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint amountToken, uint amountETH);\\\\\\\\n function removeLiquidityWithPermit(\\\\\\\\n address tokenA,\\\\\\\\n address tokenB,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountAMin,\\\\\\\\n uint amountBMin,\\\\\\\\n address to,\\\\\\\\n uint deadline,\\\\\\\\n bool approveMax, uint8 v, bytes32 r, bytes32 s\\\\\\\\n ) external returns (uint amountA, uint amountB);\\\\\\\\n function removeLiquidityETHWithPermit(\\\\\\\\n address token,\\\\\\\\n uint liquidity,\\\\\\\\n uint amountTokenMin,\\\\\\\\n uint amountETHMin,\\\\\\\\n address to,\\\\\\\\n uint deadline,\\\\\\\\n bool approveMax, uint8 v, bytes32 r, bytes32 s\\\\\\\\n ) external returns (uint amountToken, uint amountETH);\\\\\\\\n function swapExactTokensForTokens(\\\\\\\\n uint amountIn,\\\\\\\\n uint amountOutMin,\\\\\\\\n address[] calldata path,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint[] memory amounts);\\\\\\\\n function swapTokensForExactTokens(\\\\\\\\n uint amountOut,\\\\\\\\n uint amountInMax,\\\\\\\\n address[] calldata path,\\\\\\\\n address to,\\\\\\\\n uint deadline\\\\\\\\n ) external returns (uint[] memory amounts);\\\\\\\\n function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n payable\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)\\\\\\\\n external\\\\\\\\n payable\\\\\\\\n returns (uint[] memory amounts);\\\\\\\\n\\\\\\\\n function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);\\\\\\\\n function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);\\\\\\\\n function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);\\\\\\\\n function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);\\\\\\\\n function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x8a3c5c449d4b7cd76513ed6995f4b86e4a86f222c770f8442f5fc128ce29b4d2\\\\"},\\\\"contracts/Interfaces/Interfaces.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/access/Ownable.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n// /**\\\\\\\\n// * @author 0mllwntrmt3\\\\\\\\n// * @title Hegic Protocol V8888 Interface\\\\\\\\n// * @notice The interface for the price calculator,\\\\\\\\n// * options, pools and staking contracts.\\\\\\\\n// **/\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface fot the contract that calculates\\\\\\\\n * the options prices (the premiums) that are adjusted\\\\\\\\n * through balancing the `ImpliedVolRate` parameter.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IIVLPriceCalculator {\\\\\\\\n event SetImpliedVolRate(uint256 value);\\\\\\\\n event SetSettlementFeeShare(uint256 value);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IPriceCalculator is IIVLPriceCalculator {\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculateTotalPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 settlementFee, uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IAtmPremiumCalculator {\\\\\\\\n event SetPolinomCall(int256[5] values);\\\\\\\\n event SetPolinomPut(int256[5] values);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculateAtmCallPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n\\\\\\\\n function calculateAtmPutPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IPremiumCalculator is IIVLPriceCalculator {\\\\\\\\n event SetBorders(uint256[3] values);\\\\\\\\n event SetImpliedVolRates(uint256[4] values);\\\\\\\\n event SetDiscontCall(int256[5] values);\\\\\\\\n event SetDiscontPut(int256[5] values);\\\\\\\\n event SetDiscontSpread(uint8 values);\\\\\\\\n event SetStrikePercentage(uint256 value);\\\\\\\\n event SetPeriodLimits(uint256 min, uint256 max);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function calculatePremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium);\\\\\\\\n\\\\\\\\n function priceProvider() external view returns (AggregatorV3Interface);\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract that manages pools and the options parameters,\\\\\\\\n * accumulates the funds from the liquidity providers and makes the withdrawals for them,\\\\\\\\n * sells the options contracts to the options buyers and collateralizes them,\\\\\\\\n * exercises the ITM (in-the-money) options with the unrealized P&L and settles them,\\\\\\\\n * unlocks the expired options and distributes the premiums among the liquidity providers.\\\\\\\\n **/\\\\\\\\ninterface IHegicPool is IERC721, IPriceCalculator {\\\\\\\\n enum OptionState {Invalid, Active, Exercised, Expired}\\\\\\\\n enum TrancheState {Invalid, Open, Closed}\\\\\\\\n\\\\\\\\n function priceProvider() external view returns (AggregatorV3Interface);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param state The state of the option: Invalid, Active, Exercised, Expired\\\\\\\\n * @param strike The option strike\\\\\\\\n * @param amount The option size\\\\\\\\n * @param lockedAmount The option collateral size locked\\\\\\\\n * @param expired The option expiration timestamp\\\\\\\\n * @param hedgePremium The share of the premium paid for hedging from the losses\\\\\\\\n * @param unhedgePremium The share of the premium paid to the hedged liquidity provider\\\\\\\\n **/\\\\\\\\n struct Option {\\\\\\\\n OptionState state;\\\\\\\\n uint256 strike;\\\\\\\\n uint256 amount;\\\\\\\\n uint256 lockedAmount;\\\\\\\\n uint256 expired;\\\\\\\\n uint256 hedgePremium;\\\\\\\\n uint256 unhedgePremium;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param state The state of the liquidity tranche: Invalid, Open, Closed\\\\\\\\n * @param share The liquidity provider\\\'s share in the pool\\\\\\\\n * @param amount The size of liquidity provided\\\\\\\\n * @param creationTimestamp The liquidity deposit timestamp\\\\\\\\n * @param hedged The liquidity tranche type: hedged or unhedged (classic)\\\\\\\\n **/\\\\\\\\n struct Tranche {\\\\\\\\n TrancheState state;\\\\\\\\n uint256 share;\\\\\\\\n uint256 amount;\\\\\\\\n uint256 creationTimestamp;\\\\\\\\n bool hedged;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n * @param settlementFee The part of the premium that\\\\\\\\n * is distributed among the HEGIC staking participants\\\\\\\\n * @param premium The part of the premium that\\\\\\\\n * is distributed among the liquidity providers\\\\\\\\n **/\\\\\\\\n event Acquired(uint256 indexed id, uint256 settlementFee, uint256 premium);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n * @param profit The profits of the option if exercised\\\\\\\\n **/\\\\\\\\n event Exercised(uint256 indexed id, uint256 profit);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n event Expired(uint256 indexed id);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param account The liquidity provider\\\'s address\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n **/\\\\\\\\n event Withdrawn(\\\\\\\\n address indexed account,\\\\\\\\n uint256 indexed trancheID,\\\\\\\\n uint256 amount\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function unlock(uint256 id) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param id The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function exercise(uint256 id) external;\\\\\\\\n\\\\\\\\n function setLockupPeriod(uint256, uint256) external;\\\\\\\\n\\\\\\\\n function collateralizationRatio() external view returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param value The hedging pool address\\\\\\\\n **/\\\\\\\\n function setHedgePool(address value) external;\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n * @return amount The liquidity to be received with\\\\\\\\n * the positive or negative P&L earned or lost during\\\\\\\\n * the period of holding the liquidity tranche considered\\\\\\\\n **/\\\\\\\\n function withdraw(uint256 trancheID) external returns (uint256 amount);\\\\\\\\n\\\\\\\\n function pricer() external view returns (IPriceCalculator);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The unhedged liquidity size\\\\\\\\n * (unprotected from the losses on selling the options)\\\\\\\\n **/\\\\\\\\n function unhedgedBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The hedged liquidity size\\\\\\\\n * (protected from the losses on selling the options)\\\\\\\\n **/\\\\\\\\n function hedgedBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param account The liquidity provider\\\'s address\\\\\\\\n * @param amount The size of the liquidity tranche\\\\\\\\n * @param hedged The type of the liquidity tranche\\\\\\\\n * @param minShare The minimum share in the pool of the user\\\\\\\\n **/\\\\\\\\n function provideFrom(\\\\\\\\n address account,\\\\\\\\n uint256 amount,\\\\\\\\n bool hedged,\\\\\\\\n uint256 minShare\\\\\\\\n ) external returns (uint256 share);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param holder The option buyer address\\\\\\\\n * @param period The option period\\\\\\\\n * @param amount The option size\\\\\\\\n * @param strike The option strike\\\\\\\\n **/\\\\\\\\n function sellOption(\\\\\\\\n address holder,\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external returns (uint256 id);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param trancheID The liquidity tranche ID\\\\\\\\n * @return amount The amount to be received after the withdrawal\\\\\\\\n **/\\\\\\\\n function withdrawWithoutHedge(uint256 trancheID)\\\\\\\\n external\\\\\\\\n returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The total liquidity provided into the pool\\\\\\\\n **/\\\\\\\\n function totalBalance() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return amount The total liquidity locked in the pool\\\\\\\\n **/\\\\\\\\n function lockedAmount() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n function token() external view returns (IERC20);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return state The state of the option: Invalid, Active, Exercised, Expired\\\\\\\\n * @return strike The option strike\\\\\\\\n * @return amount The option size\\\\\\\\n * @return lockedAmount The option collateral size locked\\\\\\\\n * @return expired The option expiration timestamp\\\\\\\\n * @return hedgePremium The share of the premium paid for hedging from the losses\\\\\\\\n * @return unhedgePremium The share of the premium paid to the hedged liquidity provider\\\\\\\\n **/\\\\\\\\n function options(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n OptionState state,\\\\\\\\n uint256 strike,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 lockedAmount,\\\\\\\\n uint256 expired,\\\\\\\\n uint256 hedgePremium,\\\\\\\\n uint256 unhedgePremium\\\\\\\\n );\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @return state The state of the liquidity tranche: Invalid, Open, Closed\\\\\\\\n * @return share The liquidity provider\\\'s share in the pool\\\\\\\\n * @return amount The size of liquidity provided\\\\\\\\n * @return creationTimestamp The liquidity deposit timestamp\\\\\\\\n * @return hedged The liquidity tranche type: hedged or unhedged (classic)\\\\\\\\n **/\\\\\\\\n function tranches(uint256 id)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (\\\\\\\\n TrancheState state,\\\\\\\\n uint256 share,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 creationTimestamp,\\\\\\\\n bool hedged\\\\\\\\n );\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface ISettlementFeeRecipient {\\\\\\\\n function distributeUnrealizedRewards() external;\\\\\\\\n}\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract that stakes HEGIC tokens\\\\\\\\n * through buying microlots (any amount of HEGIC tokens per microlot)\\\\\\\\n * and staking lots (888,000 HEGIC per lot), accumulates the staking\\\\\\\\n * rewards (settlement fees) and distributes the staking rewards among\\\\\\\\n * the microlots and staking lots holders (should be claimed manually).\\\\\\\\n **/\\\\\\\\ninterface IHegicStaking is ISettlementFeeRecipient {\\\\\\\\n event Claim(address indexed account, uint256 amount);\\\\\\\\n event Profit(uint256 amount);\\\\\\\\n event MicroLotsAcquired(address indexed account, uint256 amount);\\\\\\\\n event MicroLotsSold(address indexed account, uint256 amount);\\\\\\\\n\\\\\\\\n function claimProfits(address account) external returns (uint256 profit);\\\\\\\\n\\\\\\\\n function buyStakingLot(uint256 amount) external;\\\\\\\\n\\\\\\\\n function sellStakingLot(uint256 amount) external;\\\\\\\\n\\\\\\\\n function profitOf(address account) external view returns (uint256);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IWETH is IERC20 {\\\\\\\\n function deposit() external payable;\\\\\\\\n\\\\\\\\n function withdraw(uint256 value) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x07aeb681d8d7bda767c00a7747893f04c808cd15cf24a954f5a2b0bd02e3be4a\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/OptionsManager/IOptionsManager.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2021 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * @notice The interface for the contract\\\\\\\\n * that tokenizes options as ERC721.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IOptionsManager is IERC721 {\\\\\\\\n /**\\\\\\\\n * @param holder The option buyer address\\\\\\\\n **/\\\\\\\\n function createOptionFor(address holder) external returns (uint256);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param tokenId The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function tokenPool(uint256 tokenId) external returns (address pool);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @param spender The option buyer address or another address\\\\\\\\n * with the granted permission to buy/exercise options on the user\\\'s behalf\\\\\\\\n * @param tokenId The ERC721 token ID linked to the option\\\\\\\\n **/\\\\\\\\n function isApprovedOrOwner(address spender, uint256 tokenId)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (bool);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x8112a4f2f84024d8d97414d17306134350b05e55612125d8b863d0b8892d7156\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Pool/IHegicOperationalTreasury.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../OptionsManager/IOptionsManager.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\ninterface IHegicOperationalTreasury {\\\\\\\\n enum LockedLiquidityState {Unlocked, Locked}\\\\\\\\n\\\\\\\\n event Expired(uint256 indexed id);\\\\\\\\n event Paid(uint256 indexed id, address indexed account, uint256 amount);\\\\\\\\n event Replenished(uint256 amount);\\\\\\\\n\\\\\\\\n struct LockedLiquidity {\\\\\\\\n LockedLiquidityState state;\\\\\\\\n address strategy;\\\\\\\\n uint128 amount;\\\\\\\\n uint128 premium;\\\\\\\\n uint32 expiration;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function manager() external view returns (IOptionsManager);\\\\\\\\n\\\\\\\\n function token() external view returns (IERC20);\\\\\\\\n\\\\\\\\n function lockLiquidityFor(\\\\\\\\n address holder,\\\\\\\\n uint128 amount,\\\\\\\\n uint32 expiration\\\\\\\\n ) external returns (uint256 optionID);\\\\\\\\n\\\\\\\\n function payOff(\\\\\\\\n uint256 lockedLiquidityID,\\\\\\\\n uint256 amount,\\\\\\\\n address account\\\\\\\\n ) external;\\\\\\\\n\\\\\\\\n function lockedByStrategy(address strategy)\\\\\\\\n external\\\\\\\\n view\\\\\\\\n returns (uint256 lockedAmount);\\\\\\\\n\\\\\\\\n function getStakeAndCoverBalance() external view returns (uint256 balance);\\\\\\\\n\\\\\\\\n function totalBalance() external view returns (uint256 totalBalance);\\\\\\\\n\\\\\\\\n function lockedPremium() external view returns (uint256 lockedPremium);\\\\\\\\n\\\\\\\\n function benchmark() external view returns (uint256 benchmark);\\\\\\\\n\\\\\\\\n function totalLocked() external view returns (uint256 totalLocked);\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for unlocking\\\\\\\\n * liquidity after an expiration\\\\\\\\n * @param lockedLiquidityID The option contract ID\\\\\\\\n **/\\\\\\\\n function unlock(uint256 lockedLiquidityID) external;\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0xa09d31298b96864fe45d080d127d650d5fc1b19753bd5b5c8f7036cca9c83745\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/HegicStrategy.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"@chainlink/contracts/src/v0.7/interfaces/AggregatorV3Interface.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Interfaces/Interfaces.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Pool/IHegicOperationalTreasury.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"./IHegicStrategy.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\nabstract contract HegicStrategy is Ownable, IHegicStrategy, ReentrancyGuard {\\\\\\\\n using SafeERC20 for IERC20;\\\\\\\\n\\\\\\\\n IHegicOperationalTreasury public immutable pool;\\\\\\\\n AggregatorV3Interface public immutable priceProvider;\\\\\\\\n uint8 public collateralizationRatio;\\\\\\\\n uint256 public override lockedLimit;\\\\\\\\n IPremiumCalculator public pricer;\\\\\\\\n uint256 internal immutable spotDecimals; // 1e18\\\\\\\\n\\\\\\\\n uint256 private constant K_DECIMALS = 100;\\\\\\\\n uint256 public k = 100;\\\\\\\\n\\\\\\\\n struct StrategyData {\\\\\\\\n uint128 amount;\\\\\\\\n uint128 strike;\\\\\\\\n }\\\\\\\\n mapping(uint256 => StrategyData) public strategyData;\\\\\\\\n\\\\\\\\n constructor(\\\\\\\\n IHegicOperationalTreasury _pool,\\\\\\\\n AggregatorV3Interface _priceProvider,\\\\\\\\n IPremiumCalculator _pricer,\\\\\\\\n uint8 _collateralizationRatio,\\\\\\\\n uint256 limit,\\\\\\\\n uint8 _spotDecimals\\\\\\\\n ) {\\\\\\\\n pricer = _pricer;\\\\\\\\n pool = _pool;\\\\\\\\n priceProvider = _priceProvider;\\\\\\\\n collateralizationRatio = _collateralizationRatio;\\\\\\\\n lockedLimit = limit;\\\\\\\\n spotDecimals = 10**_spotDecimals;\\\\\\\\n }\\\\\\\\n\\\\\\\\n function setPricer(IPremiumCalculator value) external onlyOwner {\\\\\\\\n pricer = value;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for setting a limit\\\\\\\\n * on the total locked liquidity\\\\\\\\n * @param value The maximum locked liquidity\\\\\\\\n **/\\\\\\\\n function setLimit(uint256 value) external onlyOwner {\\\\\\\\n lockedLimit = value;\\\\\\\\n emit SetLimit(value);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for viewing the total liquidity\\\\\\\\n * locked up for a specific options strategy\\\\\\\\n **/\\\\\\\\n function getLockedByStrategy()\\\\\\\\n external\\\\\\\\n view\\\\\\\\n override\\\\\\\\n returns (uint256 amount)\\\\\\\\n {\\\\\\\\n return pool.lockedByStrategy(address(this));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _getAvailableContracts(uint32 period, uint256 strike)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 available)\\\\\\\\n {\\\\\\\\n uint256 totalAvailableBalance =\\\\\\\\n pool.getStakeAndCoverBalance() +\\\\\\\\n pool.totalBalance() -\\\\\\\\n pool.totalLocked() -\\\\\\\\n pool.lockedPremium();\\\\\\\\n uint256 availableBalance =\\\\\\\\n lockedLimit - pool.lockedByStrategy(address(this));\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n uint256 lockedAmount =\\\\\\\\n _calculateLockedAmount(uint128(spotDecimals), period, strike);\\\\\\\\n if (availableBalance > totalAvailableBalance) {\\\\\\\\n return (totalAvailableBalance * spotDecimals) / lockedAmount;\\\\\\\\n }\\\\\\\\n return (availableBalance * spotDecimals) / lockedAmount;\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for buying options/strategies\\\\\\\\n * @param holder The holder address\\\\\\\\n * @param period The option/strategy period\\\\\\\\n * @param amount The option/strategy amount\\\\\\\\n * @param strike The option/strategy strike\\\\\\\\n **/\\\\\\\\n function buy(\\\\\\\\n address holder,\\\\\\\\n uint32 period,\\\\\\\\n uint128 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external virtual nonReentrant returns (uint256 id) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n uint256 premium = _calculatePremium(period, amount, strike);\\\\\\\\n uint128 lockedAmount = _calculateLockedAmount(amount, period, strike);\\\\\\\\n\\\\\\\\n require(\\\\\\\\n pool.lockedByStrategy(address(this)) + lockedAmount <= lockedLimit,\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: The limit is exceeded\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n\\\\\\\\n pool.token().safeTransferFrom(msg.sender, address(pool), premium);\\\\\\\\n\\\\\\\\n uint32 expiration = uint32(block.timestamp + period);\\\\\\\\n id = pool.lockLiquidityFor(holder, lockedAmount, expiration);\\\\\\\\n strategyData[id] = StrategyData(uint128(amount), uint128(strike));\\\\\\\\n emit Acquired(id, amount, premium, strike, expiration);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for exercising an in-the-money\\\\\\\\n * option/strategy and taking profits\\\\\\\\n * @param optionID The option/strategy ID\\\\\\\\n **/\\\\\\\\n function exercise(uint256 optionID) external {\\\\\\\\n uint256 amount = _profitOf(optionID);\\\\\\\\n require(\\\\\\\\n pool.manager().isApprovedOrOwner(msg.sender, optionID),\\\\\\\\n \\\\\\\\\\\\"HegicStrategy: Msg.sender can\\\'t exercise this option\\\\\\\\\\\\"\\\\\\\\n );\\\\\\\\n require(amount > 0, \\\\\\\\\\\\"HegicStrategy: The profit is zero\\\\\\\\\\\\");\\\\\\\\n pool.payOff(optionID, amount, pool.manager().ownerOf(optionID));\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculateLockedAmount(\\\\\\\\n uint128 amount,\\\\\\\\n uint32 period,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view virtual returns (uint128 lockedAmount) {\\\\\\\\n return\\\\\\\\n uint128(\\\\\\\\n (pricer.calculatePremium(\\\\\\\\n uint32(period),\\\\\\\\n uint128(amount),\\\\\\\\n strike\\\\\\\\n ) * k) / K_DECIMALS\\\\\\\\n );\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _calculatePremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) internal view virtual returns (uint256 premium) {\\\\\\\\n if (strike == 0) strike = _currentPrice();\\\\\\\\n premium = pricer.calculatePremium(period, amount, strike);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function calculatePremium(\\\\\\\\n uint32 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 premium, uint256 available) {\\\\\\\\n premium = _calculatePremium(period, amount, strike);\\\\\\\\n available = _getAvailableContracts(period, strike);\\\\\\\\n }\\\\\\\\n\\\\\\\\n function _profitOf(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n virtual\\\\\\\\n returns (uint256 profit);\\\\\\\\n\\\\\\\\n function _currentPrice() internal view returns (uint256 price) {\\\\\\\\n (, int256 latestPrice, , , ) = priceProvider.latestRoundData();\\\\\\\\n price = uint256(latestPrice);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for calculating the holder\\\'s\\\\\\\\n * option/strategy unrealized profits\\\\\\\\n * @param optionID The option/strategy ID\\\\\\\\n * @param amount The unrealized profits amount\\\\\\\\n **/\\\\\\\\n function profitOf(uint256 optionID) external view returns (uint256 amount) {\\\\\\\\n return _profitOf(optionID);\\\\\\\\n }\\\\\\\\n\\\\\\\\n /**\\\\\\\\n * @notice Used for setting the collateralization coefficient\\\\\\\\n * @param value The collateralization coefficient\\\\\\\\n **/\\\\\\\\n function setK(uint256 value) external onlyOwner {\\\\\\\\n k = value;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x47316928b2d6e8d7d43a04f9d07d3987b3c036869f158b8181a8557ff8342345\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/HegicStrategyPut.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\nimport \\\\\\\\\\\\"./HegicStrategy.sol\\\\\\\\\\\\";\\\\\\\\nimport \\\\\\\\\\\\"../Interfaces/Interfaces.sol\\\\\\\\\\\\";\\\\\\\\n\\\\\\\\ncontract HegicStrategyPut is HegicStrategy {\\\\\\\\n // uint256 private immutable spotDecimals; // 1e18\\\\\\\\n uint256 private constant TOKEN_DECIMALS = 1e6; // 1e6\\\\\\\\n\\\\\\\\n constructor(\\\\\\\\n IHegicOperationalTreasury _pool,\\\\\\\\n AggregatorV3Interface _priceProvider,\\\\\\\\n IPremiumCalculator _pricer,\\\\\\\\n uint8 _spotDecimals,\\\\\\\\n uint256 limit\\\\\\\\n ) HegicStrategy(_pool, _priceProvider, _pricer, 10, limit, _spotDecimals) {}\\\\\\\\n\\\\\\\\n function _profitOf(uint256 optionID)\\\\\\\\n internal\\\\\\\\n view\\\\\\\\n override\\\\\\\\n returns (uint256 amount)\\\\\\\\n {\\\\\\\\n StrategyData memory data = strategyData[optionID];\\\\\\\\n uint256 currentPrice = _currentPrice();\\\\\\\\n if (currentPrice > data.strike) return 0;\\\\\\\\n uint256 priceDecimals = 10**priceProvider.decimals();\\\\\\\\n return\\\\\\\\n ((data.strike - currentPrice) * data.amount * TOKEN_DECIMALS) /\\\\\\\\n spotDecimals /\\\\\\\\n priceDecimals;\\\\\\\\n }\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x079e6c3e7db85c89083262dcaa4b31bd3bec73053992dc5e2243c574ea367fb0\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Strategies/IHegicStrategy.sol\\\\":{\\\\"content\\\\":\\\\"pragma solidity 0.8.6;\\\\\\\\n\\\\\\\\n/**\\\\\\\\n * SPDX-License-Identifier: GPL-3.0-or-later\\\\\\\\n * Hegic\\\\\\\\n * Copyright (C) 2022 Hegic Protocol\\\\\\\\n *\\\\\\\\n * This program is free software: you can redistribute it and/or modify\\\\\\\\n * it under the terms of the GNU General Public License as published by\\\\\\\\n * the Free Software Foundation, either version 3 of the License, or\\\\\\\\n * (at your option) any later version.\\\\\\\\n *\\\\\\\\n * This program is distributed in the hope that it will be useful,\\\\\\\\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\\\\\\\\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\\\\\\\\n * GNU General Public License for more details.\\\\\\\\n *\\\\\\\\n * You should have received a copy of the GNU General Public License\\\\\\\\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\\\\\\\\n **/\\\\\\\\n\\\\\\\\ninterface IHegicStrategy {\\\\\\\\n event Acquired(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 strike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event AcquiredStrangle(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 callStrike,\\\\\\\\n uint256 putStrike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event AcquiredSpread(\\\\\\\\n uint256 indexed id,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 premium,\\\\\\\\n uint256 atmStrike,\\\\\\\\n uint256 otmStrike,\\\\\\\\n uint32 expiration\\\\\\\\n );\\\\\\\\n\\\\\\\\n event SetLimit(uint256 limit);\\\\\\\\n\\\\\\\\n function getLockedByStrategy() external view returns (uint256 amount);\\\\\\\\n\\\\\\\\n function lockedLimit() external view returns (uint256 lockedLimit);\\\\\\\\n}\\\\\\\\n\\\\",\\\\"keccak256\\\\":\\\\"0x6cc1a6057f3eb6573548f4c6bae9307b3f943c338f448259a1723af150d0e572\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"}},\\\\"version\\\\":1}","bytecode":"0x60e060405260646005553480156200001657600080fd5b5060405162001e8f38038062001e8f83398101604081905262000039916200010c565b848484600a84866200004b33620000bc565b60018055600480546001600160a01b0319166001600160a01b038616179055606086811b6001600160601b03199081166080529086901b1660a0526002805460ff191660ff85161790556003829055620000a781600a620001ce565b60c05250620002cb9950505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600060a086880312156200012557600080fd5b85516200013281620002b2565b60208701519095506200014581620002b2565b60408701519094506200015881620002b2565b606087015190935060ff811681146200017057600080fd5b80925050608086015190509295509295909350565b600181815b80851115620001c6578160001904821115620001aa57620001aa6200029c565b80851615620001b857918102915b93841c93908002906200018a565b509250929050565b6000620001df60ff841683620001e6565b9392505050565b600082620001f75750600162000296565b81620002065750600062000296565b81600181146200021f57600281146200022a576200024a565b600191505062000296565b60ff8411156200023e576200023e6200029c565b50506001821b62000296565b5060208310610133831016604e8410600b84101617156200026f575081810a62000296565b6200027b838362000185565b80600019048211156200029257620002926200029c565b0290505b92915050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114620002c857600080fd5b50565b60805160601c60a05160601c60c051611b106200037f600039600081816110bb015281816110fa0152818161113901526112c601526000818161023001528181611227015261134601526000818161012001528181610465015281816106390152818161066a015281816107f90152818161094401528181610a2801528181610a4a01528181610b3901528181610d9801528181610e2901528181610eba01528181610f4b015261101b0152611b106000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063b07f0a41116100a2578063d3d5c12111610071578063d3d5c1211461025a578063d6c8d1b414610263578063da3c1a76146102b7578063dcaf9c44146102ca578063f2fde38b146102e957600080fd5b8063b07f0a411461020f578063b4f40c6114610222578063b888879e1461022b578063d03d4aee1461025257600080fd5b806367de8be9116100e957806367de8be9146101af578063715018a6146101c25780637632bffb146101ca5780638da5cb5b146101eb578063a6138ed9146101fc57600080fd5b806316f0115b1461011b57806327ea6f2b1461015f5780632939037014610174578063370a6ae614610187575b600080fd5b6101427f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61017261016d3660046117c9565b6102fc565b005b610172610182366004611712565b61036a565b61019a6101953660046117fb565b6103b6565b60408051928352602083019190915201610156565b6101726101bd3660046117c9565b6103e0565b61017261040f565b6101dd6101d83660046117c9565b610445565b604051908152602001610156565b6000546001600160a01b0316610142565b600454610142906001600160a01b031681565b61017261021d3660046117c9565b610456565b6101dd60055481565b6101427f000000000000000000000000000000000000000000000000000000000000000081565b6101dd6107e1565b6101dd60035481565b6102976102713660046117c9565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610156565b6101dd6102c536600461174c565b610880565b6002546102d79060ff1681565b60405160ff9091168152602001610156565b6101726102f7366004611712565b610c56565b6000546001600160a01b0316331461032f5760405162461bcd60e51b8152600401610326906118f0565b60405180910390fd5b60038190556040518181527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a150565b6000546001600160a01b031633146103945760405162461bcd60e51b8152600401610326906118f0565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806103ca8563ffffffff168585610cf1565b91506103d68584610d93565b9050935093915050565b6000546001600160a01b0316331461040a5760405162461bcd60e51b8152600401610326906118f0565b600555565b6000546001600160a01b031633146104395760405162461bcd60e51b8152600401610326906118f0565b6104436000611172565b565b6000610450826111c2565b92915050565b6000610461826111c2565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f4919061172f565b60405163430c208160e01b8152336004820152602481018490526001600160a01b03919091169063430c20819060440160206040518083038186803b15801561053c57600080fd5b505afa158015610550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057491906117a7565b6105dd5760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b6064820152608401610326565b600081116106375760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b6064820152608401610326565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156106c157600080fd5b505afa1580156106d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f9919061172f565b6001600160a01b0316636352211e876040518263ffffffff1660e01b815260040161072691815260200190565b60206040518083038186803b15801561073e57600080fd5b505afa158015610752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610776919061172f565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b1580156107c557600080fd5b505af11580156107d9573d6000803e3d6000fd5b505050505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b15801561084357600080fd5b505afa158015610857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087b91906117e2565b905090565b6000600260015414156108d55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610326565b6002600155816108ea576108e7611341565b91505b60006109068563ffffffff16856001600160801b031685610cf1565b905060006109158587866113e0565b600354604051634485558360e01b8152306004820152919250906001600160801b038316906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be91906117e2565b6109c89190611925565b1115610a225760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b6064820152608401610326565b610aea337f0000000000000000000000000000000000000000000000000000000000000000847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa157600080fd5b505afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad9919061172f565b6001600160a01b031692919061149d565b6000610afc63ffffffff881642611925565b60405163d6a6367760e01b81526001600160a01b038a811660048301526001600160801b038516602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610b7f57600080fd5b505af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906117e2565b6040805180820182526001600160801b038981168083528982166020808501918252600087815260068252869020945191518416600160801b0291909316179092558251918252810186905290810187905263ffffffff8316606082015290945084907f1cc09915b693fed5c1f699371120d74d3bf06b9f2392d13cd6b001437f3725069060800160405180910390a250506001805550949350505050565b6000546001600160a01b03163314610c805760405162461bcd60e51b8152600401610326906118f0565b6001600160a01b038116610ce55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610326565b610cee81611172565b50565b600081610d0357610d00611341565b91505b6004805460405163055bc75d60e21b815291820186905260248201859052604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b158015610d5357600080fd5b505afa158015610d67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8b91906117e2565b949350505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610def57600080fd5b505afa158015610e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2791906117e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb891906117e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f1157600080fd5b505afa158015610f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4991906117e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b158015610fa257600080fd5b505afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906117e2565b610fe49190611925565b610fee9190611a6c565b610ff89190611a6c565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561105d57600080fd5b505afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109591906117e2565b6003546110a29190611a6c565b9050836110b4576110b1611341565b93505b60006110e17f000000000000000000000000000000000000000000000000000000000000000087876113e0565b6001600160801b0316905082821115611133578061111f7f000000000000000000000000000000000000000000000000000000000000000085611a4d565b611129919061193d565b9350505050610450565b8061115e7f000000000000000000000000000000000000000000000000000000000000000084611a4d565b611168919061193d565b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b909104169181019190915281611202611341565b905081602001516001600160801b0316811115611223575060009392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b6919061187e565b6112c190600a6119a2565b9050807f0000000000000000000000000000000000000000000000000000000000000000620f424085600001516001600160801b03168587602001516001600160801b03166113109190611a6c565b61131a9190611a4d565b6113249190611a4d565b61132e919061193d565b611338919061193d565b95945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561139d57600080fd5b505afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d5919061182e565b509195945050505050565b6005546004805460405163055bc75d60e21b815263ffffffff8616928101929092526001600160801b03861660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b15801561144a57600080fd5b505afa15801561145e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148291906117e2565b61148c9190611a4d565b610d8b919061193d565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526114f79085906114fd565b50505050565b6000611552826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115d49092919063ffffffff16565b8051909150156115cf578080602001905181019061157091906117a7565b6115cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610326565b505050565b6060610d8b848460008585843b61162d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610326565b600080866001600160a01b0316858760405161164991906118a1565b60006040518083038185875af1925050503d8060008114611686576040519150601f19603f3d011682016040523d82523d6000602084013e61168b565b606091505b509150915061169b8282866116a6565b979650505050505050565b606083156116b5575081611496565b8251156116c55782518084602001fd5b8160405162461bcd60e51b815260040161032691906118bd565b803563ffffffff811681146116f357600080fd5b919050565b805169ffffffffffffffffffff811681146116f357600080fd5b60006020828403121561172457600080fd5b813561149681611ac5565b60006020828403121561174157600080fd5b815161149681611ac5565b6000806000806080858703121561176257600080fd5b843561176d81611ac5565b935061177b602086016116df565b925060408501356001600160801b038116811461179757600080fd5b9396929550929360600135925050565b6000602082840312156117b957600080fd5b8151801515811461149657600080fd5b6000602082840312156117db57600080fd5b5035919050565b6000602082840312156117f457600080fd5b5051919050565b60008060006060848603121561181057600080fd5b611819846116df565b95602085013595506040909401359392505050565b600080600080600060a0868803121561184657600080fd5b61184f866116f8565b9450602086015193506040860151925060608601519150611872608087016116f8565b90509295509295909350565b60006020828403121561189057600080fd5b815160ff8116811461149657600080fd5b600082516118b3818460208701611a83565b9190910192915050565b60208152600082518060208401526118dc816040850160208701611a83565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561193857611938611aaf565b500190565b60008261195a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561199a57816000190482111561198057611980611aaf565b8085161561198d57918102915b93841c9390800290611964565b509250929050565b600061149660ff8416836000826119bb57506001610450565b816119c857506000610450565b81600181146119de57600281146119e857611a04565b6001915050610450565b60ff8411156119f9576119f9611aaf565b50506001821b610450565b5060208310610133831016604e8410600b8410161715611a27575081810a610450565b611a31838361195f565b8060001904821115611a4557611a45611aaf565b029392505050565b6000816000190483118215151615611a6757611a67611aaf565b500290565b600082821015611a7e57611a7e611aaf565b500390565b60005b83811015611a9e578181015183820152602001611a86565b838111156114f75750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610cee57600080fdfea264697066735822122051a1b83417a1852e91885a0d30719cc59f3036dfc80bfbd5ff3040b704c204da64736f6c63430008060033","deployedBytecode":"0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063b07f0a41116100a2578063d3d5c12111610071578063d3d5c1211461025a578063d6c8d1b414610263578063da3c1a76146102b7578063dcaf9c44146102ca578063f2fde38b146102e957600080fd5b8063b07f0a411461020f578063b4f40c6114610222578063b888879e1461022b578063d03d4aee1461025257600080fd5b806367de8be9116100e957806367de8be9146101af578063715018a6146101c25780637632bffb146101ca5780638da5cb5b146101eb578063a6138ed9146101fc57600080fd5b806316f0115b1461011b57806327ea6f2b1461015f5780632939037014610174578063370a6ae614610187575b600080fd5b6101427f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61017261016d3660046117c9565b6102fc565b005b610172610182366004611712565b61036a565b61019a6101953660046117fb565b6103b6565b60408051928352602083019190915201610156565b6101726101bd3660046117c9565b6103e0565b61017261040f565b6101dd6101d83660046117c9565b610445565b604051908152602001610156565b6000546001600160a01b0316610142565b600454610142906001600160a01b031681565b61017261021d3660046117c9565b610456565b6101dd60055481565b6101427f000000000000000000000000000000000000000000000000000000000000000081565b6101dd6107e1565b6101dd60035481565b6102976102713660046117c9565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610156565b6101dd6102c536600461174c565b610880565b6002546102d79060ff1681565b60405160ff9091168152602001610156565b6101726102f7366004611712565b610c56565b6000546001600160a01b0316331461032f5760405162461bcd60e51b8152600401610326906118f0565b60405180910390fd5b60038190556040518181527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a150565b6000546001600160a01b031633146103945760405162461bcd60e51b8152600401610326906118f0565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000806103ca8563ffffffff168585610cf1565b91506103d68584610d93565b9050935093915050565b6000546001600160a01b0316331461040a5760405162461bcd60e51b8152600401610326906118f0565b600555565b6000546001600160a01b031633146104395760405162461bcd60e51b8152600401610326906118f0565b6104436000611172565b565b6000610450826111c2565b92915050565b6000610461826111c2565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156104bc57600080fd5b505afa1580156104d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f4919061172f565b60405163430c208160e01b8152336004820152602481018490526001600160a01b03919091169063430c20819060440160206040518083038186803b15801561053c57600080fd5b505afa158015610550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057491906117a7565b6105dd5760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b6064820152608401610326565b600081116106375760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b6064820152608401610326565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b1580156106c157600080fd5b505afa1580156106d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f9919061172f565b6001600160a01b0316636352211e876040518263ffffffff1660e01b815260040161072691815260200190565b60206040518083038186803b15801561073e57600080fd5b505afa158015610752573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610776919061172f565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b1580156107c557600080fd5b505af11580156107d9573d6000803e3d6000fd5b505050505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b15801561084357600080fd5b505afa158015610857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087b91906117e2565b905090565b6000600260015414156108d55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610326565b6002600155816108ea576108e7611341565b91505b60006109068563ffffffff16856001600160801b031685610cf1565b905060006109158587866113e0565b600354604051634485558360e01b8152306004820152919250906001600160801b038316906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561098657600080fd5b505afa15801561099a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109be91906117e2565b6109c89190611925565b1115610a225760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b6064820152608401610326565b610aea337f0000000000000000000000000000000000000000000000000000000000000000847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa157600080fd5b505afa158015610ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad9919061172f565b6001600160a01b031692919061149d565b6000610afc63ffffffff881642611925565b60405163d6a6367760e01b81526001600160a01b038a811660048301526001600160801b038516602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610b7f57600080fd5b505af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906117e2565b6040805180820182526001600160801b038981168083528982166020808501918252600087815260068252869020945191518416600160801b0291909316179092558251918252810186905290810187905263ffffffff8316606082015290945084907f1cc09915b693fed5c1f699371120d74d3bf06b9f2392d13cd6b001437f3725069060800160405180910390a250506001805550949350505050565b6000546001600160a01b03163314610c805760405162461bcd60e51b8152600401610326906118f0565b6001600160a01b038116610ce55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610326565b610cee81611172565b50565b600081610d0357610d00611341565b91505b6004805460405163055bc75d60e21b815291820186905260248201859052604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b158015610d5357600080fd5b505afa158015610d67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8b91906117e2565b949350505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610def57600080fd5b505afa158015610e03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2791906117e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610e8057600080fd5b505afa158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb891906117e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f1157600080fd5b505afa158015610f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4991906117e2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b158015610fa257600080fd5b505afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda91906117e2565b610fe49190611925565b610fee9190611a6c565b610ff89190611a6c565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561105d57600080fd5b505afa158015611071573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109591906117e2565b6003546110a29190611a6c565b9050836110b4576110b1611341565b93505b60006110e17f000000000000000000000000000000000000000000000000000000000000000087876113e0565b6001600160801b0316905082821115611133578061111f7f000000000000000000000000000000000000000000000000000000000000000085611a4d565b611129919061193d565b9350505050610450565b8061115e7f000000000000000000000000000000000000000000000000000000000000000084611a4d565b611168919061193d565b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b909104169181019190915281611202611341565b905081602001516001600160801b0316811115611223575060009392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b6919061187e565b6112c190600a6119a2565b9050807f0000000000000000000000000000000000000000000000000000000000000000620f424085600001516001600160801b03168587602001516001600160801b03166113109190611a6c565b61131a9190611a4d565b6113249190611a4d565b61132e919061193d565b611338919061193d565b95945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561139d57600080fd5b505afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d5919061182e565b509195945050505050565b6005546004805460405163055bc75d60e21b815263ffffffff8616928101929092526001600160801b03861660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b15801561144a57600080fd5b505afa15801561145e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148291906117e2565b61148c9190611a4d565b610d8b919061193d565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526114f79085906114fd565b50505050565b6000611552826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115d49092919063ffffffff16565b8051909150156115cf578080602001905181019061157091906117a7565b6115cf5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610326565b505050565b6060610d8b848460008585843b61162d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610326565b600080866001600160a01b0316858760405161164991906118a1565b60006040518083038185875af1925050503d8060008114611686576040519150601f19603f3d011682016040523d82523d6000602084013e61168b565b606091505b509150915061169b8282866116a6565b979650505050505050565b606083156116b5575081611496565b8251156116c55782518084602001fd5b8160405162461bcd60e51b815260040161032691906118bd565b803563ffffffff811681146116f357600080fd5b919050565b805169ffffffffffffffffffff811681146116f357600080fd5b60006020828403121561172457600080fd5b813561149681611ac5565b60006020828403121561174157600080fd5b815161149681611ac5565b6000806000806080858703121561176257600080fd5b843561176d81611ac5565b935061177b602086016116df565b925060408501356001600160801b038116811461179757600080fd5b9396929550929360600135925050565b6000602082840312156117b957600080fd5b8151801515811461149657600080fd5b6000602082840312156117db57600080fd5b5035919050565b6000602082840312156117f457600080fd5b5051919050565b60008060006060848603121561181057600080fd5b611819846116df565b95602085013595506040909401359392505050565b600080600080600060a0868803121561184657600080fd5b61184f866116f8565b9450602086015193506040860151925060608601519150611872608087016116f8565b90509295509295909350565b60006020828403121561189057600080fd5b815160ff8116811461149657600080fd5b600082516118b3818460208701611a83565b9190910192915050565b60208152600082518060208401526118dc816040850160208701611a83565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561193857611938611aaf565b500190565b60008261195a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561199a57816000190482111561198057611980611aaf565b8085161561198d57918102915b93841c9390800290611964565b509250929050565b600061149660ff8416836000826119bb57506001610450565b816119c857506000610450565b81600181146119de57600281146119e857611a04565b6001915050610450565b60ff8411156119f9576119f9611aaf565b50506001821b610450565b5060208310610133831016604e8410600b8410161715611a27575081810a610450565b611a31838361195f565b8060001904821115611a4557611a45611aaf565b029392505050565b6000816000190483118215151615611a6757611a67611aaf565b500290565b600082821015611a7e57611a7e611aaf565b500390565b60005b83811015611a9e578181015183820152602001611a86565b838111156114f75750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610cee57600080fdfea264697066735822122051a1b83417a1852e91885a0d30719cc59f3036dfc80bfbd5ff3040b704c204da64736f6c63430008060033","devdoc":{"kind":"dev","methods":{"buy(address,uint32,uint128,uint256)":{"params":{"amount":"The option/strategy amount","holder":"The holder address","period":"The option/strategy period","strike":"The option/strategy strike*"}},"exercise(uint256)":{"params":{"optionID":"The option/strategy ID*"}},"owner()":{"details":"Returns the address of the current owner."},"profitOf(uint256)":{"params":{"amount":"The unrealized profits amount*","optionID":"The option/strategy ID"}},"renounceOwnership()":{"details":"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."},"setK(uint256)":{"params":{"value":"The collateralization coefficient*"}},"setLimit(uint256)":{"params":{"value":"The maximum locked liquidity*"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"buy(address,uint32,uint128,uint256)":{"notice":"Used for buying options/strategies"},"exercise(uint256)":{"notice":"Used for exercising an in-the-money option/strategy and taking profits"},"getLockedByStrategy()":{"notice":"Used for viewing the total liquidity locked up for a specific options strategy*"},"profitOf(uint256)":{"notice":"Used for calculating the holder\\\'s option/strategy unrealized profits"},"setK(uint256)":{"notice":"Used for setting the collateralization coefficient"},"setLimit(uint256)":{"notice":"Used for setting a limit on the total locked liquidity"}},"version":1},"storageLayout":{"storage":[{"astId":611,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":810,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"_status","offset":0,"slot":"1","type":"t_uint256"},{"astId":15532,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"collateralizationRatio","offset":0,"slot":"2","type":"t_uint8"},{"astId":15535,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"lockedLimit","offset":0,"slot":"3","type":"t_uint256"},{"astId":15538,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"pricer","offset":0,"slot":"4","type":"t_contract(IPremiumCalculator)7174"},{"astId":15546,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"k","offset":0,"slot":"5","type":"t_uint256"},{"astId":15556,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"strategyData","offset":0,"slot":"6","type":"t_mapping(t_uint256,t_struct(StrategyData)15551_storage)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IPremiumCalculator)7174":{"encoding":"inplace","label":"contract IPremiumCalculator","numberOfBytes":"20"},"t_mapping(t_uint256,t_struct(StrategyData)15551_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => struct HegicStrategy.StrategyData)","numberOfBytes":"32","value":"t_struct(StrategyData)15551_storage"},"t_struct(StrategyData)15551_storage":{"encoding":"inplace","label":"struct HegicStrategy.StrategyData","members":[{"astId":15548,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"amount","offset":0,"slot":"0","type":"t_uint128"},{"astId":15550,"contract":"contracts/Strategies/HegicStrategyPut.sol:HegicStrategyPut","label":"strike","offset":16,"slot":"0","type":"t_uint128"}],"numberOfBytes":"32"},"t_uint128":{"encoding":"inplace","label":"uint128","numberOfBytes":"16"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"},"t_uint8":{"encoding":"inplace","label":"uint8","numberOfBytes":"1"}}}}\');\n\n//# sourceURL=webpack://hedge/./src/deployments/arbitrum/HegicStrategyATM_PUT_ETH.json?')}}]);