-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path453.bandle.js
1 lines (1 loc) · 162 KB
/
453.bandle.js
1
"use strict";(self.webpackChunkhedge=self.webpackChunkhedge||[]).push([[453],{70453:module=>{eval('module.exports = JSON.parse(\'{"address":"0x0dD5B0cB931F59A526a2017712172Cc5bf1573A1","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":"AcquiredSprad","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":"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":"0xad90082f75eab9091463b45ebdb93aad5745dd5d9d13d6010fa2b9b505598780","receipt":{"to":null,"from":"0xF15968a096Fc8F47650001585d23bEE819b5affb","contractAddress":"0x0dD5B0cB931F59A526a2017712172Cc5bf1573A1","transactionIndex":0,"gasUsed":"24698422","logsBloom":"0x00000000000000000000000000000000000000000000000000800000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008001000000000000000200000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000020000000000000000000000000000000000020000000000000000000000100000000000000000000000000000000000000000000","blockHash":"0xb5dd13dd6e43080ca585a50518da3c46a16d89061030f4b5c7ba37c6e511e300","transactionHash":"0xad90082f75eab9091463b45ebdb93aad5745dd5d9d13d6010fa2b9b505598780","logs":[{"transactionIndex":0,"blockNumber":9011802,"transactionHash":"0xad90082f75eab9091463b45ebdb93aad5745dd5d9d13d6010fa2b9b505598780","address":"0x0dD5B0cB931F59A526a2017712172Cc5bf1573A1","topics":["0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0","0x0000000000000000000000000000000000000000000000000000000000000000","0x000000000000000000000000f15968a096fc8f47650001585d23bee819b5affb"],"data":"0x","logIndex":0,"blockHash":"0xb5dd13dd6e43080ca585a50518da3c46a16d89061030f4b5c7ba37c6e511e300"}],"blockNumber":9011802,"cumulativeGasUsed":"11195582","status":1,"byzantium":true},"args":["0xB0F9F032158510cd4a926F9263Abc86bAF7b4Ab3","0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612","0xD535734EB57b0383a16bA873BBF7C833E02E52BD",18,70000000000],"solcInputHash":"3849dde5951fd2bb80b7dbcdb869a6a1","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\\\\":\\\\"AcquiredSprad\\\\",\\\\"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\\\\":\\\\"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/Pool/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/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/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 **/\\\\\\\\ninterface IPriceCalculator {\\\\\\\\n event SetImpliedVolRate(uint256 value);\\\\\\\\n event SetSettlementFeeShare(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 calculateTotalPremium(\\\\\\\\n uint256 period,\\\\\\\\n uint256 amount,\\\\\\\\n uint256 strike\\\\\\\\n ) external view returns (uint256 settlementFee, uint256 premium);\\\\\\\\n}\\\\\\\\n\\\\\\\\ninterface IAtmPremiumCalculator {\\\\\\\\n event SetImpliedVolRatesCall(uint256 values);\\\\\\\\n event SetImpliedVolRatesPut(uint256 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 {\\\\\\\\n event SetBorders(uint256[3] values);\\\\\\\\n event SetBordersCall(uint256[3] values);\\\\\\\\n event SetBordersPut(uint256[3] values);\\\\\\\\n event SetImpliedVolRates(uint256[4] values);\\\\\\\\n event SetDiscontCall(uint256[4] values);\\\\\\\\n event SetDiscontPut(uint256[4] values);\\\\\\\\n event SetStrikePercentage(uint256 value);\\\\\\\\n event SetSettlementFeeShare(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\\\\\\\\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\\\\":\\\\"0x63bb7fe5e83b67ccb896147faf15ae6a0afc11b6ec0d8c5d510cc32d13f44e12\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Pool/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 \\\\\\\\\\\\"./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 /**\\\\\\\\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\\\\":\\\\"0x42a3189afb24d737b617911426958e1037549e46093656ead913379517417109\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Pool/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/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 \\\\\\\\\\\\"../Interfaces/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\\\\",\\\\"keccak256\\\\":\\\\"0xb454c0385249650d4855f15c58426bf1c10942b8ba44fe2cbe56dd1444e71478\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"},\\\\"contracts/Pool/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 AcquiredSprad(\\\\\\\\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\\\\":\\\\"0x84d71360c2325fa17808aeef027606360e3f0d47c9f42485aab64c0cfb63ed32\\\\",\\\\"license\\\\":\\\\"GPL-3.0-or-later\\\\"}},\\\\"version\\\\":1}","bytecode":"0x60e060405260646005553480156200001657600080fd5b5060405162001e2538038062001e2583398101604081905262000039916200010c565b848484600a84866200004b33620000bc565b60018055600480546001600160a01b0319166001600160a01b038616179055606086811b6001600160601b03199081166080529086901b1660a0526002805460ff191660ff85161790556003829055620000a781600a620001ce565b60c05250620002cb9950505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600060a086880312156200012557600080fd5b85516200013281620002b2565b60208701519095506200014581620002b2565b60408701519094506200015881620002b2565b606087015190935060ff811681146200017057600080fd5b80925050608086015190509295509295909350565b600181815b80851115620001c6578160001904821115620001aa57620001aa6200029c565b80851615620001b857918102915b93841c93908002906200018a565b509250929050565b6000620001df60ff841683620001e6565b9392505050565b600082620001f75750600162000296565b81620002065750600062000296565b81600181146200021f57600281146200022a576200024a565b600191505062000296565b60ff8411156200023e576200023e6200029c565b50506001821b62000296565b5060208310610133831016604e8410600b84101617156200026f575081810a62000296565b6200027b838362000185565b80600019048211156200029257620002926200029c565b0290505b92915050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114620002c857600080fd5b50565b60805160601c60a05160601c60c051611aa66200037f6000396000818161105101528181611090015281816110cf015261125c015260008181610212015281816111bd01526112dc015260008181610115015281816103fb015281816105cf015281816106000152818161078f015281816108da015281816109be015281816109e001528181610acf01528181610d2e01528181610dbf01528181610e5001528181610ee10152610fb10152611aa66000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063b07f0a41116100a2578063d3d5c12111610071578063d3d5c1211461023c578063d6c8d1b414610245578063da3c1a7614610299578063dcaf9c44146102ac578063f2fde38b146102cb57600080fd5b8063b07f0a41146101f1578063b4f40c6114610204578063b888879e1461020d578063d03d4aee1461023457600080fd5b8063715018a6116100de578063715018a6146101a45780637632bffb146101ac5780638da5cb5b146101cd578063a6138ed9146101de57600080fd5b806316f0115b1461011057806327ea6f2b14610154578063370a6ae61461016957806367de8be914610191575b600080fd5b6101377f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016761016236600461175f565b6102de565b005b61017c610177366004611791565b61034c565b6040805192835260208301919091520161014b565b61016761019f36600461175f565b610376565b6101676103a5565b6101bf6101ba36600461175f565b6103db565b60405190815260200161014b565b6000546001600160a01b0316610137565b600454610137906001600160a01b031681565b6101676101ff36600461175f565b6103ec565b6101bf60055481565b6101377f000000000000000000000000000000000000000000000000000000000000000081565b6101bf610777565b6101bf60035481565b61027961025336600461175f565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b0393841681529290911660208301520161014b565b6101bf6102a73660046116e2565b610816565b6002546102b99060ff1681565b60405160ff909116815260200161014b565b6101676102d93660046116a8565b610bec565b6000546001600160a01b031633146103115760405162461bcd60e51b815260040161030890611886565b60405180910390fd5b60038190556040518181527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a150565b6000806103608563ffffffff168585610c87565b915061036c8584610d29565b9050935093915050565b6000546001600160a01b031633146103a05760405162461bcd60e51b815260040161030890611886565b600555565b6000546001600160a01b031633146103cf5760405162461bcd60e51b815260040161030890611886565b6103d96000611108565b565b60006103e682611158565b92915050565b60006103f782611158565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561045257600080fd5b505afa158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a91906116c5565b60405163430c208160e01b8152336004820152602481018490526001600160a01b03919091169063430c20819060440160206040518083038186803b1580156104d257600080fd5b505afa1580156104e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a919061173d565b6105735760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b6064820152608401610308565b600081116105cd5760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b6064820152608401610308565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f91906116c5565b6001600160a01b0316636352211e876040518263ffffffff1660e01b81526004016106bc91815260200190565b60206040518083038186803b1580156106d457600080fd5b505afa1580156106e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070c91906116c5565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b15801561075b57600080fd5b505af115801561076f573d6000803e3d6000fd5b505050505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b1580156107d957600080fd5b505afa1580156107ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108119190611778565b905090565b60006002600154141561086b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610308565b6002600155816108805761087d6112d7565b91505b600061089c8563ffffffff16856001600160801b031685610c87565b905060006108ab858786611376565b600354604051634485558360e01b8152306004820152919250906001600160801b038316906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561091c57600080fd5b505afa158015610930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109549190611778565b61095e91906118bb565b11156109b85760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b6064820152608401610308565b610a80337f0000000000000000000000000000000000000000000000000000000000000000847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906116c5565b6001600160a01b0316929190611433565b6000610a9263ffffffff8816426118bb565b60405163d6a6367760e01b81526001600160a01b038a811660048301526001600160801b038516602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190611778565b6040805180820182526001600160801b038981168083528982166020808501918252600087815260068252869020945191518416600160801b0291909316179092558251918252810186905290810187905263ffffffff8316606082015290945084907f1cc09915b693fed5c1f699371120d74d3bf06b9f2392d13cd6b001437f3725069060800160405180910390a250506001805550949350505050565b6000546001600160a01b03163314610c165760405162461bcd60e51b815260040161030890611886565b6001600160a01b038116610c7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610308565b610c8481611108565b50565b600081610c9957610c966112d7565b91505b6004805460405163055bc75d60e21b815291820186905260248201859052604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190611778565b949350505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8557600080fd5b505afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190611778565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1657600080fd5b505afa158015610e2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4e9190611778565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ea757600080fd5b505afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf9190611778565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190611778565b610f7a91906118bb565b610f849190611a02565b610f8e9190611a02565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b158015610ff357600080fd5b505afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b9190611778565b6003546110389190611a02565b90508361104a576110476112d7565b93505b60006110777f00000000000000000000000000000000000000000000000000000000000000008787611376565b6001600160801b03169050828211156110c957806110b57f0000000000000000000000000000000000000000000000000000000000000000856119e3565b6110bf91906118d3565b93505050506103e6565b806110f47f0000000000000000000000000000000000000000000000000000000000000000846119e3565b6110fe91906118d3565b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152816111986112d7565b905081602001516001600160801b03168111156111b9575060009392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611814565b61125790600a611938565b9050807f0000000000000000000000000000000000000000000000000000000000000000620f424085600001516001600160801b03168587602001516001600160801b03166112a69190611a02565b6112b091906119e3565b6112ba91906119e3565b6112c491906118d3565b6112ce91906118d3565b95945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561133357600080fd5b505afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b91906117c4565b509195945050505050565b6005546004805460405163055bc75d60e21b815263ffffffff8616928101929092526001600160801b03861660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b1580156113e057600080fd5b505afa1580156113f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114189190611778565b61142291906119e3565b610d2191906118d3565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261148d908590611493565b50505050565b60006114e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661156a9092919063ffffffff16565b8051909150156115655780806020019051810190611506919061173d565b6115655760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610308565b505050565b6060610d21848460008585843b6115c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610308565b600080866001600160a01b031685876040516115df9190611837565b60006040518083038185875af1925050503d806000811461161c576040519150601f19603f3d011682016040523d82523d6000602084013e611621565b606091505b509150915061163182828661163c565b979650505050505050565b6060831561164b57508161142c565b82511561165b5782518084602001fd5b8160405162461bcd60e51b81526004016103089190611853565b803563ffffffff8116811461168957600080fd5b919050565b805169ffffffffffffffffffff8116811461168957600080fd5b6000602082840312156116ba57600080fd5b813561142c81611a5b565b6000602082840312156116d757600080fd5b815161142c81611a5b565b600080600080608085870312156116f857600080fd5b843561170381611a5b565b935061171160208601611675565b925060408501356001600160801b038116811461172d57600080fd5b9396929550929360600135925050565b60006020828403121561174f57600080fd5b8151801515811461142c57600080fd5b60006020828403121561177157600080fd5b5035919050565b60006020828403121561178a57600080fd5b5051919050565b6000806000606084860312156117a657600080fd5b6117af84611675565b95602085013595506040909401359392505050565b600080600080600060a086880312156117dc57600080fd5b6117e58661168e565b94506020860151935060408601519250606086015191506118086080870161168e565b90509295509295909350565b60006020828403121561182657600080fd5b815160ff8116811461142c57600080fd5b60008251611849818460208701611a19565b9190910192915050565b6020815260008251806020840152611872816040850160208701611a19565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156118ce576118ce611a45565b500190565b6000826118f057634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561193057816000190482111561191657611916611a45565b8085161561192357918102915b93841c93908002906118fa565b509250929050565b600061142c60ff841683600082611951575060016103e6565b8161195e575060006103e6565b8160018114611974576002811461197e5761199a565b60019150506103e6565b60ff84111561198f5761198f611a45565b50506001821b6103e6565b5060208310610133831016604e8410600b84101617156119bd575081810a6103e6565b6119c783836118f5565b80600019048211156119db576119db611a45565b029392505050565b60008160001904831182151516156119fd576119fd611a45565b500290565b600082821015611a1457611a14611a45565b500390565b60005b83811015611a34578181015183820152602001611a1c565b8381111561148d5750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610c8457600080fdfea26469706673582212207b159de1f7da3481265d54b587c9db3e700186c6bd1b588653bfce642f8927b864736f6c63430008060033","deployedBytecode":"0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063b07f0a41116100a2578063d3d5c12111610071578063d3d5c1211461023c578063d6c8d1b414610245578063da3c1a7614610299578063dcaf9c44146102ac578063f2fde38b146102cb57600080fd5b8063b07f0a41146101f1578063b4f40c6114610204578063b888879e1461020d578063d03d4aee1461023457600080fd5b8063715018a6116100de578063715018a6146101a45780637632bffb146101ac5780638da5cb5b146101cd578063a6138ed9146101de57600080fd5b806316f0115b1461011057806327ea6f2b14610154578063370a6ae61461016957806367de8be914610191575b600080fd5b6101377f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61016761016236600461175f565b6102de565b005b61017c610177366004611791565b61034c565b6040805192835260208301919091520161014b565b61016761019f36600461175f565b610376565b6101676103a5565b6101bf6101ba36600461175f565b6103db565b60405190815260200161014b565b6000546001600160a01b0316610137565b600454610137906001600160a01b031681565b6101676101ff36600461175f565b6103ec565b6101bf60055481565b6101377f000000000000000000000000000000000000000000000000000000000000000081565b6101bf610777565b6101bf60035481565b61027961025336600461175f565b6006602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b0393841681529290911660208301520161014b565b6101bf6102a73660046116e2565b610816565b6002546102b99060ff1681565b60405160ff909116815260200161014b565b6101676102d93660046116a8565b610bec565b6000546001600160a01b031633146103115760405162461bcd60e51b815260040161030890611886565b60405180910390fd5b60038190556040518181527f479881bf41e329f328c21c2cbb11514b05a021cd33ea4e5a576ea6bc03874fd69060200160405180910390a150565b6000806103608563ffffffff168585610c87565b915061036c8584610d29565b9050935093915050565b6000546001600160a01b031633146103a05760405162461bcd60e51b815260040161030890611886565b600555565b6000546001600160a01b031633146103cf5760405162461bcd60e51b815260040161030890611886565b6103d96000611108565b565b60006103e682611158565b92915050565b60006103f782611158565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561045257600080fd5b505afa158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a91906116c5565b60405163430c208160e01b8152336004820152602481018490526001600160a01b03919091169063430c20819060440160206040518083038186803b1580156104d257600080fd5b505afa1580156104e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050a919061173d565b6105735760405162461bcd60e51b815260206004820152603460248201527f486567696353747261746567793a204d73672e73656e6465722063616e27742060448201527332bc32b931b4b9b2903a3434b99037b83a34b7b760611b6064820152608401610308565b600081116105cd5760405162461bcd60e51b815260206004820152602160248201527f486567696353747261746567793a205468652070726f666974206973207a65726044820152606f60f81b6064820152608401610308565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638127f0a183837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561065757600080fd5b505afa15801561066b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068f91906116c5565b6001600160a01b0316636352211e876040518263ffffffff1660e01b81526004016106bc91815260200190565b60206040518083038186803b1580156106d457600080fd5b505afa1580156106e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070c91906116c5565b6040516001600160e01b031960e086901b168152600481019390935260248301919091526001600160a01b03166044820152606401600060405180830381600087803b15801561075b57600080fd5b505af115801561076f573d6000803e3d6000fd5b505050505050565b604051634485558360e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063448555839060240160206040518083038186803b1580156107d957600080fd5b505afa1580156107ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108119190611778565b905090565b60006002600154141561086b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610308565b6002600155816108805761087d6112d7565b91505b600061089c8563ffffffff16856001600160801b031685610c87565b905060006108ab858786611376565b600354604051634485558360e01b8152306004820152919250906001600160801b038316906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b15801561091c57600080fd5b505afa158015610930573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109549190611778565b61095e91906118bb565b11156109b85760405162461bcd60e51b8152602060048201526024808201527f486567696353747261746567793a20546865206c696d697420697320657863656044820152631959195960e21b6064820152608401610308565b610a80337f0000000000000000000000000000000000000000000000000000000000000000847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906116c5565b6001600160a01b0316929190611433565b6000610a9263ffffffff8816426118bb565b60405163d6a6367760e01b81526001600160a01b038a811660048301526001600160801b038516602483015263ffffffff831660448301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063d6a6367790606401602060405180830381600087803b158015610b1557600080fd5b505af1158015610b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4d9190611778565b6040805180820182526001600160801b038981168083528982166020808501918252600087815260068252869020945191518416600160801b0291909316179092558251918252810186905290810187905263ffffffff8316606082015290945084907f1cc09915b693fed5c1f699371120d74d3bf06b9f2392d13cd6b001437f3725069060800160405180910390a250506001805550949350505050565b6000546001600160a01b03163314610c165760405162461bcd60e51b815260040161030890611886565b6001600160a01b038116610c7b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610308565b610c8481611108565b50565b600081610c9957610c966112d7565b91505b6004805460405163055bc75d60e21b815291820186905260248201859052604482018490526001600160a01b03169063156f1d749060640160206040518083038186803b158015610ce957600080fd5b505afa158015610cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d219190611778565b949350505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663797be55e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8557600080fd5b505afa158015610d99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbd9190611778565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663568914126040518163ffffffff1660e01b815260040160206040518083038186803b158015610e1657600080fd5b505afa158015610e2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4e9190611778565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad7a672f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610ea757600080fd5b505afa158015610ebb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610edf9190611778565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166346067d696040518163ffffffff1660e01b815260040160206040518083038186803b158015610f3857600080fd5b505afa158015610f4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f709190611778565b610f7a91906118bb565b610f849190611a02565b610f8e9190611a02565b604051634485558360e01b81523060048201529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063448555839060240160206040518083038186803b158015610ff357600080fd5b505afa158015611007573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102b9190611778565b6003546110389190611a02565b90508361104a576110476112d7565b93505b60006110777f00000000000000000000000000000000000000000000000000000000000000008787611376565b6001600160801b03169050828211156110c957806110b57f0000000000000000000000000000000000000000000000000000000000000000856119e3565b6110bf91906118d3565b93505050506103e6565b806110f47f0000000000000000000000000000000000000000000000000000000000000000846119e3565b6110fe91906118d3565b9695505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008181526006602090815260408083208151808301909252546001600160801b038082168352600160801b9091041691810191909152816111986112d7565b905081602001516001600160801b03168111156111b9575060009392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561121457600080fd5b505afa158015611228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124c9190611814565b61125790600a611938565b9050807f0000000000000000000000000000000000000000000000000000000000000000620f424085600001516001600160801b03168587602001516001600160801b03166112a69190611a02565b6112b091906119e3565b6112ba91906119e3565b6112c491906118d3565b6112ce91906118d3565b95945050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561133357600080fd5b505afa158015611347573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136b91906117c4565b509195945050505050565b6005546004805460405163055bc75d60e21b815263ffffffff8616928101929092526001600160801b03861660248301526044820184905260009260649290916001600160a01b03169063156f1d7490840160206040518083038186803b1580156113e057600080fd5b505afa1580156113f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114189190611778565b61142291906119e3565b610d2191906118d3565b9392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261148d908590611493565b50505050565b60006114e8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661156a9092919063ffffffff16565b8051909150156115655780806020019051810190611506919061173d565b6115655760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610308565b505050565b6060610d21848460008585843b6115c35760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610308565b600080866001600160a01b031685876040516115df9190611837565b60006040518083038185875af1925050503d806000811461161c576040519150601f19603f3d011682016040523d82523d6000602084013e611621565b606091505b509150915061163182828661163c565b979650505050505050565b6060831561164b57508161142c565b82511561165b5782518084602001fd5b8160405162461bcd60e51b81526004016103089190611853565b803563ffffffff8116811461168957600080fd5b919050565b805169ffffffffffffffffffff8116811461168957600080fd5b6000602082840312156116ba57600080fd5b813561142c81611a5b565b6000602082840312156116d757600080fd5b815161142c81611a5b565b600080600080608085870312156116f857600080fd5b843561170381611a5b565b935061171160208601611675565b925060408501356001600160801b038116811461172d57600080fd5b9396929550929360600135925050565b60006020828403121561174f57600080fd5b8151801515811461142c57600080fd5b60006020828403121561177157600080fd5b5035919050565b60006020828403121561178a57600080fd5b5051919050565b6000806000606084860312156117a657600080fd5b6117af84611675565b95602085013595506040909401359392505050565b600080600080600060a086880312156117dc57600080fd5b6117e58661168e565b94506020860151935060408601519250606086015191506118086080870161168e565b90509295509295909350565b60006020828403121561182657600080fd5b815160ff8116811461142c57600080fd5b60008251611849818460208701611a19565b9190910192915050565b6020815260008251806020840152611872816040850160208701611a19565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600082198211156118ce576118ce611a45565b500190565b6000826118f057634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561193057816000190482111561191657611916611a45565b8085161561192357918102915b93841c93908002906118fa565b509250929050565b600061142c60ff841683600082611951575060016103e6565b8161195e575060006103e6565b8160018114611974576002811461197e5761199a565b60019150506103e6565b60ff84111561198f5761198f611a45565b50506001821b6103e6565b5060208310610133831016604e8410600b84101617156119bd575081810a6103e6565b6119c783836118f5565b80600019048211156119db576119db611a45565b029392505050565b60008160001904831182151516156119fd576119fd611a45565b500290565b600082821015611a1457611a14611a45565b500390565b60005b83811015611a34578181015183820152602001611a1c565b8381111561148d5750506000910152565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610c8457600080fdfea26469706673582212207b159de1f7da3481265d54b587c9db3e700186c6bd1b588653bfce642f8927b864736f6c63430008060033","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/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"_owner","offset":0,"slot":"0","type":"t_address"},{"astId":810,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"_status","offset":0,"slot":"1","type":"t_uint256"},{"astId":15858,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"collateralizationRatio","offset":0,"slot":"2","type":"t_uint8"},{"astId":15861,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"lockedLimit","offset":0,"slot":"3","type":"t_uint256"},{"astId":15864,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"pricer","offset":0,"slot":"4","type":"t_contract(IPremiumCalculator)7391"},{"astId":15872,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"k","offset":0,"slot":"5","type":"t_uint256"},{"astId":15882,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"strategyData","offset":0,"slot":"6","type":"t_mapping(t_uint256,t_struct(StrategyData)15877_storage)"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_contract(IPremiumCalculator)7391":{"encoding":"inplace","label":"contract IPremiumCalculator","numberOfBytes":"20"},"t_mapping(t_uint256,t_struct(StrategyData)15877_storage)":{"encoding":"mapping","key":"t_uint256","label":"mapping(uint256 => struct HegicStrategy.StrategyData)","numberOfBytes":"32","value":"t_struct(StrategyData)15877_storage"},"t_struct(StrategyData)15877_storage":{"encoding":"inplace","label":"struct HegicStrategy.StrategyData","members":[{"astId":15874,"contract":"contracts/Pool/HegicStrategyPut.sol:HegicStrategyPut","label":"amount","offset":0,"slot":"0","type":"t_uint128"},{"astId":15876,"contract":"contracts/Pool/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/HegicStrategyAtmPutETH_v0.json?')}}]);