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