{
  "address": "0xD36Ac9Ff5562abb541F51345f340FB650547a661",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keep3rV2",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_governance",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "InvalidKp3rPool",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LiquidityPairInvalid",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoGovernanceZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyGovernance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyPendingGovernance",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_pendingGovernance",
          "type": "address"
        }
      ],
      "name": "GovernanceProposal",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_governance",
          "type": "address"
        }
      ],
      "name": "GovernanceSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_keep3rV2",
          "type": "address"
        }
      ],
      "name": "Keep3rV2Change",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_address",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "_isKP3RToken0",
          "type": "bool"
        }
      ],
      "name": "Kp3rWethPoolChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_maxBoost",
          "type": "uint256"
        }
      ],
      "name": "MaxBoostChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_minBoost",
          "type": "uint256"
        }
      ],
      "name": "MinBoostChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "_quoteTwapTime",
          "type": "uint32"
        }
      ],
      "name": "QuoteTwapTimeChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_targetBond",
          "type": "uint256"
        }
      ],
      "name": "TargetBondChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_workExtraGas",
          "type": "uint256"
        }
      ],
      "name": "WorkExtraGasChange",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "BOOST_BASE",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "KP3R",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptGovernance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        }
      ],
      "name": "bonds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_amountBonded",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_liquidityAmount",
          "type": "uint256"
        },
        {
          "internalType": "int56",
          "name": "_tickDifference",
          "type": "int56"
        },
        {
          "internalType": "uint256",
          "name": "_timeInterval",
          "type": "uint256"
        }
      ],
      "name": "getKP3RsAtTick",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_kp3rAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_bonds",
          "type": "uint256"
        }
      ],
      "name": "getPaymentParams",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_boost",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_oneEthQuote",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_extra",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_pool",
          "type": "address"
        }
      ],
      "name": "getPoolTokens",
      "outputs": [
        {
          "internalType": "address",
          "name": "_token0",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_token1",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint128",
          "name": "_baseAmount",
          "type": "uint128"
        },
        {
          "internalType": "int56",
          "name": "_tickDifference",
          "type": "int56"
        },
        {
          "internalType": "uint256",
          "name": "_timeInterval",
          "type": "uint256"
        }
      ],
      "name": "getQuoteAtTick",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_quoteAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_gasUsed",
          "type": "uint256"
        }
      ],
      "name": "getRewardAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasUsed",
          "type": "uint256"
        }
      ],
      "name": "getRewardAmountFor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_kp3r",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_bonds",
          "type": "uint256"
        }
      ],
      "name": "getRewardBoostFor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_rewardBoost",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "governance",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_pool",
          "type": "address"
        }
      ],
      "name": "isKP3RToken0",
      "outputs": [
        {
          "internalType": "bool",
          "name": "_isKP3RToken0",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "keep3rV2",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "kp3rWethPool",
      "outputs": [
        {
          "internalType": "address",
          "name": "poolAddress",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isKP3RToken0",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxBoost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minBoost",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_pool",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "_secondsAgo",
          "type": "uint32[]"
        }
      ],
      "name": "observe",
      "outputs": [
        {
          "internalType": "int56",
          "name": "_tickCumulative1",
          "type": "int56"
        },
        {
          "internalType": "int56",
          "name": "_tickCumulative2",
          "type": "int56"
        },
        {
          "internalType": "bool",
          "name": "_success",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingGovernance",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_eth",
          "type": "uint256"
        }
      ],
      "name": "quote",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_amountOut",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "quoteTwapTime",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_governance",
          "type": "address"
        }
      ],
      "name": "setGovernance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keep3rV2",
          "type": "address"
        }
      ],
      "name": "setKeep3rV2",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_poolAddress",
          "type": "address"
        }
      ],
      "name": "setKp3rWethPool",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_maxBoost",
          "type": "uint256"
        }
      ],
      "name": "setMaxBoost",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_minBoost",
          "type": "uint256"
        }
      ],
      "name": "setMinBoost",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_quoteTwapTime",
          "type": "uint32"
        }
      ],
      "name": "setQuoteTwapTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_targetBond",
          "type": "uint256"
        }
      ],
      "name": "setTargetBond",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_workExtraGas",
          "type": "uint256"
        }
      ],
      "name": "setWorkExtraGas",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "targetBond",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "workExtraGas",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x6fd953802a5823400833bc4194cc22ae1450ed664b0768ea4dfcc3c674183a4a",
  "receipt": {
    "to": null,
    "from": "0x54054EA2db6eDC336cB87966815FD66Cc337f224",
    "contractAddress": "0xD36Ac9Ff5562abb541F51345f340FB650547a661",
    "transactionIndex": 215,
    "gasUsed": "1730918",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x5bf3ae13d15a8e7b25e67749025a2fd968d810527b09ef7cc481a497bd6521bc",
    "transactionHash": "0x6fd953802a5823400833bc4194cc22ae1450ed664b0768ea4dfcc3c674183a4a",
    "logs": [],
    "blockNumber": 14524581,
    "cumulativeGasUsed": "24579260",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xeb02addCfD8B773A5FFA6B9d1FE99c566f8c44CC",
    "0x0D5Dc686d0a2ABBfDaFDFb4D0533E886517d4E83"
  ],
  "numDeployments": 2,
  "solcInputHash": "b8876691210a06f2046b37f0b14142fa",
  "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keep3rV2\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidKp3rPool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityPairInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoGovernanceZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyGovernance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPendingGovernance\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_pendingGovernance\",\"type\":\"address\"}],\"name\":\"GovernanceProposal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"}],\"name\":\"GovernanceSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_keep3rV2\",\"type\":\"address\"}],\"name\":\"Keep3rV2Change\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isKP3RToken0\",\"type\":\"bool\"}],\"name\":\"Kp3rWethPoolChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_maxBoost\",\"type\":\"uint256\"}],\"name\":\"MaxBoostChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_minBoost\",\"type\":\"uint256\"}],\"name\":\"MinBoostChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"_quoteTwapTime\",\"type\":\"uint32\"}],\"name\":\"QuoteTwapTimeChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_targetBond\",\"type\":\"uint256\"}],\"name\":\"TargetBondChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_workExtraGas\",\"type\":\"uint256\"}],\"name\":\"WorkExtraGasChange\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BOOST_BASE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KP3R\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"}],\"name\":\"bonds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_amountBonded\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityAmount\",\"type\":\"uint256\"},{\"internalType\":\"int56\",\"name\":\"_tickDifference\",\"type\":\"int56\"},{\"internalType\":\"uint256\",\"name\":\"_timeInterval\",\"type\":\"uint256\"}],\"name\":\"getKP3RsAtTick\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_kp3rAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bonds\",\"type\":\"uint256\"}],\"name\":\"getPaymentParams\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_boost\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_oneEthQuote\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_extra\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pool\",\"type\":\"address\"}],\"name\":\"getPoolTokens\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"_token0\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token1\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"_baseAmount\",\"type\":\"uint128\"},{\"internalType\":\"int56\",\"name\":\"_tickDifference\",\"type\":\"int56\"},{\"internalType\":\"uint256\",\"name\":\"_timeInterval\",\"type\":\"uint256\"}],\"name\":\"getQuoteAtTick\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_quoteAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasUsed\",\"type\":\"uint256\"}],\"name\":\"getRewardAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasUsed\",\"type\":\"uint256\"}],\"name\":\"getRewardAmountFor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_kp3r\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bonds\",\"type\":\"uint256\"}],\"name\":\"getRewardBoostFor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_rewardBoost\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pool\",\"type\":\"address\"}],\"name\":\"isKP3RToken0\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_isKP3RToken0\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"keep3rV2\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kp3rWethPool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"poolAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isKP3RToken0\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxBoost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minBoost\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pool\",\"type\":\"address\"},{\"internalType\":\"uint32[]\",\"name\":\"_secondsAgo\",\"type\":\"uint32[]\"}],\"name\":\"observe\",\"outputs\":[{\"internalType\":\"int56\",\"name\":\"_tickCumulative1\",\"type\":\"int56\"},{\"internalType\":\"int56\",\"name\":\"_tickCumulative2\",\"type\":\"int56\"},{\"internalType\":\"bool\",\"name\":\"_success\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingGovernance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_eth\",\"type\":\"uint256\"}],\"name\":\"quote\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_amountOut\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quoteTwapTime\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"}],\"name\":\"setGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keep3rV2\",\"type\":\"address\"}],\"name\":\"setKeep3rV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_poolAddress\",\"type\":\"address\"}],\"name\":\"setKp3rWethPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxBoost\",\"type\":\"uint256\"}],\"name\":\"setMaxBoost\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minBoost\",\"type\":\"uint256\"}],\"name\":\"setMinBoost\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_quoteTwapTime\",\"type\":\"uint32\"}],\"name\":\"setQuoteTwapTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_targetBond\",\"type\":\"uint256\"}],\"name\":\"setTargetBond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_workExtraGas\",\"type\":\"uint256\"}],\"name\":\"setWorkExtraGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"targetBond\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"workExtraGas\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"bonds(address)\":{\"params\":{\"_keeper\":\"The address of the keeper to check\"},\"returns\":{\"_amountBonded\":\"The amount of KP3R the keeper has bonded\"}},\"getKP3RsAtTick(uint256,int56,uint256)\":{\"params\":{\"_liquidityAmount\":\"Amount of liquidity to be converted\",\"_tickDifference\":\"Tick value used to calculate the quote\",\"_timeInterval\":\"Time value used to calculate the quote\"},\"returns\":{\"_kp3rAmount\":\"Amount of KP3R tokens underlying on the given liquidity\"}},\"getPaymentParams(uint256)\":{\"params\":{\"_bonds\":\"Amount of bonded KP3R owned by the keeper\"},\"returns\":{\"_boost\":\"Multiplier per gas unit. Takes into account the base fee and the amount of bonded KP3R\",\"_extra\":\"Amount of extra gas that should be added to the gas spent\",\"_oneEthQuote\":\"Amount of KP3R tokens equivalent to 1 ETH\"}},\"getPoolTokens(address)\":{\"params\":{\"_pool\":\"Address of the correspondant pool\"},\"returns\":{\"_token0\":\"Address of the first token of the pair\",\"_token1\":\"Address of the second token of the pair\"}},\"getQuoteAtTick(uint128,int56,uint256)\":{\"params\":{\"_baseAmount\":\"Amount of token to be converted\",\"_tickDifference\":\"Tick value used to calculate the quote\",\"_timeInterval\":\"Time value used to calculate the quote\"},\"returns\":{\"_quoteAmount\":\"Amount of credits deserved for the baseAmount at the tick value\"}},\"getRewardAmount(uint256)\":{\"params\":{\"_gasUsed\":\"The amount of gas used that will be rewarded\"},\"returns\":{\"_amount\":\"The amount of KP3R that should be awarded to tx.origin\"}},\"getRewardAmountFor(address,uint256)\":{\"params\":{\"_gasUsed\":\"The amount of gas used that will be rewarded\",\"_keeper\":\"The address of the keeper to check\"},\"returns\":{\"_kp3r\":\"The amount of KP3R that should be awarded to the keeper\"}},\"getRewardBoostFor(uint256)\":{\"params\":{\"_bonds\":\"The amount of KP3R tokens bonded by the keeper\"},\"returns\":{\"_rewardBoost\":\"The reward boost that corresponds to the keeper\"}},\"isKP3RToken0(address)\":{\"params\":{\"_pool\":\"Address of the correspondant pool\"},\"returns\":{\"_isKP3RToken0\":\"Boolean indicating the order of the tokens in the pair\"}},\"observe(address,uint32[])\":{\"params\":{\"_pool\":\"Address of the pool to observe\",\"_secondsAgo\":\"Array with time references to observe\"},\"returns\":{\"_success\":\"Boolean indicating if the observe call was succesfull\",\"_tickCumulative1\":\"Cummulative sum of ticks until first time reference\",\"_tickCumulative2\":\"Cummulative sum of ticks until second time reference\"}},\"quote(uint256)\":{\"details\":\"This function allows us to calculate how much KP3R we should pay to a keeper for things expressed in ETH, like gas\",\"params\":{\"_eth\":\"The amount of ETH\"},\"returns\":{\"_amountOut\":\"The amount of KP3R\"}},\"setGovernance(address)\":{\"params\":{\"_governance\":\"The address being proposed as the new governance\"}},\"setKeep3rV2(address)\":{\"params\":{\"_keep3rV2\":\"The address of Keep3r V2\"}},\"setKp3rWethPool(address)\":{\"params\":{\"_poolAddress\":\"The address of the KP3R-WETH pool\"}},\"setMaxBoost(uint256)\":{\"params\":{\"_maxBoost\":\"The maximum boost multiplier\"}},\"setMinBoost(uint256)\":{\"params\":{\"_minBoost\":\"The minimum boost multiplier\"}},\"setQuoteTwapTime(uint32)\":{\"params\":{\"_quoteTwapTime\":\"The twap time for quoting\"}},\"setTargetBond(uint256)\":{\"params\":{\"_targetBond\":\"The target bond amount\"}},\"setWorkExtraGas(uint256)\":{\"params\":{\"_workExtraGas\":\"The work extra gas\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"InvalidKp3rPool()\":[{\"notice\":\"Throws when pool does not have KP3R as token0 nor token1\"}],\"LiquidityPairInvalid()\":[{\"notice\":\"Throws when none of the tokens in the liquidity pair is KP3R\"}],\"NoGovernanceZeroAddress()\":[{\"notice\":\"Throws if trying to set governance to zero address\"}],\"OnlyGovernance()\":[{\"notice\":\"Throws if the caller of the function is not governance\"}],\"OnlyPendingGovernance()\":[{\"notice\":\"Throws if the caller of the function is not pendingGovernance\"}]},\"events\":{\"GovernanceProposal(address)\":{\"notice\":\"Emitted when a new governance is proposed\"},\"GovernanceSet(address)\":{\"notice\":\"Emitted when pendingGovernance accepts to be governance\"},\"Keep3rV2Change(address)\":{\"notice\":\"Emitted when the Keep3r V2 address is changed\"},\"Kp3rWethPoolChange(address,bool)\":{\"notice\":\"Emitted when the kp3r weth pool is changed\"},\"MaxBoostChange(uint256)\":{\"notice\":\"Emitted when the maximum boost multiplier is changed\"},\"MinBoostChange(uint256)\":{\"notice\":\"Emitted when the minimum boost multiplier is changed\"},\"QuoteTwapTimeChange(uint32)\":{\"notice\":\"Emitted when the quote twap time is changed\"},\"TargetBondChange(uint256)\":{\"notice\":\"Emitted when the target bond amount is changed\"},\"WorkExtraGasChange(uint256)\":{\"notice\":\"Emitted when the work extra gas amount is changed\"}},\"kind\":\"user\",\"methods\":{\"BOOST_BASE()\":{\"notice\":\"The boost base used to calculate the boost rewards for the keeper\"},\"KP3R()\":{\"notice\":\"Address of KP3R token\"},\"acceptGovernance()\":{\"notice\":\"Changes the governance from the current governance to the previously proposed address\"},\"bonds(address)\":{\"notice\":\"Returns the amount of KP3R the keeper has bonded\"},\"getKP3RsAtTick(uint256,int56,uint256)\":{\"notice\":\"Given a tick and a liquidity amount, calculates the underlying KP3R tokens\"},\"getPaymentParams(uint256)\":{\"notice\":\"Get multiplier, quote, and extra, in order to calculate keeper payment\"},\"getPoolTokens(address)\":{\"notice\":\"Given a pool address, returns the underlying tokens of the pair\"},\"getQuoteAtTick(uint128,int56,uint256)\":{\"notice\":\"Given a tick and a token amount, calculates the output in correspondant token\"},\"getRewardAmount(uint256)\":{\"notice\":\"Calculates the reward (in KP3R) that corresponds to tx.origin for using gas\"},\"getRewardAmountFor(address,uint256)\":{\"notice\":\"Calculates the reward (in KP3R) that corresponds to a keeper for using gas\"},\"getRewardBoostFor(uint256)\":{\"notice\":\"Calculates the boost in the reward given to a keeper based on the amount of KP3R that keeper has bonded\"},\"governance()\":{\"notice\":\"Stores the governance address\"},\"isKP3RToken0(address)\":{\"notice\":\"Defines the order of the tokens in the pair for twap calculations\"},\"keep3rV2()\":{\"notice\":\"Address of Keep3r V2\"},\"kp3rWethPool()\":{\"notice\":\"KP3R-WETH pool that is being used as oracle\"},\"maxBoost()\":{\"notice\":\"The maximum multiplier used to calculate the amount of gas paid to the Keeper for the gas used to perform a job         For example: if the quoted gas used is 1000, then the maximum amount to be paid will be 1000 * maxBoost / BOOST_BASE\"},\"minBoost()\":{\"notice\":\"The minimum multiplier used to calculate the amount of gas paid to the Keeper for the gas used to perform a job         For example: if the quoted gas used is 1000, then the minimum amount to be paid will be 1000 * minBoost / BOOST_BASE\"},\"observe(address,uint32[])\":{\"notice\":\"Given an array of secondsAgo, returns UniswapV3 pool cumulatives at that moment\"},\"pendingGovernance()\":{\"notice\":\"Stores the pendingGovernance address\"},\"quote(uint256)\":{\"notice\":\"Calculates the amount of KP3R that corresponds to the ETH passed into the function\"},\"quoteTwapTime()\":{\"notice\":\"The twap time for quoting\"},\"setGovernance(address)\":{\"notice\":\"Proposes a new address to be governance\"},\"setKeep3rV2(address)\":{\"notice\":\"Sets the Keep3r V2 address\"},\"setKp3rWethPool(address)\":{\"notice\":\"Sets KP3R-WETH pool\"},\"setMaxBoost(uint256)\":{\"notice\":\"Sets the maximum boost multiplier\"},\"setMinBoost(uint256)\":{\"notice\":\"Sets the minimum boost multiplier\"},\"setQuoteTwapTime(uint32)\":{\"notice\":\"Sets the quote twap time\"},\"setTargetBond(uint256)\":{\"notice\":\"Sets the target bond amount\"},\"setWorkExtraGas(uint256)\":{\"notice\":\"Sets the work extra gas amount\"},\"targetBond()\":{\"notice\":\"The targeted amount of bonded KP3Rs to max-up reward multiplier         For example: if the amount of KP3R the keeper has bonded is targetBond or more, then the keeper will get                      the maximum boost possible in his rewards, if it's less, the reward boost will be proportional\"},\"workExtraGas()\":{\"notice\":\"The amount of unaccounted gas that is going to be added to keeper payments\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solidity/contracts/Keep3rHelper.sol\":\"Keep3rHelper\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":33},\"remappings\":[]},\"sources\":{\"@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/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    /**\\n     * @dev Returns the largest of two numbers.\\n     */\\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a >= b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the smallest of two numbers.\\n     */\\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n        return a < b ? a : b;\\n    }\\n\\n    /**\\n     * @dev Returns the average of two numbers. The result is rounded towards\\n     * zero.\\n     */\\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b) / 2 can overflow.\\n        return (a & b) + (a ^ b) / 2;\\n    }\\n\\n    /**\\n     * @dev Returns the ceiling of the division of two numbers.\\n     *\\n     * This differs from standard division with `/` in that it rounds up instead\\n     * of rounding down.\\n     */\\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n        // (a + b - 1) / b can overflow on addition, so we distribute.\\n        return a / b + (a % b == 0 ? 0 : 1);\\n    }\\n}\\n\",\"keccak256\":\"0x49ebdac5d515aebb95168564158940b79d7d5d12fbfe59cec546a00d57fee64a\",\"license\":\"MIT\"},\"@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\nimport './pool/IUniswapV3PoolImmutables.sol';\\nimport './pool/IUniswapV3PoolState.sol';\\nimport './pool/IUniswapV3PoolDerivedState.sol';\\nimport './pool/IUniswapV3PoolActions.sol';\\nimport './pool/IUniswapV3PoolOwnerActions.sol';\\nimport './pool/IUniswapV3PoolEvents.sol';\\n\\n/// @title The interface for a Uniswap V3 Pool\\n/// @notice A Uniswap pool facilitates swapping and automated market making between any two assets that strictly conform\\n/// to the ERC20 specification\\n/// @dev The pool interface is broken up into many smaller pieces\\ninterface IUniswapV3Pool is\\n    IUniswapV3PoolImmutables,\\n    IUniswapV3PoolState,\\n    IUniswapV3PoolDerivedState,\\n    IUniswapV3PoolActions,\\n    IUniswapV3PoolOwnerActions,\\n    IUniswapV3PoolEvents\\n{\\n\\n}\\n\",\"keccak256\":\"0xfe6113d518466cd6652c85b111e01f33eb62157f49ae5ed7d5a3947a2044adb1\",\"license\":\"GPL-2.0-or-later\"},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n/// @title Permissionless pool actions\\n/// @notice Contains pool methods that can be called by anyone\\ninterface IUniswapV3PoolActions {\\n    /// @notice Sets the initial price for the pool\\n    /// @dev Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value\\n    /// @param sqrtPriceX96 the initial sqrt price of the pool as a Q64.96\\n    function initialize(uint160 sqrtPriceX96) external;\\n\\n    /// @notice Adds liquidity for the given recipient/tickLower/tickUpper position\\n    /// @dev The caller of this method receives a callback in the form of IUniswapV3MintCallback#uniswapV3MintCallback\\n    /// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends\\n    /// on tickLower, tickUpper, the amount of liquidity, and the current price.\\n    /// @param recipient The address for which the liquidity will be created\\n    /// @param tickLower The lower tick of the position in which to add liquidity\\n    /// @param tickUpper The upper tick of the position in which to add liquidity\\n    /// @param amount The amount of liquidity to mint\\n    /// @param data Any data that should be passed through to the callback\\n    /// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback\\n    /// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback\\n    function mint(\\n        address recipient,\\n        int24 tickLower,\\n        int24 tickUpper,\\n        uint128 amount,\\n        bytes calldata data\\n    ) external returns (uint256 amount0, uint256 amount1);\\n\\n    /// @notice Collects tokens owed to a position\\n    /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.\\n    /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or\\n    /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the\\n    /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\\n    /// @param recipient The address which should receive the fees collected\\n    /// @param tickLower The lower tick of the position for which to collect fees\\n    /// @param tickUpper The upper tick of the position for which to collect fees\\n    /// @param amount0Requested How much token0 should be withdrawn from the fees owed\\n    /// @param amount1Requested How much token1 should be withdrawn from the fees owed\\n    /// @return amount0 The amount of fees collected in token0\\n    /// @return amount1 The amount of fees collected in token1\\n    function collect(\\n        address recipient,\\n        int24 tickLower,\\n        int24 tickUpper,\\n        uint128 amount0Requested,\\n        uint128 amount1Requested\\n    ) external returns (uint128 amount0, uint128 amount1);\\n\\n    /// @notice Burn liquidity from the sender and account tokens owed for the liquidity to the position\\n    /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0\\n    /// @dev Fees must be collected separately via a call to #collect\\n    /// @param tickLower The lower tick of the position for which to burn liquidity\\n    /// @param tickUpper The upper tick of the position for which to burn liquidity\\n    /// @param amount How much liquidity to burn\\n    /// @return amount0 The amount of token0 sent to the recipient\\n    /// @return amount1 The amount of token1 sent to the recipient\\n    function burn(\\n        int24 tickLower,\\n        int24 tickUpper,\\n        uint128 amount\\n    ) external returns (uint256 amount0, uint256 amount1);\\n\\n    /// @notice Swap token0 for token1, or token1 for token0\\n    /// @dev The caller of this method receives a callback in the form of IUniswapV3SwapCallback#uniswapV3SwapCallback\\n    /// @param recipient The address to receive the output of the swap\\n    /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0\\n    /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)\\n    /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this\\n    /// value after the swap. If one for zero, the price cannot be greater than this value after the swap\\n    /// @param data Any data to be passed through to the callback\\n    /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive\\n    /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive\\n    function swap(\\n        address recipient,\\n        bool zeroForOne,\\n        int256 amountSpecified,\\n        uint160 sqrtPriceLimitX96,\\n        bytes calldata data\\n    ) external returns (int256 amount0, int256 amount1);\\n\\n    /// @notice Receive token0 and/or token1 and pay it back, plus a fee, in the callback\\n    /// @dev The caller of this method receives a callback in the form of IUniswapV3FlashCallback#uniswapV3FlashCallback\\n    /// @dev Can be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling\\n    /// with 0 amount{0,1} and sending the donation amount(s) from the callback\\n    /// @param recipient The address which will receive the token0 and token1 amounts\\n    /// @param amount0 The amount of token0 to send\\n    /// @param amount1 The amount of token1 to send\\n    /// @param data Any data to be passed through to the callback\\n    function flash(\\n        address recipient,\\n        uint256 amount0,\\n        uint256 amount1,\\n        bytes calldata data\\n    ) external;\\n\\n    /// @notice Increase the maximum number of price and liquidity observations that this pool will store\\n    /// @dev This method is no-op if the pool already has an observationCardinalityNext greater than or equal to\\n    /// the input observationCardinalityNext.\\n    /// @param observationCardinalityNext The desired minimum number of observations for the pool to store\\n    function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\\n}\\n\",\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"license\":\"GPL-2.0-or-later\"},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n/// @title Pool state that is not stored\\n/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the\\n/// blockchain. The functions here may have variable gas costs.\\ninterface IUniswapV3PoolDerivedState {\\n    /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp\\n    /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing\\n    /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,\\n    /// you must call it with secondsAgos = [3600, 0].\\n    /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in\\n    /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.\\n    /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned\\n    /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp\\n    /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block\\n    /// timestamp\\n    function observe(uint32[] calldata secondsAgos)\\n        external\\n        view\\n        returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);\\n\\n    /// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range\\n    /// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed.\\n    /// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first\\n    /// snapshot is taken and the second snapshot is taken.\\n    /// @param tickLower The lower tick of the range\\n    /// @param tickUpper The upper tick of the range\\n    /// @return tickCumulativeInside The snapshot of the tick accumulator for the range\\n    /// @return secondsPerLiquidityInsideX128 The snapshot of seconds per liquidity for the range\\n    /// @return secondsInside The snapshot of seconds per liquidity for the range\\n    function snapshotCumulativesInside(int24 tickLower, int24 tickUpper)\\n        external\\n        view\\n        returns (\\n            int56 tickCumulativeInside,\\n            uint160 secondsPerLiquidityInsideX128,\\n            uint32 secondsInside\\n        );\\n}\\n\",\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"license\":\"GPL-2.0-or-later\"},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n/// @title Events emitted by a pool\\n/// @notice Contains all events emitted by the pool\\ninterface IUniswapV3PoolEvents {\\n    /// @notice Emitted exactly once by a pool when #initialize is first called on the pool\\n    /// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize\\n    /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\\n    /// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the pool\\n    event Initialize(uint160 sqrtPriceX96, int24 tick);\\n\\n    /// @notice Emitted when liquidity is minted for a given position\\n    /// @param sender The address that minted the liquidity\\n    /// @param owner The owner of the position and recipient of any minted liquidity\\n    /// @param tickLower The lower tick of the position\\n    /// @param tickUpper The upper tick of the position\\n    /// @param amount The amount of liquidity minted to the position range\\n    /// @param amount0 How much token0 was required for the minted liquidity\\n    /// @param amount1 How much token1 was required for the minted liquidity\\n    event Mint(\\n        address sender,\\n        address indexed owner,\\n        int24 indexed tickLower,\\n        int24 indexed tickUpper,\\n        uint128 amount,\\n        uint256 amount0,\\n        uint256 amount1\\n    );\\n\\n    /// @notice Emitted when fees are collected by the owner of a position\\n    /// @dev Collect events may be emitted with zero amount0 and amount1 when the caller chooses not to collect fees\\n    /// @param owner The owner of the position for which fees are collected\\n    /// @param tickLower The lower tick of the position\\n    /// @param tickUpper The upper tick of the position\\n    /// @param amount0 The amount of token0 fees collected\\n    /// @param amount1 The amount of token1 fees collected\\n    event Collect(\\n        address indexed owner,\\n        address recipient,\\n        int24 indexed tickLower,\\n        int24 indexed tickUpper,\\n        uint128 amount0,\\n        uint128 amount1\\n    );\\n\\n    /// @notice Emitted when a position's liquidity is removed\\n    /// @dev Does not withdraw any fees earned by the liquidity position, which must be withdrawn via #collect\\n    /// @param owner The owner of the position for which liquidity is removed\\n    /// @param tickLower The lower tick of the position\\n    /// @param tickUpper The upper tick of the position\\n    /// @param amount The amount of liquidity to remove\\n    /// @param amount0 The amount of token0 withdrawn\\n    /// @param amount1 The amount of token1 withdrawn\\n    event Burn(\\n        address indexed owner,\\n        int24 indexed tickLower,\\n        int24 indexed tickUpper,\\n        uint128 amount,\\n        uint256 amount0,\\n        uint256 amount1\\n    );\\n\\n    /// @notice Emitted by the pool for any swaps between token0 and token1\\n    /// @param sender The address that initiated the swap call, and that received the callback\\n    /// @param recipient The address that received the output of the swap\\n    /// @param amount0 The delta of the token0 balance of the pool\\n    /// @param amount1 The delta of the token1 balance of the pool\\n    /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\\n    /// @param liquidity The liquidity of the pool after the swap\\n    /// @param tick The log base 1.0001 of price of the pool after the swap\\n    event Swap(\\n        address indexed sender,\\n        address indexed recipient,\\n        int256 amount0,\\n        int256 amount1,\\n        uint160 sqrtPriceX96,\\n        uint128 liquidity,\\n        int24 tick\\n    );\\n\\n    /// @notice Emitted by the pool for any flashes of token0/token1\\n    /// @param sender The address that initiated the swap call, and that received the callback\\n    /// @param recipient The address that received the tokens from flash\\n    /// @param amount0 The amount of token0 that was flashed\\n    /// @param amount1 The amount of token1 that was flashed\\n    /// @param paid0 The amount of token0 paid for the flash, which can exceed the amount0 plus the fee\\n    /// @param paid1 The amount of token1 paid for the flash, which can exceed the amount1 plus the fee\\n    event Flash(\\n        address indexed sender,\\n        address indexed recipient,\\n        uint256 amount0,\\n        uint256 amount1,\\n        uint256 paid0,\\n        uint256 paid1\\n    );\\n\\n    /// @notice Emitted by the pool for increases to the number of observations that can be stored\\n    /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\\n    /// just before a mint/swap/burn.\\n    /// @param observationCardinalityNextOld The previous value of the next observation cardinality\\n    /// @param observationCardinalityNextNew The updated value of the next observation cardinality\\n    event IncreaseObservationCardinalityNext(\\n        uint16 observationCardinalityNextOld,\\n        uint16 observationCardinalityNextNew\\n    );\\n\\n    /// @notice Emitted when the protocol fee is changed by the pool\\n    /// @param feeProtocol0Old The previous value of the token0 protocol fee\\n    /// @param feeProtocol1Old The previous value of the token1 protocol fee\\n    /// @param feeProtocol0New The updated value of the token0 protocol fee\\n    /// @param feeProtocol1New The updated value of the token1 protocol fee\\n    event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New);\\n\\n    /// @notice Emitted when the collected protocol fees are withdrawn by the factory owner\\n    /// @param sender The address that collects the protocol fees\\n    /// @param recipient The address that receives the collected protocol fees\\n    /// @param amount0 The amount of token0 protocol fees that is withdrawn\\n    /// @param amount0 The amount of token1 protocol fees that is withdrawn\\n    event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1);\\n}\\n\",\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"license\":\"GPL-2.0-or-later\"},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n/// @title Pool state that never changes\\n/// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same values\\ninterface IUniswapV3PoolImmutables {\\n    /// @notice The contract that deployed the pool, which must adhere to the IUniswapV3Factory interface\\n    /// @return The contract address\\n    function factory() external view returns (address);\\n\\n    /// @notice The first of the two tokens of the pool, sorted by address\\n    /// @return The token contract address\\n    function token0() external view returns (address);\\n\\n    /// @notice The second of the two tokens of the pool, sorted by address\\n    /// @return The token contract address\\n    function token1() external view returns (address);\\n\\n    /// @notice The pool's fee in hundredths of a bip, i.e. 1e-6\\n    /// @return The fee\\n    function fee() external view returns (uint24);\\n\\n    /// @notice The pool tick spacing\\n    /// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive\\n    /// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ...\\n    /// This value is an int24 to avoid casting even though it is always positive.\\n    /// @return The tick spacing\\n    function tickSpacing() external view returns (int24);\\n\\n    /// @notice The maximum amount of position liquidity that can use any tick in the range\\n    /// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and\\n    /// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool\\n    /// @return The max amount of liquidity per tick\\n    function maxLiquidityPerTick() external view returns (uint128);\\n}\\n\",\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"license\":\"GPL-2.0-or-later\"},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n/// @title Permissioned pool actions\\n/// @notice Contains pool methods that may only be called by the factory owner\\ninterface IUniswapV3PoolOwnerActions {\\n    /// @notice Set the denominator of the protocol's % share of the fees\\n    /// @param feeProtocol0 new protocol fee for token0 of the pool\\n    /// @param feeProtocol1 new protocol fee for token1 of the pool\\n    function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external;\\n\\n    /// @notice Collect the protocol fee accrued to the pool\\n    /// @param recipient The address to which collected protocol fees should be sent\\n    /// @param amount0Requested The maximum amount of token0 to send, can be 0 to collect fees in only token1\\n    /// @param amount1Requested The maximum amount of token1 to send, can be 0 to collect fees in only token0\\n    /// @return amount0 The protocol fee collected in token0\\n    /// @return amount1 The protocol fee collected in token1\\n    function collectProtocol(\\n        address recipient,\\n        uint128 amount0Requested,\\n        uint128 amount1Requested\\n    ) external returns (uint128 amount0, uint128 amount1);\\n}\\n\",\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"license\":\"GPL-2.0-or-later\"},\"@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n/// @title Pool state that can change\\n/// @notice These methods compose the pool's state, and can change with any frequency including multiple times\\n/// per transaction\\ninterface IUniswapV3PoolState {\\n    /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas\\n    /// when accessed externally.\\n    /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value\\n    /// tick The current tick of the pool, i.e. according to the last tick transition that was run.\\n    /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick\\n    /// boundary.\\n    /// observationIndex The index of the last oracle observation that was written,\\n    /// observationCardinality The current maximum number of observations stored in the pool,\\n    /// observationCardinalityNext The next maximum number of observations, to be updated when the observation.\\n    /// feeProtocol The protocol fee for both tokens of the pool.\\n    /// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0\\n    /// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee.\\n    /// unlocked Whether the pool is currently locked to reentrancy\\n    function slot0()\\n        external\\n        view\\n        returns (\\n            uint160 sqrtPriceX96,\\n            int24 tick,\\n            uint16 observationIndex,\\n            uint16 observationCardinality,\\n            uint16 observationCardinalityNext,\\n            uint8 feeProtocol,\\n            bool unlocked\\n        );\\n\\n    /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool\\n    /// @dev This value can overflow the uint256\\n    function feeGrowthGlobal0X128() external view returns (uint256);\\n\\n    /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool\\n    /// @dev This value can overflow the uint256\\n    function feeGrowthGlobal1X128() external view returns (uint256);\\n\\n    /// @notice The amounts of token0 and token1 that are owed to the protocol\\n    /// @dev Protocol fees will never exceed uint128 max in either token\\n    function protocolFees() external view returns (uint128 token0, uint128 token1);\\n\\n    /// @notice The currently in range liquidity available to the pool\\n    /// @dev This value has no relationship to the total liquidity across all ticks\\n    function liquidity() external view returns (uint128);\\n\\n    /// @notice Look up information about a specific tick in the pool\\n    /// @param tick The tick to look up\\n    /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or\\n    /// tick upper,\\n    /// liquidityNet how much liquidity changes when the pool price crosses the tick,\\n    /// feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0,\\n    /// feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1,\\n    /// tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick\\n    /// secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick,\\n    /// secondsOutside the seconds spent on the other side of the tick from the current tick,\\n    /// initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false.\\n    /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0.\\n    /// In addition, these values are only relative and must be used only in comparison to previous snapshots for\\n    /// a specific position.\\n    function ticks(int24 tick)\\n        external\\n        view\\n        returns (\\n            uint128 liquidityGross,\\n            int128 liquidityNet,\\n            uint256 feeGrowthOutside0X128,\\n            uint256 feeGrowthOutside1X128,\\n            int56 tickCumulativeOutside,\\n            uint160 secondsPerLiquidityOutsideX128,\\n            uint32 secondsOutside,\\n            bool initialized\\n        );\\n\\n    /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information\\n    function tickBitmap(int16 wordPosition) external view returns (uint256);\\n\\n    /// @notice Returns the information about a position by the position's key\\n    /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper\\n    /// @return _liquidity The amount of liquidity in the position,\\n    /// Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke,\\n    /// Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke,\\n    /// Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke,\\n    /// Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke\\n    function positions(bytes32 key)\\n        external\\n        view\\n        returns (\\n            uint128 _liquidity,\\n            uint256 feeGrowthInside0LastX128,\\n            uint256 feeGrowthInside1LastX128,\\n            uint128 tokensOwed0,\\n            uint128 tokensOwed1\\n        );\\n\\n    /// @notice Returns data about a specific observation index\\n    /// @param index The element of the observations array to fetch\\n    /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time\\n    /// ago, rather than at a specific index in the array.\\n    /// @return blockTimestamp The timestamp of the observation,\\n    /// Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp,\\n    /// Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp,\\n    /// Returns initialized whether the observation has been initialized and the values are safe to use\\n    function observations(uint256 index)\\n        external\\n        view\\n        returns (\\n            uint32 blockTimestamp,\\n            int56 tickCumulative,\\n            uint160 secondsPerLiquidityCumulativeX128,\\n            bool initialized\\n        );\\n}\\n\",\"keccak256\":\"0x852dc1f5df7dcf7f11e7bb3eed79f0cea72ad4b25f6a9d2c35aafb48925fd49f\",\"license\":\"GPL-2.0-or-later\"},\"solidity/contracts/Keep3rHelper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\n/*\\n\\nCoded for The Keep3r Network with \\u2665 by\\n\\n\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2557\\u2003\\u2003\\u2591\\u2588\\u2588\\u2557\\u2591\\u2591\\u2591\\u2591\\u2591\\u2591\\u2591\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2588\\u2557\\u2591\\u2591\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2557\\u2591\\u2591\\u2591\\u2591\\u2591\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2588\\u2557\\u2591\\u2591\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\n\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\u2588\\u2588\\u2554\\u2550\\u2550\\u2550\\u2550\\u255d\\u2588\\u2588\\u2554\\u2550\\u2550\\u2550\\u2550\\u255d\\u2588\\u2588\\u2551\\u2003\\u2003\\u2591\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2557\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\u2588\\u2588\\u2554\\u2550\\u2550\\u2550\\u2550\\u255d\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2591\\u2591\\u2591\\u2591\\u2591\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\n\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2591\\u2588\\u2588\\u2551\\u2003\\u2003\\u2591\\u255a\\u2588\\u2588\\u2557\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2554\\u255d\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2591\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2554\\u255d\\u2588\\u2588\\u2551\\u2591\\u2591\\u2591\\u2591\\u2591\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\n\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2550\\u2550\\u255d\\u2591\\u2591\\u2588\\u2588\\u2554\\u2550\\u2550\\u255d\\u2591\\u2591\\u2588\\u2588\\u2551\\u2003\\u2003\\u2591\\u2591\\u2588\\u2588\\u2588\\u2588\\u2554\\u2550\\u2588\\u2588\\u2588\\u2588\\u2551\\u2591\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u255a\\u2588\\u2588\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2554\\u2550\\u2550\\u255d\\u2591\\u2591\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2591\\u2591\\u2591\\u2591\\u2591\\u2588\\u2588\\u2554\\u2550\\u2550\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u255a\\u2588\\u2588\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\n\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2554\\u255d\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2591\\u2591\\u2591\\u2591\\u2591\\u2588\\u2588\\u2551\\u2003\\u2003\\u2591\\u2591\\u255a\\u2588\\u2588\\u2554\\u255d\\u2591\\u255a\\u2588\\u2588\\u2554\\u255d\\u2591\\u255a\\u2588\\u2588\\u2588\\u2588\\u2588\\u2554\\u255d\\u2588\\u2588\\u2551\\u2591\\u255a\\u2588\\u2588\\u2588\\u2551\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2554\\u255d\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2557\\u2588\\u2588\\u2551\\u2591\\u2591\\u2588\\u2588\\u2551\\u2588\\u2588\\u2551\\u2591\\u255a\\u2588\\u2588\\u2588\\u2551\\u2588\\u2588\\u2588\\u2588\\u2588\\u2588\\u2554\\u255d\\n\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\u2591\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\u255a\\u2550\\u255d\\u2591\\u2591\\u2591\\u2591\\u2591\\u255a\\u2550\\u255d\\u2003\\u2003\\u2591\\u2591\\u2591\\u255a\\u2550\\u255d\\u2591\\u2591\\u2591\\u255a\\u2550\\u255d\\u2591\\u2591\\u2591\\u255a\\u2550\\u2550\\u2550\\u2550\\u255d\\u2591\\u255a\\u2550\\u255d\\u2591\\u2591\\u255a\\u2550\\u2550\\u255d\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\u2591\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\u255a\\u2550\\u255d\\u2591\\u2591\\u255a\\u2550\\u255d\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\u255a\\u2550\\u255d\\u2591\\u2591\\u255a\\u2550\\u255d\\u255a\\u2550\\u255d\\u2591\\u2591\\u255a\\u2550\\u2550\\u255d\\u255a\\u2550\\u2550\\u2550\\u2550\\u2550\\u255d\\u2591\\n\\nhttps://defi.sucks\\n\\n*/\\n\\npragma solidity >=0.8.7 <0.9.0;\\n\\nimport './libraries/FullMath.sol';\\nimport './libraries/TickMath.sol';\\nimport '../interfaces/IKeep3r.sol';\\nimport '../interfaces/IKeep3rHelper.sol';\\nimport './Keep3rHelperParameters.sol';\\n\\nimport '@openzeppelin/contracts/utils/math/Math.sol';\\nimport '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';\\n\\ncontract Keep3rHelper is IKeep3rHelper, Keep3rHelperParameters {\\n  constructor(address _keep3rV2, address _governance) Keep3rHelperParameters(_keep3rV2, _governance) {}\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function quote(uint256 _eth) public view override returns (uint256 _amountOut) {\\n    uint32[] memory _secondsAgos = new uint32[](2);\\n    _secondsAgos[1] = quoteTwapTime;\\n\\n    (int56[] memory _tickCumulatives, ) = IUniswapV3Pool(kp3rWethPool.poolAddress).observe(_secondsAgos);\\n    int56 _difference = _tickCumulatives[0] - _tickCumulatives[1];\\n    _amountOut = getQuoteAtTick(uint128(_eth), kp3rWethPool.isKP3RToken0 ? _difference : -_difference, quoteTwapTime);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function bonds(address _keeper) public view override returns (uint256 _amountBonded) {\\n    return IKeep3r(keep3rV2).bonds(_keeper, KP3R);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getRewardAmountFor(address _keeper, uint256 _gasUsed) public view override returns (uint256 _kp3r) {\\n    uint256 _boost = getRewardBoostFor(bonds(_keeper));\\n    _kp3r = quote((_gasUsed * _boost) / BOOST_BASE);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getRewardAmount(uint256 _gasUsed) external view override returns (uint256 _amount) {\\n    // solhint-disable-next-line avoid-tx-origin\\n    return getRewardAmountFor(tx.origin, _gasUsed);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getRewardBoostFor(uint256 _bonds) public view override returns (uint256 _rewardBoost) {\\n    _bonds = Math.min(_bonds, targetBond);\\n    uint256 _cap = Math.max(minBoost, minBoost + ((maxBoost - minBoost) * _bonds) / targetBond);\\n    _rewardBoost = _cap * _getBasefee();\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getPoolTokens(address _pool) public view override returns (address _token0, address _token1) {\\n    return (IUniswapV3Pool(_pool).token0(), IUniswapV3Pool(_pool).token1());\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function isKP3RToken0(address _pool) public view override returns (bool _isKP3RToken0) {\\n    address _token0;\\n    address _token1;\\n    (_token0, _token1) = getPoolTokens(_pool);\\n    if (_token0 == KP3R) {\\n      return true;\\n    } else if (_token1 != KP3R) {\\n      revert LiquidityPairInvalid();\\n    }\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function observe(address _pool, uint32[] memory _secondsAgo)\\n    public\\n    view\\n    override\\n    returns (\\n      int56 _tickCumulative1,\\n      int56 _tickCumulative2,\\n      bool _success\\n    )\\n  {\\n    try IUniswapV3Pool(_pool).observe(_secondsAgo) returns (int56[] memory _uniswapResponse, uint160[] memory) {\\n      _tickCumulative1 = _uniswapResponse[0];\\n      if (_uniswapResponse.length > 1) {\\n        _tickCumulative2 = _uniswapResponse[1];\\n      }\\n      _success = true;\\n    } catch (bytes memory) {}\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getPaymentParams(uint256 _bonds)\\n    external\\n    view\\n    override\\n    returns (\\n      uint256 _boost,\\n      uint256 _oneEthQuote,\\n      uint256 _extra\\n    )\\n  {\\n    _oneEthQuote = quote(1 ether);\\n    _boost = getRewardBoostFor(_bonds);\\n    _extra = workExtraGas;\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getKP3RsAtTick(\\n    uint256 _liquidityAmount,\\n    int56 _tickDifference,\\n    uint256 _timeInterval\\n  ) public pure override returns (uint256 _kp3rAmount) {\\n    uint160 sqrtRatioX96 = TickMath.getSqrtRatioAtTick(int24(_tickDifference / int256(_timeInterval)));\\n    _kp3rAmount = FullMath.mulDiv(1 << 96, _liquidityAmount, sqrtRatioX96);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelper\\n  function getQuoteAtTick(\\n    uint128 _baseAmount,\\n    int56 _tickDifference,\\n    uint256 _timeInterval\\n  ) public pure override returns (uint256 _quoteAmount) {\\n    uint160 sqrtRatioX96 = TickMath.getSqrtRatioAtTick(int24(_tickDifference / int256(_timeInterval)));\\n\\n    if (sqrtRatioX96 <= type(uint128).max) {\\n      uint256 ratioX192 = uint256(sqrtRatioX96) * sqrtRatioX96;\\n      _quoteAmount = FullMath.mulDiv(1 << 192, _baseAmount, ratioX192);\\n    } else {\\n      uint256 ratioX128 = FullMath.mulDiv(sqrtRatioX96, sqrtRatioX96, 1 << 64);\\n      _quoteAmount = FullMath.mulDiv(1 << 128, _baseAmount, ratioX128);\\n    }\\n  }\\n\\n  /// @notice Gets the block's base fee\\n  /// @return _baseFee The block's basefee\\n  function _getBasefee() internal view virtual returns (uint256 _baseFee) {\\n    return block.basefee;\\n  }\\n}\\n\",\"keccak256\":\"0x3808fda0edb99cbafee5c96f29e36fec06dda9a459e8448e8d1b502d25b04c7f\",\"license\":\"MIT\"},\"solidity/contracts/Keep3rHelperParameters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.7 <0.9.0;\\n\\nimport './libraries/FullMath.sol';\\nimport './libraries/TickMath.sol';\\nimport '../interfaces/IKeep3r.sol';\\nimport '../interfaces/external/IKeep3rV1.sol';\\nimport '../interfaces/IKeep3rHelperParameters.sol';\\nimport './peripherals/Governable.sol';\\nimport './Keep3rHelperParameters.sol';\\n\\nimport '@openzeppelin/contracts/utils/math/Math.sol';\\nimport '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';\\n\\ncontract Keep3rHelperParameters is IKeep3rHelperParameters, Governable {\\n  /// @inheritdoc IKeep3rHelperParameters\\n  address public constant override KP3R = 0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  uint256 public constant override BOOST_BASE = 10_000;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  uint256 public override minBoost = 11_000;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  uint256 public override maxBoost = 12_000;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  uint256 public override targetBond = 200 ether;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  uint256 public override workExtraGas = 50_000;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  uint32 public override quoteTwapTime = 10 minutes;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  address public override keep3rV2;\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  IKeep3rHelperParameters.Kp3rWethPool public override kp3rWethPool;\\n\\n  constructor(address _keep3rV2, address _governance) Governable(_governance) {\\n    keep3rV2 = _keep3rV2;\\n    _setKp3rWethPool(0x11B7a6bc0259ed6Cf9DB8F499988F9eCc7167bf5);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setKp3rWethPool(address _poolAddress) external override onlyGovernance {\\n    _setKp3rWethPool(_poolAddress);\\n    emit Kp3rWethPoolChange(kp3rWethPool.poolAddress, kp3rWethPool.isKP3RToken0);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setMinBoost(uint256 _minBoost) external override onlyGovernance {\\n    minBoost = _minBoost;\\n    emit MinBoostChange(minBoost);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setMaxBoost(uint256 _maxBoost) external override onlyGovernance {\\n    maxBoost = _maxBoost;\\n    emit MaxBoostChange(maxBoost);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setTargetBond(uint256 _targetBond) external override onlyGovernance {\\n    targetBond = _targetBond;\\n    emit TargetBondChange(targetBond);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setKeep3rV2(address _keep3rV2) external override onlyGovernance {\\n    keep3rV2 = _keep3rV2;\\n    emit Keep3rV2Change(keep3rV2);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setWorkExtraGas(uint256 _workExtraGas) external override onlyGovernance {\\n    workExtraGas = _workExtraGas;\\n    emit WorkExtraGasChange(workExtraGas);\\n  }\\n\\n  /// @inheritdoc IKeep3rHelperParameters\\n  function setQuoteTwapTime(uint32 _quoteTwapTime) external override onlyGovernance {\\n    quoteTwapTime = _quoteTwapTime;\\n    emit QuoteTwapTimeChange(quoteTwapTime);\\n  }\\n\\n  /// @notice Sets KP3R-WETH pool\\n  /// @param _poolAddress The address of the KP3R-WETH pool\\n  function _setKp3rWethPool(address _poolAddress) internal {\\n    bool _isKP3RToken0 = IUniswapV3Pool(_poolAddress).token0() == KP3R;\\n    bool _isKP3RToken1 = IUniswapV3Pool(_poolAddress).token1() == KP3R;\\n\\n    if (!_isKP3RToken0 && !_isKP3RToken1) revert InvalidKp3rPool();\\n\\n    kp3rWethPool = Kp3rWethPool(_poolAddress, _isKP3RToken0);\\n  }\\n}\\n\",\"keccak256\":\"0xb5c365c428fc8a3157225799f6b581e450b74f6ae05b0f30dba286ff1e470e88\",\"license\":\"MIT\"},\"solidity/contracts/libraries/FullMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Contains 512-bit math functions\\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\\n/// @dev Handles \\\"phantom overflow\\\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\\nlibrary FullMath {\\n  /// @notice Calculates floor(a\\u00d7b\\u00f7denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n  /// @param a The multiplicand\\n  /// @param b The multiplier\\n  /// @param denominator The divisor\\n  /// @return result The 256-bit result\\n  /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\\n  function mulDiv(\\n    uint256 a,\\n    uint256 b,\\n    uint256 denominator\\n  ) internal pure returns (uint256 result) {\\n    unchecked {\\n      // 512-bit multiply [prod1 prod0] = a * b\\n      // Compute the product mod 2**256 and mod 2**256 - 1\\n      // then use the Chinese Remainder Theorem to reconstruct\\n      // the 512 bit result. The result is stored in two 256\\n      // variables such that product = prod1 * 2**256 + prod0\\n      uint256 prod0; // Least significant 256 bits of the product\\n      uint256 prod1; // Most significant 256 bits of the product\\n      assembly {\\n        let mm := mulmod(a, b, not(0))\\n        prod0 := mul(a, b)\\n        prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n      }\\n\\n      // Handle non-overflow cases, 256 by 256 division\\n      if (prod1 == 0) {\\n        require(denominator > 0);\\n        assembly {\\n          result := div(prod0, denominator)\\n        }\\n        return result;\\n      }\\n\\n      // Make sure the result is less than 2**256.\\n      // Also prevents denominator == 0\\n      require(denominator > prod1);\\n\\n      ///////////////////////////////////////////////\\n      // 512 by 256 division.\\n      ///////////////////////////////////////////////\\n\\n      // Make division exact by subtracting the remainder from [prod1 prod0]\\n      // Compute remainder using mulmod\\n      uint256 remainder;\\n      assembly {\\n        remainder := mulmod(a, b, denominator)\\n      }\\n      // Subtract 256 bit number from 512 bit number\\n      assembly {\\n        prod1 := sub(prod1, gt(remainder, prod0))\\n        prod0 := sub(prod0, remainder)\\n      }\\n\\n      // Factor powers of two out of denominator\\n      // Compute largest power of two divisor of denominator.\\n      // Always >= 1.\\n      uint256 twos = (~denominator + 1) & denominator;\\n      // Divide denominator by power of two\\n      assembly {\\n        denominator := div(denominator, twos)\\n      }\\n\\n      // Divide [prod1 prod0] by the factors of two\\n      assembly {\\n        prod0 := div(prod0, twos)\\n      }\\n      // Shift in bits from prod1 into prod0. For this we need\\n      // to flip `twos` such that it is 2**256 / twos.\\n      // If twos is zero, then it becomes one\\n      assembly {\\n        twos := add(div(sub(0, twos), twos), 1)\\n      }\\n      prod0 |= prod1 * twos;\\n\\n      // Invert denominator mod 2**256\\n      // Now that denominator is an odd number, it has an inverse\\n      // modulo 2**256 such that denominator * inv = 1 mod 2**256.\\n      // Compute the inverse by starting with a seed that is correct\\n      // correct for four bits. That is, denominator * inv = 1 mod 2**4\\n      uint256 inv = (3 * denominator) ^ 2;\\n      // Now use Newton-Raphson iteration to improve the precision.\\n      // Thanks to Hensel's lifting lemma, this also works in modular\\n      // arithmetic, doubling the correct bits in each step.\\n      inv *= 2 - denominator * inv; // inverse mod 2**8\\n      inv *= 2 - denominator * inv; // inverse mod 2**16\\n      inv *= 2 - denominator * inv; // inverse mod 2**32\\n      inv *= 2 - denominator * inv; // inverse mod 2**64\\n      inv *= 2 - denominator * inv; // inverse mod 2**128\\n      inv *= 2 - denominator * inv; // inverse mod 2**256\\n\\n      // Because the division is now exact we can divide by multiplying\\n      // with the modular inverse of denominator. This will give us the\\n      // correct result modulo 2**256. Since the precoditions guarantee\\n      // that the outcome is less than 2**256, this is the final result.\\n      // We don't need to compute the high bits of the result and prod1\\n      // is no longer required.\\n      result = prod0 * inv;\\n      return result;\\n    }\\n  }\\n\\n  /// @notice Calculates ceil(a\\u00d7b\\u00f7denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n  /// @param a The multiplicand\\n  /// @param b The multiplier\\n  /// @param denominator The divisor\\n  /// @return result The 256-bit result\\n  function mulDivRoundingUp(\\n    uint256 a,\\n    uint256 b,\\n    uint256 denominator\\n  ) internal pure returns (uint256 result) {\\n    unchecked {\\n      result = mulDiv(a, b, denominator);\\n      if (mulmod(a, b, denominator) > 0) {\\n        require(result < type(uint256).max);\\n        result++;\\n      }\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0xe1c595da02adf8ba2ae74ac579b9b3c966d1ecb2a99c25081a62ee8550f26569\",\"license\":\"MIT\"},\"solidity/contracts/libraries/TickMath.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-2.0-or-later\\npragma solidity >=0.5.0;\\n\\n// solhint-disable\\n\\n/// @title Math library for computing sqrt prices from ticks and vice versa\\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\\n///         prices between 2**-128 and 2**128\\nlibrary TickMath {\\n  /// @dev The minimum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**-128\\n  int24 internal constant MIN_TICK = -887272;\\n  /// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128\\n  int24 internal constant MAX_TICK = -MIN_TICK;\\n\\n  /// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK)\\n  uint160 internal constant MIN_SQRT_RATIO = 4295128739;\\n  /// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK)\\n  uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;\\n\\n  /// @notice Calculates sqrt(1.0001^tick) * 2^96\\n  /// @dev Throws if |tick| > max tick\\n  /// @param tick The input tick for the above formula\\n  /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0)\\n  ///         at the given tick\\n  function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\\n    uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));\\n    require(absTick <= uint256(int256(MAX_TICK)), 'T');\\n\\n    uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;\\n    if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;\\n    if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\\n    if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\\n    if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;\\n    if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\\n    if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\\n    if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\\n    if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\\n    if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\\n    if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\\n    if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\\n    if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\\n    if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\\n    if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\\n    if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;\\n    if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\\n    if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;\\n    if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;\\n    if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;\\n\\n    if (tick > 0) ratio = type(uint256).max / ratio;\\n\\n    // Divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\\n    // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\\n    // we round up in the division so getTickAtSqrtRatio of the output price is always consistent\\n    sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));\\n  }\\n\\n  /// @notice Calculates the greatest tick value such that getRatioAtTick(tick) <= ratio\\n  /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_RATIO, as MIN_SQRT_RATIO is the lowest value getRatioAtTick may ever return.\\n  /// @param sqrtPriceX96 The sqrt ratio for which to compute the tick as a Q64.96\\n  /// @return tick The greatest tick for which the ratio is less than or equal to the input ratio\\n  function getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\\n    // Second inequality must be < because the price can never reach the price at the max tick\\n    require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');\\n    uint256 ratio = uint256(sqrtPriceX96) << 32;\\n\\n    uint256 r = ratio;\\n    uint256 msb = 0;\\n\\n    assembly {\\n      let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := shl(5, gt(r, 0xFFFFFFFF))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := shl(4, gt(r, 0xFFFF))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := shl(3, gt(r, 0xFF))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := shl(2, gt(r, 0xF))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := shl(1, gt(r, 0x3))\\n      msb := or(msb, f)\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      let f := gt(r, 0x1)\\n      msb := or(msb, f)\\n    }\\n\\n    if (msb >= 128) r = ratio >> (msb - 127);\\n    else r = ratio << (127 - msb);\\n\\n    int256 log_2 = (int256(msb) - 128) << 64;\\n\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(63, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(62, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(61, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(60, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(59, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(58, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(57, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(56, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(55, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(54, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(53, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(52, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(51, f))\\n      r := shr(f, r)\\n    }\\n    assembly {\\n      r := shr(127, mul(r, r))\\n      let f := shr(128, r)\\n      log_2 := or(log_2, shl(50, f))\\n    }\\n\\n    int256 log_sqrt10001 = log_2 * 255738958999603826347141; // 128.128 number\\n\\n    int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);\\n    int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);\\n\\n    tick = tickLow == tickHi ? tickLow : getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\\n  }\\n}\\n\",\"keccak256\":\"0x11b965ba576ff91b4a6e9533c0f334f2b7b6024ee1c54e36d21799de5580899d\",\"license\":\"GPL-2.0-or-later\"},\"solidity/contracts/peripherals/Governable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../../interfaces/peripherals/IGovernable.sol';\\n\\nabstract contract Governable is IGovernable {\\n  /// @inheritdoc IGovernable\\n  address public override governance;\\n\\n  /// @inheritdoc IGovernable\\n  address public override pendingGovernance;\\n\\n  constructor(address _governance) {\\n    if (_governance == address(0)) revert NoGovernanceZeroAddress();\\n    governance = _governance;\\n  }\\n\\n  /// @inheritdoc IGovernable\\n  function setGovernance(address _governance) external override onlyGovernance {\\n    pendingGovernance = _governance;\\n    emit GovernanceProposal(_governance);\\n  }\\n\\n  /// @inheritdoc IGovernable\\n  function acceptGovernance() external override onlyPendingGovernance {\\n    governance = pendingGovernance;\\n    delete pendingGovernance;\\n    emit GovernanceSet(governance);\\n  }\\n\\n  /// @notice Functions with this modifier can only be called by governance\\n  modifier onlyGovernance {\\n    if (msg.sender != governance) revert OnlyGovernance();\\n    _;\\n  }\\n\\n  /// @notice Functions with this modifier can only be called by pendingGovernance\\n  modifier onlyPendingGovernance {\\n    if (msg.sender != pendingGovernance) revert OnlyPendingGovernance();\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x5b6d7601a42d2229657a7f60021c7e2bfe890c3541ab0003f7d88e20a28d722b\",\"license\":\"MIT\"},\"solidity/interfaces/IKeep3r.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './peripherals/IKeep3rJobs.sol';\\nimport './peripherals/IKeep3rKeepers.sol';\\nimport './peripherals/IKeep3rAccountance.sol';\\nimport './peripherals/IKeep3rRoles.sol';\\nimport './peripherals/IKeep3rParameters.sol';\\n\\n// solhint-disable-next-line no-empty-blocks\\n\\n/// @title Keep3rV2 contract\\n/// @notice This contract inherits all the functionality of Keep3rV2\\ninterface IKeep3r is IKeep3rJobs, IKeep3rKeepers, IKeep3rAccountance, IKeep3rRoles, IKeep3rParameters {\\n\\n}\\n\",\"keccak256\":\"0x57e234140074d771239eeb6f08b6fc049c838c2a34aefadbbd542672e63bc686\",\"license\":\"MIT\"},\"solidity/interfaces/IKeep3rHelper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rHelper contract\\n/// @notice Contains all the helper functions used throughout the different files.\\n\\ninterface IKeep3rHelper {\\n  // Errors\\n\\n  /// @notice Throws when none of the tokens in the liquidity pair is KP3R\\n  error LiquidityPairInvalid();\\n\\n  // Methods\\n  // solhint-enable func-name-mixedcase\\n\\n  /// @notice Calculates the amount of KP3R that corresponds to the ETH passed into the function\\n  /// @dev This function allows us to calculate how much KP3R we should pay to a keeper for things expressed in ETH, like gas\\n  /// @param _eth The amount of ETH\\n  /// @return _amountOut The amount of KP3R\\n  function quote(uint256 _eth) external view returns (uint256 _amountOut);\\n\\n  /// @notice Returns the amount of KP3R the keeper has bonded\\n  /// @param _keeper The address of the keeper to check\\n  /// @return _amountBonded The amount of KP3R the keeper has bonded\\n  function bonds(address _keeper) external view returns (uint256 _amountBonded);\\n\\n  /// @notice Calculates the reward (in KP3R) that corresponds to a keeper for using gas\\n  /// @param _keeper The address of the keeper to check\\n  /// @param _gasUsed The amount of gas used that will be rewarded\\n  /// @return _kp3r The amount of KP3R that should be awarded to the keeper\\n  function getRewardAmountFor(address _keeper, uint256 _gasUsed) external view returns (uint256 _kp3r);\\n\\n  /// @notice Calculates the boost in the reward given to a keeper based on the amount of KP3R that keeper has bonded\\n  /// @param _bonds The amount of KP3R tokens bonded by the keeper\\n  /// @return _rewardBoost The reward boost that corresponds to the keeper\\n  function getRewardBoostFor(uint256 _bonds) external view returns (uint256 _rewardBoost);\\n\\n  /// @notice Calculates the reward (in KP3R) that corresponds to tx.origin for using gas\\n  /// @param _gasUsed The amount of gas used that will be rewarded\\n  /// @return _amount The amount of KP3R that should be awarded to tx.origin\\n  function getRewardAmount(uint256 _gasUsed) external view returns (uint256 _amount);\\n\\n  /// @notice Given a pool address, returns the underlying tokens of the pair\\n  /// @param _pool Address of the correspondant pool\\n  /// @return _token0 Address of the first token of the pair\\n  /// @return _token1 Address of the second token of the pair\\n  function getPoolTokens(address _pool) external view returns (address _token0, address _token1);\\n\\n  /// @notice Defines the order of the tokens in the pair for twap calculations\\n  /// @param _pool Address of the correspondant pool\\n  /// @return _isKP3RToken0 Boolean indicating the order of the tokens in the pair\\n  function isKP3RToken0(address _pool) external view returns (bool _isKP3RToken0);\\n\\n  /// @notice Given an array of secondsAgo, returns UniswapV3 pool cumulatives at that moment\\n  /// @param _pool Address of the pool to observe\\n  /// @param _secondsAgo Array with time references to observe\\n  /// @return _tickCumulative1 Cummulative sum of ticks until first time reference\\n  /// @return _tickCumulative2 Cummulative sum of ticks until second time reference\\n  /// @return _success Boolean indicating if the observe call was succesfull\\n  function observe(address _pool, uint32[] memory _secondsAgo)\\n    external\\n    view\\n    returns (\\n      int56 _tickCumulative1,\\n      int56 _tickCumulative2,\\n      bool _success\\n    );\\n\\n  /// @notice Get multiplier, quote, and extra, in order to calculate keeper payment\\n  /// @param _bonds Amount of bonded KP3R owned by the keeper\\n  /// @return _boost Multiplier per gas unit. Takes into account the base fee and the amount of bonded KP3R\\n  /// @return _oneEthQuote Amount of KP3R tokens equivalent to 1 ETH\\n  /// @return _extra Amount of extra gas that should be added to the gas spent\\n  function getPaymentParams(uint256 _bonds)\\n    external\\n    view\\n    returns (\\n      uint256 _boost,\\n      uint256 _oneEthQuote,\\n      uint256 _extra\\n    );\\n\\n  /// @notice Given a tick and a liquidity amount, calculates the underlying KP3R tokens\\n  /// @param _liquidityAmount Amount of liquidity to be converted\\n  /// @param _tickDifference Tick value used to calculate the quote\\n  /// @param _timeInterval Time value used to calculate the quote\\n  /// @return _kp3rAmount Amount of KP3R tokens underlying on the given liquidity\\n  function getKP3RsAtTick(\\n    uint256 _liquidityAmount,\\n    int56 _tickDifference,\\n    uint256 _timeInterval\\n  ) external pure returns (uint256 _kp3rAmount);\\n\\n  /// @notice Given a tick and a token amount, calculates the output in correspondant token\\n  /// @param _baseAmount Amount of token to be converted\\n  /// @param _tickDifference Tick value used to calculate the quote\\n  /// @param _timeInterval Time value used to calculate the quote\\n  /// @return _quoteAmount Amount of credits deserved for the baseAmount at the tick value\\n  function getQuoteAtTick(\\n    uint128 _baseAmount,\\n    int56 _tickDifference,\\n    uint256 _timeInterval\\n  ) external pure returns (uint256 _quoteAmount);\\n}\\n\",\"keccak256\":\"0x1b7daa4263dd21102f0418fba16f5a35a805070ebba3b39b39cadc6fc34d50e9\",\"license\":\"MIT\"},\"solidity/interfaces/IKeep3rHelperParameters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rHelperParameters contract\\n/// @notice Contains all the helper functions used throughout the different files.\\ninterface IKeep3rHelperParameters {\\n  // Structs\\n\\n  /// @dev KP3R-WETH Pool address and isKP3RToken0\\n  /// @dev Created in order to save gas by avoiding calls to pool's token0 method\\n  struct Kp3rWethPool {\\n    address poolAddress;\\n    bool isKP3RToken0;\\n  }\\n\\n  // Errors\\n\\n  /// @notice Throws when pool does not have KP3R as token0 nor token1\\n  error InvalidKp3rPool();\\n\\n  // Events\\n\\n  /// @notice Emitted when the kp3r weth pool is changed\\n  /// @param _address Address of the new kp3r weth pool\\n  /// @param _isKP3RToken0 True if calling the token0 method of the pool returns the KP3R token address\\n  event Kp3rWethPoolChange(address _address, bool _isKP3RToken0);\\n\\n  /// @notice Emitted when the minimum boost multiplier is changed\\n  /// @param _minBoost The minimum boost multiplier\\n  event MinBoostChange(uint256 _minBoost);\\n\\n  /// @notice Emitted when the maximum boost multiplier is changed\\n  /// @param _maxBoost The maximum boost multiplier\\n  event MaxBoostChange(uint256 _maxBoost);\\n\\n  /// @notice Emitted when the target bond amount is changed\\n  /// @param _targetBond The target bond amount\\n  event TargetBondChange(uint256 _targetBond);\\n\\n  /// @notice Emitted when the Keep3r V2 address is changed\\n  /// @param _keep3rV2 The address of Keep3r V2\\n  event Keep3rV2Change(address _keep3rV2);\\n\\n  /// @notice Emitted when the work extra gas amount is changed\\n  /// @param _workExtraGas The work extra gas\\n  event WorkExtraGasChange(uint256 _workExtraGas);\\n\\n  /// @notice Emitted when the quote twap time is changed\\n  /// @param _quoteTwapTime The twap time for quoting\\n  event QuoteTwapTimeChange(uint32 _quoteTwapTime);\\n\\n  // Variables\\n\\n  /// @notice Address of KP3R token\\n  /// @return _kp3r Address of KP3R token\\n  // solhint-disable func-name-mixedcase\\n  function KP3R() external view returns (address _kp3r);\\n\\n  /// @notice The boost base used to calculate the boost rewards for the keeper\\n  /// @return _base The boost base number\\n  function BOOST_BASE() external view returns (uint256 _base);\\n\\n  /// @notice KP3R-WETH pool that is being used as oracle\\n  /// @return poolAddress Address of the pool\\n  /// @return isKP3RToken0 True if calling the token0 method of the pool returns the KP3R token address\\n  function kp3rWethPool() external view returns (address poolAddress, bool isKP3RToken0);\\n\\n  /// @notice The minimum multiplier used to calculate the amount of gas paid to the Keeper for the gas used to perform a job\\n  ///         For example: if the quoted gas used is 1000, then the minimum amount to be paid will be 1000 * minBoost / BOOST_BASE\\n  /// @return _multiplier The minimum boost multiplier\\n  function minBoost() external view returns (uint256 _multiplier);\\n\\n  /// @notice The maximum multiplier used to calculate the amount of gas paid to the Keeper for the gas used to perform a job\\n  ///         For example: if the quoted gas used is 1000, then the maximum amount to be paid will be 1000 * maxBoost / BOOST_BASE\\n  /// @return _multiplier The maximum boost multiplier\\n  function maxBoost() external view returns (uint256 _multiplier);\\n\\n  /// @notice The targeted amount of bonded KP3Rs to max-up reward multiplier\\n  ///         For example: if the amount of KP3R the keeper has bonded is targetBond or more, then the keeper will get\\n  ///                      the maximum boost possible in his rewards, if it's less, the reward boost will be proportional\\n  /// @return _target The amount of KP3R that comforms the targetBond\\n  function targetBond() external view returns (uint256 _target);\\n\\n  /// @notice The amount of unaccounted gas that is going to be added to keeper payments\\n  /// @return _workExtraGas The work unaccounted gas amount\\n  function workExtraGas() external view returns (uint256 _workExtraGas);\\n\\n  /// @notice The twap time for quoting\\n  /// @return _quoteTwapTime The twap time\\n  function quoteTwapTime() external view returns (uint32 _quoteTwapTime);\\n\\n  /// @notice Address of Keep3r V2\\n  /// @return _keep3rV2 Address of Keep3r V2\\n  function keep3rV2() external view returns (address _keep3rV2);\\n\\n  // Methods\\n\\n  /// @notice Sets KP3R-WETH pool\\n  /// @param _poolAddress The address of the KP3R-WETH pool\\n  function setKp3rWethPool(address _poolAddress) external;\\n\\n  /// @notice Sets the minimum boost multiplier\\n  /// @param _minBoost The minimum boost multiplier\\n  function setMinBoost(uint256 _minBoost) external;\\n\\n  /// @notice Sets the maximum boost multiplier\\n  /// @param _maxBoost The maximum boost multiplier\\n  function setMaxBoost(uint256 _maxBoost) external;\\n\\n  /// @notice Sets the target bond amount\\n  /// @param _targetBond The target bond amount\\n  function setTargetBond(uint256 _targetBond) external;\\n\\n  /// @notice Sets the Keep3r V2 address\\n  /// @param _keep3rV2 The address of Keep3r V2\\n  function setKeep3rV2(address _keep3rV2) external;\\n\\n  /// @notice Sets the work extra gas amount\\n  /// @param _workExtraGas The work extra gas\\n  function setWorkExtraGas(uint256 _workExtraGas) external;\\n\\n  /// @notice Sets the quote twap time\\n  /// @param _quoteTwapTime The twap time for quoting\\n  function setQuoteTwapTime(uint32 _quoteTwapTime) external;\\n}\\n\",\"keccak256\":\"0x187ab1606deb0ffaa49342c2964ddc93022651a2936a19642475a3ec6bce29b9\",\"license\":\"MIT\"},\"solidity/interfaces/external/IKeep3rV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\\n\\n// solhint-disable func-name-mixedcase\\ninterface IKeep3rV1 is IERC20, IERC20Metadata {\\n  // Structs\\n  struct Checkpoint {\\n    uint32 fromBlock;\\n    uint256 votes;\\n  }\\n\\n  // Events\\n  event DelegateChanged(address indexed _delegator, address indexed _fromDelegate, address indexed _toDelegate);\\n  event DelegateVotesChanged(address indexed _delegate, uint256 _previousBalance, uint256 _newBalance);\\n  event SubmitJob(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event ApplyCredit(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event RemoveJob(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event UnbondJob(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event JobAdded(address indexed _job, uint256 _block, address _governance);\\n  event JobRemoved(address indexed _job, uint256 _block, address _governance);\\n  event KeeperWorked(address indexed _credit, address indexed _job, address indexed _keeper, uint256 _block, uint256 _amount);\\n  event KeeperBonding(address indexed _keeper, uint256 _block, uint256 _active, uint256 _bond);\\n  event KeeperBonded(address indexed _keeper, uint256 _block, uint256 _activated, uint256 _bond);\\n  event KeeperUnbonding(address indexed _keeper, uint256 _block, uint256 _deactive, uint256 _bond);\\n  event KeeperUnbound(address indexed _keeper, uint256 _block, uint256 _deactivated, uint256 _bond);\\n  event KeeperSlashed(address indexed _keeper, address indexed _slasher, uint256 _block, uint256 _slash);\\n  event KeeperDispute(address indexed _keeper, uint256 _block);\\n  event KeeperResolved(address indexed _keeper, uint256 _block);\\n  event TokenCreditAddition(address indexed _credit, address indexed _job, address indexed _creditor, uint256 _block, uint256 _amount);\\n\\n  // Variables\\n  function KPRH() external returns (address);\\n\\n  function delegates(address _delegator) external view returns (address);\\n\\n  function checkpoints(address _account, uint32 _checkpoint) external view returns (Checkpoint memory);\\n\\n  function numCheckpoints(address _account) external view returns (uint32);\\n\\n  function DOMAIN_TYPEHASH() external returns (bytes32);\\n\\n  function DOMAINSEPARATOR() external returns (bytes32);\\n\\n  function DELEGATION_TYPEHASH() external returns (bytes32);\\n\\n  function PERMIT_TYPEHASH() external returns (bytes32);\\n\\n  function nonces(address _user) external view returns (uint256);\\n\\n  function BOND() external returns (uint256);\\n\\n  function UNBOND() external returns (uint256);\\n\\n  function LIQUIDITYBOND() external returns (uint256);\\n\\n  function FEE() external returns (uint256);\\n\\n  function BASE() external returns (uint256);\\n\\n  function ETH() external returns (address);\\n\\n  function bondings(address _user, address _bonding) external view returns (uint256);\\n\\n  function canWithdrawAfter(address _user, address _bonding) external view returns (uint256);\\n\\n  function pendingUnbonds(address _keeper, address _bonding) external view returns (uint256);\\n\\n  function pendingbonds(address _keeper, address _bonding) external view returns (uint256);\\n\\n  function bonds(address _keeper, address _bonding) external view returns (uint256);\\n\\n  function votes(address _delegator) external view returns (uint256);\\n\\n  function firstSeen(address _keeper) external view returns (uint256);\\n\\n  function disputes(address _keeper) external view returns (bool);\\n\\n  function lastJob(address _keeper) external view returns (uint256);\\n\\n  function workCompleted(address _keeper) external view returns (uint256);\\n\\n  function jobs(address _job) external view returns (bool);\\n\\n  function credits(address _job, address _credit) external view returns (uint256);\\n\\n  function liquidityProvided(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function liquidityUnbonding(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function liquidityAmountsUnbonding(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function jobProposalDelay(address _job) external view returns (uint256);\\n\\n  function liquidityApplied(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function liquidityAmount(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function keepers(address _keeper) external view returns (bool);\\n\\n  function blacklist(address _keeper) external view returns (bool);\\n\\n  function keeperList(uint256 _index) external view returns (address);\\n\\n  function jobList(uint256 _index) external view returns (address);\\n\\n  function governance() external returns (address);\\n\\n  function pendingGovernance() external returns (address);\\n\\n  function liquidityAccepted(address _liquidity) external view returns (bool);\\n\\n  function liquidityPairs(uint256 _index) external view returns (address);\\n\\n  // Methods\\n  function getCurrentVotes(address _account) external view returns (uint256);\\n\\n  function addCreditETH(address _job) external payable;\\n\\n  function addCredit(\\n    address _credit,\\n    address _job,\\n    uint256 _amount\\n  ) external;\\n\\n  function addVotes(address _voter, uint256 _amount) external;\\n\\n  function removeVotes(address _voter, uint256 _amount) external;\\n\\n  function addKPRCredit(address _job, uint256 _amount) external;\\n\\n  function approveLiquidity(address _liquidity) external;\\n\\n  function revokeLiquidity(address _liquidity) external;\\n\\n  function pairs() external view returns (address[] memory);\\n\\n  function addLiquidityToJob(\\n    address _liquidity,\\n    address _job,\\n    uint256 _amount\\n  ) external;\\n\\n  function applyCreditToJob(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external;\\n\\n  function unbondLiquidityFromJob(\\n    address _liquidity,\\n    address _job,\\n    uint256 _amount\\n  ) external;\\n\\n  function removeLiquidityFromJob(address _liquidity, address _job) external;\\n\\n  function mint(uint256 _amount) external;\\n\\n  function burn(uint256 _amount) external;\\n\\n  function worked(address _keeper) external;\\n\\n  function receipt(\\n    address _credit,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n\\n  function receiptETH(address _keeper, uint256 _amount) external;\\n\\n  function addJob(address _job) external;\\n\\n  function getJobs() external view returns (address[] memory);\\n\\n  function removeJob(address _job) external;\\n\\n  function setKeep3rHelper(address _keep3rHelper) external;\\n\\n  function setGovernance(address _governance) external;\\n\\n  function acceptGovernance() external;\\n\\n  function isKeeper(address _keeper) external returns (bool);\\n\\n  function isMinKeeper(\\n    address _keeper,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) external returns (bool);\\n\\n  function isBondedKeeper(\\n    address _keeper,\\n    address _bond,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) external returns (bool);\\n\\n  function bond(address _bonding, uint256 _amount) external;\\n\\n  function getKeepers() external view returns (address[] memory);\\n\\n  function activate(address _bonding) external;\\n\\n  function unbond(address _bonding, uint256 _amount) external;\\n\\n  function slash(\\n    address _bonded,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n\\n  function withdraw(address _bonding) external;\\n\\n  function dispute(address _keeper) external;\\n\\n  function revoke(address _keeper) external;\\n\\n  function resolve(address _keeper) external;\\n\\n  function permit(\\n    address _owner,\\n    address _spender,\\n    uint256 _amount,\\n    uint256 _deadline,\\n    uint8 _v,\\n    bytes32 _r,\\n    bytes32 _s\\n  ) external;\\n}\\n\",\"keccak256\":\"0xa9806cd6666ab1b7375ef72446964a72397fd4cefc7cc8c5b37caa7c50df0246\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IBaseErrors.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.4 <0.9.0;\\n\\ninterface IBaseErrors {\\n  /// @notice Throws if a variable is assigned to the zero address\\n  error ZeroAddress();\\n}\\n\",\"keccak256\":\"0x9130019a08d9eaedfb920a323fed5c7f409736cd918f1a32921c93551b3ee00e\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IGovernable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Governable contract\\n/// @notice Manages the governance role\\ninterface IGovernable {\\n  // Events\\n\\n  /// @notice Emitted when pendingGovernance accepts to be governance\\n  /// @param _governance Address of the new governance\\n  event GovernanceSet(address _governance);\\n\\n  /// @notice Emitted when a new governance is proposed\\n  /// @param _pendingGovernance Address that is proposed to be the new governance\\n  event GovernanceProposal(address _pendingGovernance);\\n\\n  // Errors\\n\\n  /// @notice Throws if the caller of the function is not governance\\n  error OnlyGovernance();\\n\\n  /// @notice Throws if the caller of the function is not pendingGovernance\\n  error OnlyPendingGovernance();\\n\\n  /// @notice Throws if trying to set governance to zero address\\n  error NoGovernanceZeroAddress();\\n\\n  // Variables\\n\\n  /// @notice Stores the governance address\\n  /// @return _governance The governance addresss\\n  function governance() external view returns (address _governance);\\n\\n  /// @notice Stores the pendingGovernance address\\n  /// @return _pendingGovernance The pendingGovernance addresss\\n  function pendingGovernance() external view returns (address _pendingGovernance);\\n\\n  // Methods\\n\\n  /// @notice Proposes a new address to be governance\\n  /// @param _governance The address being proposed as the new governance\\n  function setGovernance(address _governance) external;\\n\\n  /// @notice Changes the governance from the current governance to the previously proposed address\\n  function acceptGovernance() external;\\n}\\n\",\"keccak256\":\"0x3284624b2479bbf97c821f37c93a096dcb869b30bbf9b20d30d1800f9535452c\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rAccountance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rDisputable contract\\n/// @notice Disputes keepers, or if they're already disputed, it can resolve the case\\n/// @dev Argument `bonding` can be the address of either a token or a liquidity\\ninterface IKeep3rAccountance {\\n  // Events\\n\\n  /// @notice Emitted when the bonding process of a new keeper begins\\n  /// @param _keeper The caller of Keep3rKeeperFundable#bond function\\n  /// @param _bonding The asset the keeper has bonded\\n  /// @param _amount The amount the keeper has bonded\\n  event Bonding(address indexed _keeper, address indexed _bonding, uint256 _amount);\\n\\n  /// @notice Emitted when a keeper or job begins the unbonding process to withdraw the funds\\n  /// @param _keeperOrJob The keeper or job that began the unbonding process\\n  /// @param _unbonding The liquidity pair or asset being unbonded\\n  /// @param _amount The amount being unbonded\\n  event Unbonding(address indexed _keeperOrJob, address indexed _unbonding, uint256 _amount);\\n\\n  // Variables\\n\\n  /// @notice Tracks the total KP3R earnings of a keeper since it started working\\n  /// @param _keeper The address of the keeper\\n  /// @return _workCompleted Total KP3R earnings of a keeper since it started working\\n  function workCompleted(address _keeper) external view returns (uint256 _workCompleted);\\n\\n  /// @notice Tracks when a keeper was first registered\\n  /// @param _keeper The address of the keeper\\n  /// @return timestamp The time at which the keeper was first registered\\n  function firstSeen(address _keeper) external view returns (uint256 timestamp);\\n\\n  /// @notice Tracks if a keeper or job has a pending dispute\\n  /// @param _keeperOrJob The address of the keeper or job\\n  /// @return _disputed Whether a keeper or job has a pending dispute\\n  function disputes(address _keeperOrJob) external view returns (bool _disputed);\\n\\n  /// @notice Tracks how much a keeper has bonded of a certain token\\n  /// @param _keeper The address of the keeper\\n  /// @param _bond The address of the token being bonded\\n  /// @return _bonds Amount of a certain token that a keeper has bonded\\n  function bonds(address _keeper, address _bond) external view returns (uint256 _bonds);\\n\\n  /// @notice The current token credits available for a job\\n  /// @param _job The address of the job\\n  /// @param _token The address of the token bonded\\n  /// @return _amount The amount of token credits available for a job\\n  function jobTokenCredits(address _job, address _token) external view returns (uint256 _amount);\\n\\n  /// @notice Tracks the amount of assets deposited in pending bonds\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being bonded\\n  /// @return _pendingBonds Amount of a certain asset a keeper has unbonding\\n  function pendingBonds(address _keeper, address _bonding) external view returns (uint256 _pendingBonds);\\n\\n  /// @notice Tracks when a bonding for a keeper can be activated\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being bonded\\n  /// @return _timestamp Time at which the bonding for a keeper can be activated\\n  function canActivateAfter(address _keeper, address _bonding) external view returns (uint256 _timestamp);\\n\\n  /// @notice Tracks when keeper bonds are ready to be withdrawn\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being unbonded\\n  /// @return _timestamp Time at which the keeper bonds are ready to be withdrawn\\n  function canWithdrawAfter(address _keeper, address _bonding) external view returns (uint256 _timestamp);\\n\\n  /// @notice Tracks how much keeper bonds are to be withdrawn\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being unbonded\\n  /// @return _pendingUnbonds The amount of keeper bonds that are to be withdrawn\\n  function pendingUnbonds(address _keeper, address _bonding) external view returns (uint256 _pendingUnbonds);\\n\\n  /// @notice Checks whether the address has ever bonded an asset\\n  /// @param _keeper The address of the keeper\\n  /// @return _hasBonded Whether the address has ever bonded an asset\\n  function hasBonded(address _keeper) external view returns (bool _hasBonded);\\n\\n  // Methods\\n\\n  /// @notice Lists all jobs\\n  /// @return _jobList Array with all the jobs in _jobs\\n  function jobs() external view returns (address[] memory _jobList);\\n\\n  /// @notice Lists all keepers\\n  /// @return _keeperList Array with all the keepers in _keepers\\n  function keepers() external view returns (address[] memory _keeperList);\\n\\n  // Errors\\n\\n  /// @notice Throws when an address is passed as a job, but that address is not a job\\n  error JobUnavailable();\\n\\n  /// @notice Throws when an action that requires an undisputed job is applied on a disputed job\\n  error JobDisputed();\\n}\\n\",\"keccak256\":\"0x18e34e422f1e401d294581d84eab674af602383a73bd8ecd77c61de5f899f881\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rJobs.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rJobFundableCredits contract\\n/// @notice Handles the addition and withdrawal of credits from a job\\ninterface IKeep3rJobFundableCredits {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobFundableCredits#addTokenCreditsToJob is called\\n  /// @param _job The address of the job being credited\\n  /// @param _token The address of the token being provided\\n  /// @param _provider The user that calls the function\\n  /// @param _amount The amount of credit being added to the job\\n  event TokenCreditAddition(address indexed _job, address indexed _token, address indexed _provider, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rJobFundableCredits#withdrawTokenCreditsFromJob is called\\n  /// @param _job The address of the job from which the credits are withdrawn\\n  /// @param _token The credit being withdrawn from the job\\n  /// @param _receiver The user that receives the tokens\\n  /// @param _amount The amount of credit withdrawn\\n  event TokenCreditWithdrawal(address indexed _job, address indexed _token, address indexed _receiver, uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws when the token is KP3R, as it should not be used for direct token payments\\n  error TokenUnallowed();\\n\\n  /// @notice Throws when the token withdraw cooldown has not yet passed\\n  error JobTokenCreditsLocked();\\n\\n  /// @notice Throws when the user tries to withdraw more tokens than it has\\n  error InsufficientJobTokenCredits();\\n\\n  // Variables\\n\\n  /// @notice Last block where tokens were added to the job\\n  /// @param _job The address of the job credited\\n  /// @param _token The address of the token credited\\n  /// @return _timestamp The last block where tokens were added to the job\\n  function jobTokenCreditsAddedAt(address _job, address _token) external view returns (uint256 _timestamp);\\n\\n  // Methods\\n\\n  /// @notice Add credit to a job to be paid out for work\\n  /// @param _job The address of the job being credited\\n  /// @param _token The address of the token being credited\\n  /// @param _amount The amount of credit being added\\n  function addTokenCreditsToJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Withdraw credit from a job\\n  /// @param _job The address of the job from which the credits are withdrawn\\n  /// @param _token The address of the token being withdrawn\\n  /// @param _amount The amount of token to be withdrawn\\n  /// @param _receiver The user that will receive tokens\\n  function withdrawTokenCreditsFromJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount,\\n    address _receiver\\n  ) external;\\n}\\n\\n/// @title  Keep3rJobFundableLiquidity contract\\n/// @notice Handles the funding of jobs through specific liquidity pairs\\ninterface IKeep3rJobFundableLiquidity {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#approveLiquidity function is called\\n  /// @param _liquidity The address of the liquidity pair being approved\\n  event LiquidityApproval(address _liquidity);\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#revokeLiquidity function is called\\n  /// @param _liquidity The address of the liquidity pair being revoked\\n  event LiquidityRevocation(address _liquidity);\\n\\n  /// @notice Emitted when IKeep3rJobFundableLiquidity#addLiquidityToJob function is called\\n  /// @param _job The address of the job to which liquidity will be added\\n  /// @param _liquidity The address of the liquidity being added\\n  /// @param _provider The user that calls the function\\n  /// @param _amount The amount of liquidity being added\\n  event LiquidityAddition(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _amount);\\n\\n  /// @notice Emitted when IKeep3rJobFundableLiquidity#withdrawLiquidityFromJob function is called\\n  /// @param _job The address of the job of which liquidity will be withdrawn from\\n  /// @param _liquidity The address of the liquidity being withdrawn\\n  /// @param _receiver The receiver of the liquidity tokens\\n  /// @param _amount The amount of liquidity being withdrawn from the job\\n  event LiquidityWithdrawal(address indexed _job, address indexed _liquidity, address indexed _receiver, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#addLiquidityToJob function is called\\n  /// @param _job The address of the job whose credits will be updated\\n  /// @param _rewardedAt The time at which the job was last rewarded\\n  /// @param _currentCredits The current credits of the job\\n  /// @param _periodCredits The credits of the job for the current period\\n  event LiquidityCreditsReward(address indexed _job, uint256 _rewardedAt, uint256 _currentCredits, uint256 _periodCredits);\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#forceLiquidityCreditsToJob function is called\\n  /// @param _job The address of the job whose credits will be updated\\n  /// @param _rewardedAt The time at which the job was last rewarded\\n  /// @param _currentCredits The current credits of the job\\n  event LiquidityCreditsForced(address indexed _job, uint256 _rewardedAt, uint256 _currentCredits);\\n\\n  // Errors\\n\\n  /// @notice Throws when the liquidity being approved has already been approved\\n  error LiquidityPairApproved();\\n\\n  /// @notice Throws when the liquidity being removed has not been approved\\n  error LiquidityPairUnexistent();\\n\\n  /// @notice Throws when trying to add liquidity to an unapproved pool\\n  error LiquidityPairUnapproved();\\n\\n  /// @notice Throws when the job doesn't have the requested liquidity\\n  error JobLiquidityUnexistent();\\n\\n  /// @notice Throws when trying to remove more liquidity than the job has\\n  error JobLiquidityInsufficient();\\n\\n  /// @notice Throws when trying to add less liquidity than the minimum liquidity required\\n  error JobLiquidityLessThanMin();\\n\\n  // Structs\\n\\n  /// @notice Stores the tick information of the different liquidity pairs\\n  struct TickCache {\\n    int56 current; // Tracks the current tick\\n    int56 difference; // Stores the difference between the current tick and the last tick\\n    uint256 period; // Stores the period at which the last observation was made\\n  }\\n\\n  // Variables\\n\\n  /// @notice Lists liquidity pairs\\n  /// @return _list An array of addresses with all the approved liquidity pairs\\n  function approvedLiquidities() external view returns (address[] memory _list);\\n\\n  /// @notice Amount of liquidity in a specified job\\n  /// @param _job The address of the job being checked\\n  /// @param _liquidity The address of the liquidity we are checking\\n  /// @return _amount Amount of liquidity in the specified job\\n  function liquidityAmount(address _job, address _liquidity) external view returns (uint256 _amount);\\n\\n  /// @notice Last time the job was rewarded liquidity credits\\n  /// @param _job The address of the job being checked\\n  /// @return _timestamp Timestamp of the last time the job was rewarded liquidity credits\\n  function rewardedAt(address _job) external view returns (uint256 _timestamp);\\n\\n  /// @notice Last time the job was worked\\n  /// @param _job The address of the job being checked\\n  /// @return _timestamp Timestamp of the last time the job was worked\\n  function workedAt(address _job) external view returns (uint256 _timestamp);\\n\\n  // Methods\\n\\n  /// @notice Returns the liquidity credits of a given job\\n  /// @param _job The address of the job of which we want to know the liquidity credits\\n  /// @return _amount The liquidity credits of a given job\\n  function jobLiquidityCredits(address _job) external view returns (uint256 _amount);\\n\\n  /// @notice Returns the credits of a given job for the current period\\n  /// @param _job The address of the job of which we want to know the period credits\\n  /// @return _amount The credits the given job has at the current period\\n  function jobPeriodCredits(address _job) external view returns (uint256 _amount);\\n\\n  /// @notice Calculates the total credits of a given job\\n  /// @param _job The address of the job of which we want to know the total credits\\n  /// @return _amount The total credits of the given job\\n  function totalJobCredits(address _job) external view returns (uint256 _amount);\\n\\n  /// @notice Calculates how many credits should be rewarded periodically for a given liquidity amount\\n  /// @dev _periodCredits = underlying KP3Rs for given liquidity amount * rewardPeriod / inflationPeriod\\n  /// @param _liquidity The address of the liquidity to provide\\n  /// @param _amount The amount of liquidity to provide\\n  /// @return _periodCredits The amount of KP3R periodically minted for the given liquidity\\n  function quoteLiquidity(address _liquidity, uint256 _amount) external view returns (uint256 _periodCredits);\\n\\n  /// @notice Observes the current state of the liquidity pair being observed and updates TickCache with the information\\n  /// @param _liquidity The address of the liquidity pair being observed\\n  /// @return _tickCache The updated TickCache\\n  function observeLiquidity(address _liquidity) external view returns (TickCache memory _tickCache);\\n\\n  /// @notice Gifts liquidity credits to the specified job\\n  /// @param _job The address of the job being credited\\n  /// @param _amount The amount of liquidity credits to gift\\n  function forceLiquidityCreditsToJob(address _job, uint256 _amount) external;\\n\\n  /// @notice Approve a liquidity pair for being accepted in future\\n  /// @param _liquidity The address of the liquidity accepted\\n  function approveLiquidity(address _liquidity) external;\\n\\n  /// @notice Revoke a liquidity pair from being accepted in future\\n  /// @param _liquidity The liquidity no longer accepted\\n  function revokeLiquidity(address _liquidity) external;\\n\\n  /// @notice Allows anyone to fund a job with liquidity\\n  /// @param _job The address of the job to assign liquidity to\\n  /// @param _liquidity The liquidity being added\\n  /// @param _amount The amount of liquidity tokens to add\\n  function addLiquidityToJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Unbond liquidity for a job\\n  /// @dev Can only be called by the job's owner\\n  /// @param _job The address of the job being unbonded from\\n  /// @param _liquidity The liquidity being unbonded\\n  /// @param _amount The amount of liquidity being removed\\n  function unbondLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Withdraw liquidity from a job\\n  /// @param _job The address of the job being withdrawn from\\n  /// @param _liquidity The liquidity being withdrawn\\n  /// @param _receiver The address that will receive the withdrawn liquidity\\n  function withdrawLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    address _receiver\\n  ) external;\\n}\\n\\n/// @title Keep3rJobManager contract\\n/// @notice Handles the addition and withdrawal of credits from a job\\ninterface IKeep3rJobManager {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobManager#addJob is called\\n  /// @param _job The address of the job to add\\n  /// @param _jobOwner The job's owner\\n  event JobAddition(address indexed _job, address indexed _jobOwner);\\n\\n  // Errors\\n\\n  /// @notice Throws when trying to add a job that has already been added\\n  error JobAlreadyAdded();\\n\\n  /// @notice Throws when the address that is trying to register as a keeper is already a keeper\\n  error AlreadyAKeeper();\\n\\n  // Methods\\n\\n  /// @notice Allows any caller to add a new job\\n  /// @param _job Address of the contract for which work should be performed\\n  function addJob(address _job) external;\\n}\\n\\n/// @title Keep3rJobWorkable contract\\n/// @notice Handles the mechanisms jobs can pay keepers with along with the restrictions jobs can put on keepers before they can work on jobs\\ninterface IKeep3rJobWorkable {\\n  // Events\\n\\n  /// @notice Emitted when a keeper is validated before a job\\n  /// @param _gasLeft The amount of gas that the transaction has left at the moment of keeper validation\\n  event KeeperValidation(uint256 _gasLeft);\\n\\n  /// @notice Emitted when a keeper works a job\\n  /// @param _credit The address of the asset in which the keeper is paid\\n  /// @param _job The address of the job the keeper has worked\\n  /// @param _keeper The address of the keeper that has worked the job\\n  /// @param _payment The amount that has been paid out to the keeper in exchange for working the job\\n  /// @param _gasLeft The amount of gas that the transaction has left at the moment of payment\\n  event KeeperWork(address indexed _credit, address indexed _job, address indexed _keeper, uint256 _payment, uint256 _gasLeft);\\n\\n  // Errors\\n\\n  /// @notice Throws if the address claiming to be a job is not in the list of approved jobs\\n  error JobUnapproved();\\n\\n  /// @notice Throws if the amount of funds in the job is less than the payment that must be paid to the keeper that works that job\\n  error InsufficientFunds();\\n\\n  // Methods\\n\\n  /// @notice Confirms if the current keeper is registered\\n  /// @dev Can be used for general (non critical) functions\\n  /// @param _keeper The keeper being investigated\\n  /// @return _isKeeper Whether the address passed as a parameter is a keeper or not\\n  function isKeeper(address _keeper) external returns (bool _isKeeper);\\n\\n  /// @notice Confirms if the current keeper is registered and has a minimum bond of any asset.\\n  /// @dev Should be used for protected functions\\n  /// @param _keeper The keeper to check\\n  /// @param _bond The bond token being evaluated\\n  /// @param _minBond The minimum amount of bonded tokens\\n  /// @param _earned The minimum funds earned in the keepers lifetime\\n  /// @param _age The minimum keeper age required\\n  /// @return _isBondedKeeper Whether the `_keeper` meets the given requirements\\n  function isBondedKeeper(\\n    address _keeper,\\n    address _bond,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) external returns (bool _isBondedKeeper);\\n\\n  /// @notice Implemented by jobs to show that a keeper performed work\\n  /// @dev Automatically calculates the payment for the keeper and pays the keeper with bonded KP3R\\n  /// @param _keeper Address of the keeper that performed the work\\n  function worked(address _keeper) external;\\n\\n  /// @notice Implemented by jobs to show that a keeper performed work\\n  /// @dev Pays the keeper that performs the work with KP3R\\n  /// @param _keeper Address of the keeper that performed the work\\n  /// @param _payment The reward that should be allocated for the job\\n  function bondedPayment(address _keeper, uint256 _payment) external;\\n\\n  /// @notice Implemented by jobs to show that a keeper performed work\\n  /// @dev Pays the keeper that performs the work with a specific token\\n  /// @param _token The asset being awarded to the keeper\\n  /// @param _keeper Address of the keeper that performed the work\\n  /// @param _amount The reward that should be allocated\\n  function directTokenPayment(\\n    address _token,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n}\\n\\n/// @title Keep3rJobOwnership contract\\n/// @notice Handles the ownership of the jobs\\ninterface IKeep3rJobOwnership {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobOwnership#changeJobOwnership is called\\n  /// @param _job The address of the job proposed to have a change of owner\\n  /// @param _owner The current owner of the job\\n  /// @param _pendingOwner The new address proposed to be the owner of the job\\n  event JobOwnershipChange(address indexed _job, address indexed _owner, address indexed _pendingOwner);\\n\\n  /// @notice Emitted when Keep3rJobOwnership#JobOwnershipAssent is called\\n  /// @param _job The address of the job which the proposed owner will now own\\n  /// @param _previousOwner The previous owner of the job\\n  /// @param _newOwner The new owner of the job\\n  event JobOwnershipAssent(address indexed _job, address indexed _previousOwner, address indexed _newOwner);\\n\\n  // Errors\\n\\n  /// @notice Throws when the caller of the function is not the job owner\\n  error OnlyJobOwner();\\n\\n  /// @notice Throws when the caller of the function is not the pending job owner\\n  error OnlyPendingJobOwner();\\n\\n  // Variables\\n\\n  /// @notice Maps the job to the owner of the job\\n  /// @param _job The address of the job\\n  /// @return _owner The address of the owner of the job\\n  function jobOwner(address _job) external view returns (address _owner);\\n\\n  /// @notice Maps the job to its pending owner\\n  /// @param _job The address of the job\\n  /// @return _pendingOwner The address of the pending owner of the job\\n  function jobPendingOwner(address _job) external view returns (address _pendingOwner);\\n\\n  // Methods\\n\\n  /// @notice Proposes a new address to be the owner of the job\\n  /// @param _job The address of the job\\n  /// @param _newOwner The address of the proposed new owner\\n  function changeJobOwnership(address _job, address _newOwner) external;\\n\\n  /// @notice The proposed address accepts to be the owner of the job\\n  /// @param _job The address of the job\\n  function acceptJobOwnership(address _job) external;\\n}\\n\\n/// @title Keep3rJobMigration contract\\n/// @notice Handles the migration process of jobs to different addresses\\ninterface IKeep3rJobMigration {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobMigration#migrateJob function is called\\n  /// @param _fromJob The address of the job that requests to migrate\\n  /// @param _toJob The address at which the job requests to migrate\\n  event JobMigrationRequested(address indexed _fromJob, address _toJob);\\n\\n  /// @notice Emitted when Keep3rJobMigration#acceptJobMigration function is called\\n  /// @param _fromJob The address of the job that requested to migrate\\n  /// @param _toJob The address at which the job had requested to migrate\\n  event JobMigrationSuccessful(address _fromJob, address indexed _toJob);\\n\\n  // Errors\\n\\n  /// @notice Throws when the address of the job that requests to migrate wants to migrate to its same address\\n  error JobMigrationImpossible();\\n\\n  /// @notice Throws when the _toJob address differs from the address being tracked in the pendingJobMigrations mapping\\n  error JobMigrationUnavailable();\\n\\n  /// @notice Throws when cooldown between migrations has not yet passed\\n  error JobMigrationLocked();\\n\\n  // Variables\\n\\n  /// @notice Maps the jobs that have requested a migration to the address they have requested to migrate to\\n  /// @return _toJob The address to which the job has requested to migrate to\\n  function pendingJobMigrations(address _fromJob) external view returns (address _toJob);\\n\\n  // Methods\\n\\n  /// @notice Initializes the migration process for a job by adding the request to the pendingJobMigrations mapping\\n  /// @param _fromJob The address of the job that is requesting to migrate\\n  /// @param _toJob The address at which the job is requesting to migrate\\n  function migrateJob(address _fromJob, address _toJob) external;\\n\\n  /// @notice Completes the migration process for a job\\n  /// @dev Unbond/withdraw process doesn't get migrated\\n  /// @param _fromJob The address of the job that requested to migrate\\n  /// @param _toJob The address to which the job wants to migrate to\\n  function acceptJobMigration(address _fromJob, address _toJob) external;\\n}\\n\\n/// @title Keep3rJobDisputable contract\\n/// @notice Handles the actions that can be taken on a disputed job\\ninterface IKeep3rJobDisputable is IKeep3rJobFundableCredits, IKeep3rJobFundableLiquidity {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobDisputable#slashTokenFromJob is called\\n  /// @param _job The address of the job from which the token will be slashed\\n  /// @param _token The address of the token being slashed\\n  /// @param _slasher The user that slashes the token\\n  /// @param _amount The amount of the token being slashed\\n  event JobSlashToken(address indexed _job, address _token, address indexed _slasher, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rJobDisputable#slashLiquidityFromJob is called\\n  /// @param _job The address of the job from which the liquidity will be slashed\\n  /// @param _liquidity The address of the liquidity being slashed\\n  /// @param _slasher The user that slashes the liquidity\\n  /// @param _amount The amount of the liquidity being slashed\\n  event JobSlashLiquidity(address indexed _job, address _liquidity, address indexed _slasher, uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws when the token trying to be slashed doesn't exist\\n  error JobTokenUnexistent();\\n\\n  /// @notice Throws when someone tries to slash more tokens than the job has\\n  error JobTokenInsufficient();\\n\\n  // Methods\\n\\n  /// @notice Allows governance or slasher to slash a job specific token\\n  /// @param _job The address of the job from which the token will be slashed\\n  /// @param _token The address of the token that will be slashed\\n  /// @param _amount The amount of the token that will be slashed\\n  function slashTokenFromJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Allows governance or a slasher to slash liquidity from a job\\n  /// @param _job The address being slashed\\n  /// @param _liquidity The address of the liquidity that will be slashed\\n  /// @param _amount The amount of liquidity that will be slashed\\n  function slashLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external;\\n}\\n\\n// solhint-disable-next-line no-empty-blocks\\ninterface IKeep3rJobs is IKeep3rJobOwnership, IKeep3rJobDisputable, IKeep3rJobMigration, IKeep3rJobManager, IKeep3rJobWorkable {\\n\\n}\\n\",\"keccak256\":\"0x272ec0a748dbd227797ca1e0b45d1af2d9d8b735128b07618f1e26143f239d4f\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rKeepers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rKeeperFundable contract\\n/// @notice Handles the actions required to become a keeper\\ninterface IKeep3rKeeperFundable {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rKeeperFundable#activate is called\\n  /// @param _keeper The keeper that has been activated\\n  /// @param _bond The asset the keeper has bonded\\n  /// @param _amount The amount of the asset the keeper has bonded\\n  event Activation(address indexed _keeper, address indexed _bond, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rKeeperFundable#withdraw is called\\n  /// @param _keeper The caller of Keep3rKeeperFundable#withdraw function\\n  /// @param _bond The asset to withdraw from the bonding pool\\n  /// @param _amount The amount of funds withdrawn\\n  event Withdrawal(address indexed _keeper, address indexed _bond, uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws when the address that is trying to register as a job is already a job\\n  error AlreadyAJob();\\n\\n  // Methods\\n\\n  /// @notice Beginning of the bonding process\\n  /// @param _bonding The asset being bonded\\n  /// @param _amount The amount of bonding asset being bonded\\n  function bond(address _bonding, uint256 _amount) external;\\n\\n  /// @notice Beginning of the unbonding process\\n  /// @param _bonding The asset being unbonded\\n  /// @param _amount Allows for partial unbonding\\n  function unbond(address _bonding, uint256 _amount) external;\\n\\n  /// @notice End of the bonding process after bonding time has passed\\n  /// @param _bonding The asset being activated as bond collateral\\n  function activate(address _bonding) external;\\n\\n  /// @notice Withdraw funds after unbonding has finished\\n  /// @param _bonding The asset to withdraw from the bonding pool\\n  function withdraw(address _bonding) external;\\n}\\n\\n/// @title Keep3rKeeperDisputable contract\\n/// @notice Handles the actions that can be taken on a disputed keeper\\ninterface IKeep3rKeeperDisputable {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rKeeperDisputable#slash is called\\n  /// @param _keeper The address of the slashed keeper\\n  /// @param _slasher The user that called Keep3rKeeperDisputable#slash\\n  /// @param _amount The amount of credits slashed from the keeper\\n  event KeeperSlash(address indexed _keeper, address indexed _slasher, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rKeeperDisputable#revoke is called\\n  /// @param _keeper The address of the revoked keeper\\n  /// @param _slasher The user that called Keep3rKeeperDisputable#revoke\\n  event KeeperRevoke(address indexed _keeper, address indexed _slasher);\\n\\n  // Methods\\n\\n  /// @notice Allows governance to slash a keeper based on a dispute\\n  /// @param _keeper The address being slashed\\n  /// @param _bonded The asset being slashed\\n  /// @param _bondAmount The bonded amount being slashed\\n  /// @param _unbondAmount The pending unbond amount being slashed\\n  function slash(\\n    address _keeper,\\n    address _bonded,\\n    uint256 _bondAmount,\\n    uint256 _unbondAmount\\n  ) external;\\n\\n  /// @notice Blacklists a keeper from participating in the network\\n  /// @param _keeper The address being slashed\\n  function revoke(address _keeper) external;\\n}\\n\\n// solhint-disable-next-line no-empty-blocks\\n\\n/// @title Keep3rKeepers contract\\ninterface IKeep3rKeepers is IKeep3rKeeperDisputable {\\n\\n}\\n\",\"keccak256\":\"0x01dfc90aeb6759cf0a18e05a4c7256b59e9ce863c102196ec38ec65c9b08be72\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rParameters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './IBaseErrors.sol';\\n\\n/// @title Keep3rParameters contract\\n/// @notice Handles and sets all the required parameters for Keep3r\\n\\ninterface IKeep3rParameters is IBaseErrors {\\n  // Events\\n\\n  /// @notice Emitted when the Keep3rHelper address is changed\\n  /// @param _keep3rHelper The address of Keep3rHelper's contract\\n  event Keep3rHelperChange(address _keep3rHelper);\\n\\n  /// @notice Emitted when the Keep3rV1 address is changed\\n  /// @param _keep3rV1 The address of Keep3rV1's contract\\n  event Keep3rV1Change(address _keep3rV1);\\n\\n  /// @notice Emitted when the Keep3rV1Proxy address is changed\\n  /// @param _keep3rV1Proxy The address of Keep3rV1Proxy's contract\\n  event Keep3rV1ProxyChange(address _keep3rV1Proxy);\\n\\n  /// @notice Emitted when the KP3R-WETH pool address is changed\\n  /// @param _kp3rWethPool The address of the KP3R-WETH pool\\n  event Kp3rWethPoolChange(address _kp3rWethPool);\\n\\n  /// @notice Emitted when bondTime is changed\\n  /// @param _bondTime The new bondTime\\n  event BondTimeChange(uint256 _bondTime);\\n\\n  /// @notice Emitted when _liquidityMinimum is changed\\n  /// @param _liquidityMinimum The new _liquidityMinimum\\n  event LiquidityMinimumChange(uint256 _liquidityMinimum);\\n\\n  /// @notice Emitted when _unbondTime is changed\\n  /// @param _unbondTime The new _unbondTime\\n  event UnbondTimeChange(uint256 _unbondTime);\\n\\n  /// @notice Emitted when _rewardPeriodTime is changed\\n  /// @param _rewardPeriodTime The new _rewardPeriodTime\\n  event RewardPeriodTimeChange(uint256 _rewardPeriodTime);\\n\\n  /// @notice Emitted when the inflationPeriod is changed\\n  /// @param _inflationPeriod The new inflationPeriod\\n  event InflationPeriodChange(uint256 _inflationPeriod);\\n\\n  /// @notice Emitted when the fee is changed\\n  /// @param _fee The new token credits fee\\n  event FeeChange(uint256 _fee);\\n\\n  // Variables\\n\\n  /// @notice Address of Keep3rHelper's contract\\n  /// @return _keep3rHelper The address of Keep3rHelper's contract\\n  function keep3rHelper() external view returns (address _keep3rHelper);\\n\\n  /// @notice Address of Keep3rV1's contract\\n  /// @return _keep3rV1 The address of Keep3rV1's contract\\n  function keep3rV1() external view returns (address _keep3rV1);\\n\\n  /// @notice Address of Keep3rV1Proxy's contract\\n  /// @return _keep3rV1Proxy The address of Keep3rV1Proxy's contract\\n  function keep3rV1Proxy() external view returns (address _keep3rV1Proxy);\\n\\n  /// @notice Address of the KP3R-WETH pool\\n  /// @return _kp3rWethPool The address of KP3R-WETH pool\\n  function kp3rWethPool() external view returns (address _kp3rWethPool);\\n\\n  /// @notice The amount of time required to pass after a keeper has bonded assets for it to be able to activate\\n  /// @return _days The required bondTime in days\\n  function bondTime() external view returns (uint256 _days);\\n\\n  /// @notice The amount of time required to pass before a keeper can unbond what he has bonded\\n  /// @return _days The required unbondTime in days\\n  function unbondTime() external view returns (uint256 _days);\\n\\n  /// @notice The minimum amount of liquidity required to fund a job per liquidity\\n  /// @return _amount The minimum amount of liquidity in KP3R\\n  function liquidityMinimum() external view returns (uint256 _amount);\\n\\n  /// @notice The amount of time between each scheduled credits reward given to a job\\n  /// @return _days The reward period in days\\n  function rewardPeriodTime() external view returns (uint256 _days);\\n\\n  /// @notice The inflation period is the denominator used to regulate the emission of KP3R\\n  /// @return _period The denominator used to regulate the emission of KP3R\\n  function inflationPeriod() external view returns (uint256 _period);\\n\\n  /// @notice The fee to be sent to governance when a user adds liquidity to a job\\n  /// @return _amount The fee amount to be sent to governance when a user adds liquidity to a job\\n  function fee() external view returns (uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws if the reward period is less than the minimum reward period time\\n  error MinRewardPeriod();\\n\\n  /// @notice Throws if either a job or a keeper is disputed\\n  error Disputed();\\n\\n  /// @notice Throws if there are no bonded assets\\n  error BondsUnexistent();\\n\\n  /// @notice Throws if the time required to bond an asset has not passed yet\\n  error BondsLocked();\\n\\n  /// @notice Throws if there are no bonds to withdraw\\n  error UnbondsUnexistent();\\n\\n  /// @notice Throws if the time required to withdraw the bonds has not passed yet\\n  error UnbondsLocked();\\n\\n  // Methods\\n\\n  /// @notice Sets the Keep3rHelper address\\n  /// @param _keep3rHelper The Keep3rHelper address\\n  function setKeep3rHelper(address _keep3rHelper) external;\\n\\n  /// @notice Sets the Keep3rV1 address\\n  /// @param _keep3rV1 The Keep3rV1 address\\n  function setKeep3rV1(address _keep3rV1) external;\\n\\n  /// @notice Sets the Keep3rV1Proxy address\\n  /// @param _keep3rV1Proxy The Keep3rV1Proxy address\\n  function setKeep3rV1Proxy(address _keep3rV1Proxy) external;\\n\\n  /// @notice Sets the KP3R-WETH pool address\\n  /// @param _kp3rWethPool The KP3R-WETH pool address\\n  function setKp3rWethPool(address _kp3rWethPool) external;\\n\\n  /// @notice Sets the bond time required to activate as a keeper\\n  /// @param _bond The new bond time\\n  function setBondTime(uint256 _bond) external;\\n\\n  /// @notice Sets the unbond time required unbond what has been bonded\\n  /// @param _unbond The new unbond time\\n  function setUnbondTime(uint256 _unbond) external;\\n\\n  /// @notice Sets the minimum amount of liquidity required to fund a job\\n  /// @param _liquidityMinimum The new minimum amount of liquidity\\n  function setLiquidityMinimum(uint256 _liquidityMinimum) external;\\n\\n  /// @notice Sets the time required to pass between rewards for jobs\\n  /// @param _rewardPeriodTime The new amount of time required to pass between rewards\\n  function setRewardPeriodTime(uint256 _rewardPeriodTime) external;\\n\\n  /// @notice Sets the new inflation period\\n  /// @param _inflationPeriod The new inflation period\\n  function setInflationPeriod(uint256 _inflationPeriod) external;\\n\\n  /// @notice Sets the new fee\\n  /// @param _fee The new fee\\n  function setFee(uint256 _fee) external;\\n}\\n\",\"keccak256\":\"0x45111162f19d1cd3d1c708a4f0f80a7e85da91e396e74b9720a5ce8525d9a1bf\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rRoles.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rRoles contract\\n/// @notice Manages the Keep3r specific roles\\ninterface IKeep3rRoles {\\n  // Events\\n\\n  /// @notice Emitted when a slasher is added\\n  /// @param _slasher Address of the added slasher\\n  event SlasherAdded(address _slasher);\\n\\n  /// @notice Emitted when a slasher is removed\\n  /// @param _slasher Address of the removed slasher\\n  event SlasherRemoved(address _slasher);\\n\\n  /// @notice Emitted when a disputer is added\\n  /// @param _disputer Address of the added disputer\\n  event DisputerAdded(address _disputer);\\n\\n  /// @notice Emitted when a disputer is removed\\n  /// @param _disputer Address of the removed disputer\\n  event DisputerRemoved(address _disputer);\\n\\n  // Variables\\n\\n  /// @notice Tracks whether the address is a slasher or not\\n  /// @param _slasher Address being checked as a slasher\\n  /// @return _isSlasher Whether the address is a slasher or not\\n  function slashers(address _slasher) external view returns (bool _isSlasher);\\n\\n  /// @notice Tracks whether the address is a disputer or not\\n  /// @param _disputer Address being checked as a disputer\\n  /// @return _isDisputer Whether the address is a disputer or not\\n  function disputers(address _disputer) external view returns (bool _isDisputer);\\n\\n  // Errors\\n\\n  /// @notice Throws if the address is already a registered slasher\\n  error SlasherExistent();\\n\\n  /// @notice Throws if caller is not a registered slasher\\n  error SlasherUnexistent();\\n\\n  /// @notice Throws if the address is already a registered disputer\\n  error DisputerExistent();\\n\\n  /// @notice Throws if caller is not a registered disputer\\n  error DisputerUnexistent();\\n\\n  /// @notice Throws if the msg.sender is not a slasher or is not a part of governance\\n  error OnlySlasher();\\n\\n  /// @notice Throws if the msg.sender is not a disputer or is not a part of governance\\n  error OnlyDisputer();\\n\\n  // Methods\\n\\n  /// @notice Registers a slasher by updating the slashers mapping\\n  function addSlasher(address _slasher) external;\\n\\n  /// @notice Removes a slasher by updating the slashers mapping\\n  function removeSlasher(address _slasher) external;\\n\\n  /// @notice Registers a disputer by updating the disputers mapping\\n  function addDisputer(address _disputer) external;\\n\\n  /// @notice Removes a disputer by updating the disputers mapping\\n  function removeDisputer(address _disputer) external;\\n}\\n\",\"keccak256\":\"0x56fc1c571eecde75d6bc696f3ed46cdcae5d56ec6635abe6680d6c342b0cea14\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6080604052612af8600255612ee0600355680ad78ebc5ac620000060045561c3506005556006805463ffffffff19166102581790553480156200004157600080fd5b5060405162001e6e38038062001e6e8339810160408190526200006491620002ed565b8181806001600160a01b0381166200008e5760405162b293ed60e81b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392831617905560068054600160201b600160c01b03191664010000000092851692909202919091179055620000ed7311b7a6bc0259ed6cf9db8f499988f9ecc7167bf5620000f7565b5050505062000325565b6000731ceb5cb57c4d4e2b2433641b95dd330a33185a446001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015157600080fd5b505afa15801562000166573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018c9190620002c8565b6001600160a01b03161490506000731ceb5cb57c4d4e2b2433641b95dd330a33185a446001600160a01b0316836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015620001f257600080fd5b505afa15801562000207573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022d9190620002c8565b6001600160a01b03161490508115801562000246575080155b156200026557604051637c395fed60e01b815260040160405180910390fd5b50604080518082019091526001600160a01b03929092168083529015156020909201829052600780546001600160a81b031916909117600160a01b909202919091179055565b80516001600160a01b0381168114620002c357600080fd5b919050565b600060208284031215620002db57600080fd5b620002e682620002ab565b9392505050565b600080604083850312156200030157600080fd5b6200030c83620002ab565b91506200031c60208401620002ab565b90509250929050565b611b3980620003356000396000f3fe608060405234801561001057600080fd5b50600436106101855760003560e01c8063696a437b116100df578063696a437b146102c45780637b40c913146102e75780638561579c146103145780639aaad6791461031d578063a0d2710714610342578063ab033ea914610355578063ab5dce0014610368578063ab8cedc51461037b578063b2e0df961461038e578063b93f5af0146103a1578063c84993af146103b4578063ca4f2803146103c7578063dc686d91146103e8578063ed1bd76c14610420578063f39c38a014610433578063fe10d7741461044657600080fd5b806305e0b9a01461018a5780630c525835146101bb578063117cfc1b146101d0578063160e1e31146101ea5780632248e82d146101fd578063238efcbc1461021e57806325f09e61146102265780632742b9e71461022f578063289adb441461023857806337090c2f1461024b5780633cc7ab30146102545780633facf24214610267578063435b21c114610270578063516c33231461029e5780635aa6e675146102b1575b600080fd5b6101a5731ceb5cb57c4d4e2b2433641b95dd330a33185a4481565b6040516101b29190611850565b60405180910390f35b6101ce6101c93660046117dc565b610459565b005b6006546101a590600160201b90046001600160a01b031681565b6101ce6101f83660046115ab565b6104c0565b61021061020b366004611698565b61053b565b6040519081526020016101b2565b6101ce61056e565b61021061271081565b61021060045481565b6101ce6102463660046117dc565b6105fa565b61021060035481565b6101ce6102623660046115ab565b61065a565b61021060055481565b61028361027e3660046117dc565b6106e5565b604080519384526020840192909252908201526060016101b2565b6102106102ac3660046117dc565b610713565b6000546101a5906001600160a01b031681565b6102d76102d23660046115ab565b610778565b60405190151581526020016101b2565b600754610306906001600160a01b03811690600160a01b900460ff1682565b6040516101b292919061187e565b61021060025481565b60065461032d9063ffffffff1681565b60405163ffffffff90911681526020016101b2565b61021061035036600461180e565b6107fe565b6101ce6103633660046115ab565b61083a565b6101ce6103763660046117dc565b6108b0565b61021061038936600461178f565b610910565b6101ce61039c3660046117dc565b6109b4565b6101ce6103af366004611835565b610a14565b6102106103c23660046117dc565b610a87565b6103da6103d53660046115ab565b610a99565b6040516101b2929190611864565b6103fb6103f63660046115e5565b610b87565b60408051600694850b81529290930b60208301521515918101919091526060016101b2565b61021061042e3660046117dc565b610c92565b6001546101a5906001600160a01b031681565b6102106104543660046115ab565b610ded565b6000546001600160a01b03163314610484576040516354348f0360e01b815260040160405180910390fd5b60028190556040518181527f0919fdaaac0f59c6bc7eeef4f975d6163475220f1e4820d0bce99c84c51cac1d906020015b60405180910390a150565b6000546001600160a01b031633146104eb576040516354348f0360e01b815260040160405180910390fd5b6104f481610e8b565b6007546040517f554c636366d5fc882a9ab4b7b9d5181781d1a7076abe50ed410365620dcf4108916104b5916001600160a01b03821691600160a01b900460ff169061187e565b60008061054a6102ac85610ded565b905061056661271061055c8386611990565b61042e919061197c565b949350505050565b6001546001600160a01b0316331461059957604051637ef5703160e11b815260040160405180910390fd5b60018054600080546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b6916105f091611850565b60405180910390a1565b6000546001600160a01b03163314610625576040516354348f0360e01b815260040160405180910390fd5b60058190556040518181527fed847bdbab1a30becee18585f23c759bd06156561390d2e7fbffd18e74b56c9b906020016104b5565b6000546001600160a01b03163314610685576040516354348f0360e01b815260040160405180910390fd5b60068054600160201b600160c01b031916600160201b6001600160a01b03848116820292909217928390556040517fcf744e4fc39d49b6d8103035078629b8a3be95adc007b0d663e96bdff777b10a936104b59392900490911690611850565b60008060006106fb670de0b6b3a7640000610c92565b915061070684610713565b6005549095929450925050565b600061072182600454611035565b915060006107656002546004548560025460035461073f91906119ff565b6107499190611990565b610753919061197c565b6002546107609190611936565b61104b565b90506107714882611990565b9392505050565b600080600061078684610a99565b90925090506001600160a01b038216731ceb5cb57c4d4e2b2433641b95dd330a33185a4414156107ba575060019392505050565b6001600160a01b038116731ceb5cb57c4d4e2b2433641b95dd330a33185a44146107f757604051637d7c8f2760e11b815260040160405180910390fd5b5050919050565b60008061081761081284600687900b61194e565b61105b565b9050610831600160601b86836001600160a01b0316611469565b95945050505050565b6000546001600160a01b03163314610865576040516354348f0360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fe987aaedf9d279143bdf1eee16cf1d0feb47742867d81083df8d6cd0a5ac857f906104b5908390611850565b6000546001600160a01b031633146108db576040516354348f0360e01b815260040160405180910390fd5b60048190556040518181527feac367d684b6ac6c6ae7e3e852c06f17e6354e0f1e7122832c3e6d17e0a2b71e906020016104b5565b60008061092461081284600687900b61194e565b90506001600160801b036001600160a01b038216116109745760006109526001600160a01b03831680611990565b905061096c600160c01b876001600160801b031683611469565b9250506109ac565b600061098e6001600160a01b03831680600160401b611469565b90506109a8600160801b876001600160801b031683611469565b9250505b509392505050565b6000546001600160a01b031633146109df576040516354348f0360e01b815260040160405180910390fd5b60038190556040518181527fa1292b4e7a0d916ccfd2bc83858b05f328e344d1f0f507d97ac66723ac7c2aaa906020016104b5565b6000546001600160a01b03163314610a3f576040516354348f0360e01b815260040160405180910390fd5b6006805463ffffffff191663ffffffff83169081179091556040519081527fc806e26fb64e3a95f4b70abf4d87280555696244d01068b5f45b0e515aceb1de906020016104b5565b6000610a93328361053b565b92915050565b600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad557600080fd5b505afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906115c8565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4657600080fd5b505afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e91906115c8565b91509150915091565b6000806000846001600160a01b031663883bdbfd856040518263ffffffff1660e01b8152600401610bb89190611899565b60006040518083038186803b158015610bd057600080fd5b505afa925050508015610c0557506040513d6000823e601f3d908101601f19168201604052610c0291908101906116c4565b60015b610c3f573d808015610c33576040519150601f19603f3d011682016040523d82523d6000602084013e610c38565b606091505b5050610c8b565b81600081518110610c5257610c52611ab0565b60200260200101519450600182511115610c845781600181518110610c7957610c79611ab0565b602002602001015193505b6001925050505b9250925092565b604080516002808252606082018352600092839291906020830190803683375050600654825192935063ffffffff16918391506001908110610cd657610cd6611ab0565b63ffffffff9092166020928302919091019091015260075460405163883bdbfd60e01b81526000916001600160a01b03169063883bdbfd90610d1c908590600401611899565b60006040518083038186803b158015610d3457600080fd5b505afa158015610d48573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d7091908101906116c4565b509050600081600181518110610d8857610d88611ab0565b602002602001015182600081518110610da357610da3611ab0565b6020026020010151610db591906119af565b600754909150610831908690600160a01b900460ff16610ddd57610dd883611a6a565b610ddf565b825b60065463ffffffff16610910565b60065460405163a39744b560e01b8152600091600160201b90046001600160a01b03169063a39744b590610e3b908590731ceb5cb57c4d4e2b2433641b95dd330a33185a4490600401611864565b60206040518083038186803b158015610e5357600080fd5b505afa158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9391906117f5565b6000731ceb5cb57c4d4e2b2433641b95dd330a33185a446001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee457600080fd5b505afa158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c91906115c8565b6001600160a01b03161490506000731ceb5cb57c4d4e2b2433641b95dd330a33185a446001600160a01b0316836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8157600080fd5b505afa158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb991906115c8565b6001600160a01b031614905081158015610fd1575080155b15610fef57604051637c395fed60e01b815260040160405180910390fd5b50604080518082019091526001600160a01b03929092168083529015156020909201829052600780546001600160a81b031916909117600160a01b909202919091179055565b60008183106110445781610771565b5090919050565b6000818310156110445781610771565b60008060008360020b12611072578260020b61107f565b8260020b61107f90611a4d565b905061108e620d89e719611a2a565b60020b8111156110c85760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640160405180910390fd5b6000600182166110dc57600160801b6110ee565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b03169050600282161561112357608061111e826ffff97272373d413259a46990580e213a611990565b901c90505b600482161561114d576080611148826ffff2e50f5f656932ef12357cf3c7fdcc611990565b901c90505b6008821615611177576080611172826fffe5caca7e10e4e61c3624eaa0941cd0611990565b901c90505b60108216156111a157608061119c826fffcb9843d60f6159c9db58835c926644611990565b901c90505b60208216156111cb5760806111c6826fff973b41fa98c081472e6896dfb254c0611990565b901c90505b60408216156111f55760806111f0826fff2ea16466c96a3843ec78b326b52861611990565b901c90505b608082161561121f57608061121a826ffe5dee046a99a2a811c461f1969c3053611990565b901c90505b61010082161561124a576080611245826ffcbe86c7900a88aedcffc83b479aa3a4611990565b901c90505b610200821615611275576080611270826ff987a7253ac413176f2b074cf7815e54611990565b901c90505b6104008216156112a057608061129b826ff3392b0822b70005940c7a398e4b70f3611990565b901c90505b6108008216156112cb5760806112c6826fe7159475a2c29b7443b29c7fa6e889d9611990565b901c90505b6110008216156112f65760806112f1826fd097f3bdfd2022b8845ad8f792aa5825611990565b901c90505b61200082161561132157608061131c826fa9f746462d870fdf8a65dc1f90e061e5611990565b901c90505b61400082161561134c576080611347826f70d869a156d2a1b890bb3df62baf32f7611990565b901c90505b618000821615611377576080611372826f31be135f97d08fd981231505542fcfa6611990565b901c90505b620100008216156113a357608061139e826f09aa508b5b7a84e1c677de54f3e99bc9611990565b901c90505b620200008216156113ce5760806113c9826e5d6af8dedb81196699c329225ee604611990565b901c90505b620400008216156113f85760806113f3826d2216e584f5fa1ea926041bedfe98611990565b901c90505b6208000082161561142057608061141b826b048a170391f7dc42444e8fa2611990565b901c90505b60008460020b131561143b576114388160001961197c565b90505b611449600160201b82611a16565b15611455576001611458565b60005b6105669060ff16602083901c611936565b6000808060001985870985870292508281108382030391505080600014156114a3576000841161149857600080fd5b508290049050610771565b8084116114af57600080fd5b600084868809600260036001881981018916988990049182028318808302840302808302840302808302840302808302840302808302840302918202909203026000889003889004909101858311909403939093029303949094049190911702949350505050565b600082601f83011261152857600080fd5b8151602061153d61153883611913565b6118e3565b80838252828201915082860187848660051b890101111561155d57600080fd5b60005b8581101561158557815161157381611adc565b84529284019290840190600101611560565b5090979650505050505050565b803563ffffffff811681146115a657600080fd5b919050565b6000602082840312156115bd57600080fd5b813561077181611adc565b6000602082840312156115da57600080fd5b815161077181611adc565b600080604083850312156115f857600080fd5b823561160381611adc565b91506020838101356001600160401b0381111561161f57600080fd5b8401601f8101861361163057600080fd5b803561163e61153882611913565b80828252848201915084840189868560051b870101111561165e57600080fd5b600094505b838510156116885761167481611592565b835260019490940193918501918501611663565b5080955050505050509250929050565b600080604083850312156116ab57600080fd5b82356116b681611adc565b946020939093013593505050565b600080604083850312156116d757600080fd5b82516001600160401b03808211156116ee57600080fd5b818501915085601f83011261170257600080fd5b8151602061171261153883611913565b8083825282820191508286018a848660051b890101111561173257600080fd5b600096505b8487101561175e57805161174a81611af4565b835260019690960195918301918301611737565b509188015191965090935050508082111561177857600080fd5b5061178585828601611517565b9150509250929050565b6000806000606084860312156117a457600080fd5b83356001600160801b03811681146117bb57600080fd5b925060208401356117cb81611af4565b929592945050506040919091013590565b6000602082840312156117ee57600080fd5b5035919050565b60006020828403121561180757600080fd5b5051919050565b60008060006060848603121561182357600080fd5b8335925060208401356117cb81611af4565b60006020828403121561184757600080fd5b61077182611592565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156118d757835163ffffffff16835292840192918401916001016118b5565b50909695505050505050565b604051601f8201601f191681016001600160401b038111828210171561190b5761190b611ac6565b604052919050565b60006001600160401b0382111561192c5761192c611ac6565b5060051b60200190565b6000821982111561194957611949611a84565b500190565b60008261195d5761195d611a9a565b600160ff1b82146000198414161561197757611977611a84565b500590565b60008261198b5761198b611a9a565b500490565b60008160001904831182151516156119aa576119aa611a84565b500290565b60008160060b8360060b6000811281667fffffffffffff19018312811516156119da576119da611a84565b81667fffffffffffff0183138116156119f5576119f5611a84565b5090039392505050565b600082821015611a1157611a11611a84565b500390565b600082611a2557611a25611a9a565b500690565b60008160020b627fffff19811415611a4457611a44611a84565b60000392915050565b6000600160ff1b821415611a6357611a63611a84565b5060000390565b60008160060b667fffffffffffff19811415611a4457611a445b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611af157600080fd5b50565b8060060b8114611af157600080fdfea26469706673582212207d8525ffe4ea803f6c389bd6d9bb46c5cf6d4a4a0ea92b8b295f01fc7ed72d3f64736f6c63430008070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101855760003560e01c8063696a437b116100df578063696a437b146102c45780637b40c913146102e75780638561579c146103145780639aaad6791461031d578063a0d2710714610342578063ab033ea914610355578063ab5dce0014610368578063ab8cedc51461037b578063b2e0df961461038e578063b93f5af0146103a1578063c84993af146103b4578063ca4f2803146103c7578063dc686d91146103e8578063ed1bd76c14610420578063f39c38a014610433578063fe10d7741461044657600080fd5b806305e0b9a01461018a5780630c525835146101bb578063117cfc1b146101d0578063160e1e31146101ea5780632248e82d146101fd578063238efcbc1461021e57806325f09e61146102265780632742b9e71461022f578063289adb441461023857806337090c2f1461024b5780633cc7ab30146102545780633facf24214610267578063435b21c114610270578063516c33231461029e5780635aa6e675146102b1575b600080fd5b6101a5731ceb5cb57c4d4e2b2433641b95dd330a33185a4481565b6040516101b29190611850565b60405180910390f35b6101ce6101c93660046117dc565b610459565b005b6006546101a590600160201b90046001600160a01b031681565b6101ce6101f83660046115ab565b6104c0565b61021061020b366004611698565b61053b565b6040519081526020016101b2565b6101ce61056e565b61021061271081565b61021060045481565b6101ce6102463660046117dc565b6105fa565b61021060035481565b6101ce6102623660046115ab565b61065a565b61021060055481565b61028361027e3660046117dc565b6106e5565b604080519384526020840192909252908201526060016101b2565b6102106102ac3660046117dc565b610713565b6000546101a5906001600160a01b031681565b6102d76102d23660046115ab565b610778565b60405190151581526020016101b2565b600754610306906001600160a01b03811690600160a01b900460ff1682565b6040516101b292919061187e565b61021060025481565b60065461032d9063ffffffff1681565b60405163ffffffff90911681526020016101b2565b61021061035036600461180e565b6107fe565b6101ce6103633660046115ab565b61083a565b6101ce6103763660046117dc565b6108b0565b61021061038936600461178f565b610910565b6101ce61039c3660046117dc565b6109b4565b6101ce6103af366004611835565b610a14565b6102106103c23660046117dc565b610a87565b6103da6103d53660046115ab565b610a99565b6040516101b2929190611864565b6103fb6103f63660046115e5565b610b87565b60408051600694850b81529290930b60208301521515918101919091526060016101b2565b61021061042e3660046117dc565b610c92565b6001546101a5906001600160a01b031681565b6102106104543660046115ab565b610ded565b6000546001600160a01b03163314610484576040516354348f0360e01b815260040160405180910390fd5b60028190556040518181527f0919fdaaac0f59c6bc7eeef4f975d6163475220f1e4820d0bce99c84c51cac1d906020015b60405180910390a150565b6000546001600160a01b031633146104eb576040516354348f0360e01b815260040160405180910390fd5b6104f481610e8b565b6007546040517f554c636366d5fc882a9ab4b7b9d5181781d1a7076abe50ed410365620dcf4108916104b5916001600160a01b03821691600160a01b900460ff169061187e565b60008061054a6102ac85610ded565b905061056661271061055c8386611990565b61042e919061197c565b949350505050565b6001546001600160a01b0316331461059957604051637ef5703160e11b815260040160405180910390fd5b60018054600080546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b6916105f091611850565b60405180910390a1565b6000546001600160a01b03163314610625576040516354348f0360e01b815260040160405180910390fd5b60058190556040518181527fed847bdbab1a30becee18585f23c759bd06156561390d2e7fbffd18e74b56c9b906020016104b5565b6000546001600160a01b03163314610685576040516354348f0360e01b815260040160405180910390fd5b60068054600160201b600160c01b031916600160201b6001600160a01b03848116820292909217928390556040517fcf744e4fc39d49b6d8103035078629b8a3be95adc007b0d663e96bdff777b10a936104b59392900490911690611850565b60008060006106fb670de0b6b3a7640000610c92565b915061070684610713565b6005549095929450925050565b600061072182600454611035565b915060006107656002546004548560025460035461073f91906119ff565b6107499190611990565b610753919061197c565b6002546107609190611936565b61104b565b90506107714882611990565b9392505050565b600080600061078684610a99565b90925090506001600160a01b038216731ceb5cb57c4d4e2b2433641b95dd330a33185a4414156107ba575060019392505050565b6001600160a01b038116731ceb5cb57c4d4e2b2433641b95dd330a33185a44146107f757604051637d7c8f2760e11b815260040160405180910390fd5b5050919050565b60008061081761081284600687900b61194e565b61105b565b9050610831600160601b86836001600160a01b0316611469565b95945050505050565b6000546001600160a01b03163314610865576040516354348f0360e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383161790556040517fe987aaedf9d279143bdf1eee16cf1d0feb47742867d81083df8d6cd0a5ac857f906104b5908390611850565b6000546001600160a01b031633146108db576040516354348f0360e01b815260040160405180910390fd5b60048190556040518181527feac367d684b6ac6c6ae7e3e852c06f17e6354e0f1e7122832c3e6d17e0a2b71e906020016104b5565b60008061092461081284600687900b61194e565b90506001600160801b036001600160a01b038216116109745760006109526001600160a01b03831680611990565b905061096c600160c01b876001600160801b031683611469565b9250506109ac565b600061098e6001600160a01b03831680600160401b611469565b90506109a8600160801b876001600160801b031683611469565b9250505b509392505050565b6000546001600160a01b031633146109df576040516354348f0360e01b815260040160405180910390fd5b60038190556040518181527fa1292b4e7a0d916ccfd2bc83858b05f328e344d1f0f507d97ac66723ac7c2aaa906020016104b5565b6000546001600160a01b03163314610a3f576040516354348f0360e01b815260040160405180910390fd5b6006805463ffffffff191663ffffffff83169081179091556040519081527fc806e26fb64e3a95f4b70abf4d87280555696244d01068b5f45b0e515aceb1de906020016104b5565b6000610a93328361053b565b92915050565b600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610ad557600080fd5b505afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d91906115c8565b836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4657600080fd5b505afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e91906115c8565b91509150915091565b6000806000846001600160a01b031663883bdbfd856040518263ffffffff1660e01b8152600401610bb89190611899565b60006040518083038186803b158015610bd057600080fd5b505afa925050508015610c0557506040513d6000823e601f3d908101601f19168201604052610c0291908101906116c4565b60015b610c3f573d808015610c33576040519150601f19603f3d011682016040523d82523d6000602084013e610c38565b606091505b5050610c8b565b81600081518110610c5257610c52611ab0565b60200260200101519450600182511115610c845781600181518110610c7957610c79611ab0565b602002602001015193505b6001925050505b9250925092565b604080516002808252606082018352600092839291906020830190803683375050600654825192935063ffffffff16918391506001908110610cd657610cd6611ab0565b63ffffffff9092166020928302919091019091015260075460405163883bdbfd60e01b81526000916001600160a01b03169063883bdbfd90610d1c908590600401611899565b60006040518083038186803b158015610d3457600080fd5b505afa158015610d48573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d7091908101906116c4565b509050600081600181518110610d8857610d88611ab0565b602002602001015182600081518110610da357610da3611ab0565b6020026020010151610db591906119af565b600754909150610831908690600160a01b900460ff16610ddd57610dd883611a6a565b610ddf565b825b60065463ffffffff16610910565b60065460405163a39744b560e01b8152600091600160201b90046001600160a01b03169063a39744b590610e3b908590731ceb5cb57c4d4e2b2433641b95dd330a33185a4490600401611864565b60206040518083038186803b158015610e5357600080fd5b505afa158015610e67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9391906117f5565b6000731ceb5cb57c4d4e2b2433641b95dd330a33185a446001600160a01b0316826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610ee457600080fd5b505afa158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c91906115c8565b6001600160a01b03161490506000731ceb5cb57c4d4e2b2433641b95dd330a33185a446001600160a01b0316836001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8157600080fd5b505afa158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb991906115c8565b6001600160a01b031614905081158015610fd1575080155b15610fef57604051637c395fed60e01b815260040160405180910390fd5b50604080518082019091526001600160a01b03929092168083529015156020909201829052600780546001600160a81b031916909117600160a01b909202919091179055565b60008183106110445781610771565b5090919050565b6000818310156110445781610771565b60008060008360020b12611072578260020b61107f565b8260020b61107f90611a4d565b905061108e620d89e719611a2a565b60020b8111156110c85760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640160405180910390fd5b6000600182166110dc57600160801b6110ee565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b03169050600282161561112357608061111e826ffff97272373d413259a46990580e213a611990565b901c90505b600482161561114d576080611148826ffff2e50f5f656932ef12357cf3c7fdcc611990565b901c90505b6008821615611177576080611172826fffe5caca7e10e4e61c3624eaa0941cd0611990565b901c90505b60108216156111a157608061119c826fffcb9843d60f6159c9db58835c926644611990565b901c90505b60208216156111cb5760806111c6826fff973b41fa98c081472e6896dfb254c0611990565b901c90505b60408216156111f55760806111f0826fff2ea16466c96a3843ec78b326b52861611990565b901c90505b608082161561121f57608061121a826ffe5dee046a99a2a811c461f1969c3053611990565b901c90505b61010082161561124a576080611245826ffcbe86c7900a88aedcffc83b479aa3a4611990565b901c90505b610200821615611275576080611270826ff987a7253ac413176f2b074cf7815e54611990565b901c90505b6104008216156112a057608061129b826ff3392b0822b70005940c7a398e4b70f3611990565b901c90505b6108008216156112cb5760806112c6826fe7159475a2c29b7443b29c7fa6e889d9611990565b901c90505b6110008216156112f65760806112f1826fd097f3bdfd2022b8845ad8f792aa5825611990565b901c90505b61200082161561132157608061131c826fa9f746462d870fdf8a65dc1f90e061e5611990565b901c90505b61400082161561134c576080611347826f70d869a156d2a1b890bb3df62baf32f7611990565b901c90505b618000821615611377576080611372826f31be135f97d08fd981231505542fcfa6611990565b901c90505b620100008216156113a357608061139e826f09aa508b5b7a84e1c677de54f3e99bc9611990565b901c90505b620200008216156113ce5760806113c9826e5d6af8dedb81196699c329225ee604611990565b901c90505b620400008216156113f85760806113f3826d2216e584f5fa1ea926041bedfe98611990565b901c90505b6208000082161561142057608061141b826b048a170391f7dc42444e8fa2611990565b901c90505b60008460020b131561143b576114388160001961197c565b90505b611449600160201b82611a16565b15611455576001611458565b60005b6105669060ff16602083901c611936565b6000808060001985870985870292508281108382030391505080600014156114a3576000841161149857600080fd5b508290049050610771565b8084116114af57600080fd5b600084868809600260036001881981018916988990049182028318808302840302808302840302808302840302808302840302808302840302918202909203026000889003889004909101858311909403939093029303949094049190911702949350505050565b600082601f83011261152857600080fd5b8151602061153d61153883611913565b6118e3565b80838252828201915082860187848660051b890101111561155d57600080fd5b60005b8581101561158557815161157381611adc565b84529284019290840190600101611560565b5090979650505050505050565b803563ffffffff811681146115a657600080fd5b919050565b6000602082840312156115bd57600080fd5b813561077181611adc565b6000602082840312156115da57600080fd5b815161077181611adc565b600080604083850312156115f857600080fd5b823561160381611adc565b91506020838101356001600160401b0381111561161f57600080fd5b8401601f8101861361163057600080fd5b803561163e61153882611913565b80828252848201915084840189868560051b870101111561165e57600080fd5b600094505b838510156116885761167481611592565b835260019490940193918501918501611663565b5080955050505050509250929050565b600080604083850312156116ab57600080fd5b82356116b681611adc565b946020939093013593505050565b600080604083850312156116d757600080fd5b82516001600160401b03808211156116ee57600080fd5b818501915085601f83011261170257600080fd5b8151602061171261153883611913565b8083825282820191508286018a848660051b890101111561173257600080fd5b600096505b8487101561175e57805161174a81611af4565b835260019690960195918301918301611737565b509188015191965090935050508082111561177857600080fd5b5061178585828601611517565b9150509250929050565b6000806000606084860312156117a457600080fd5b83356001600160801b03811681146117bb57600080fd5b925060208401356117cb81611af4565b929592945050506040919091013590565b6000602082840312156117ee57600080fd5b5035919050565b60006020828403121561180757600080fd5b5051919050565b60008060006060848603121561182357600080fd5b8335925060208401356117cb81611af4565b60006020828403121561184757600080fd5b61077182611592565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682521515602082015260400190565b6020808252825182820181905260009190848201906040850190845b818110156118d757835163ffffffff16835292840192918401916001016118b5565b50909695505050505050565b604051601f8201601f191681016001600160401b038111828210171561190b5761190b611ac6565b604052919050565b60006001600160401b0382111561192c5761192c611ac6565b5060051b60200190565b6000821982111561194957611949611a84565b500190565b60008261195d5761195d611a9a565b600160ff1b82146000198414161561197757611977611a84565b500590565b60008261198b5761198b611a9a565b500490565b60008160001904831182151516156119aa576119aa611a84565b500290565b60008160060b8360060b6000811281667fffffffffffff19018312811516156119da576119da611a84565b81667fffffffffffff0183138116156119f5576119f5611a84565b5090039392505050565b600082821015611a1157611a11611a84565b500390565b600082611a2557611a25611a9a565b500690565b60008160020b627fffff19811415611a4457611a44611a84565b60000392915050565b6000600160ff1b821415611a6357611a63611a84565b5060000390565b60008160060b667fffffffffffff19811415611a4457611a445b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611af157600080fd5b50565b8060060b8114611af157600080fdfea26469706673582212207d8525ffe4ea803f6c389bd6d9bb46c5cf6d4a4a0ea92b8b295f01fc7ed72d3f64736f6c63430008070033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "bonds(address)": {
        "params": {
          "_keeper": "The address of the keeper to check"
        },
        "returns": {
          "_amountBonded": "The amount of KP3R the keeper has bonded"
        }
      },
      "getKP3RsAtTick(uint256,int56,uint256)": {
        "params": {
          "_liquidityAmount": "Amount of liquidity to be converted",
          "_tickDifference": "Tick value used to calculate the quote",
          "_timeInterval": "Time value used to calculate the quote"
        },
        "returns": {
          "_kp3rAmount": "Amount of KP3R tokens underlying on the given liquidity"
        }
      },
      "getPaymentParams(uint256)": {
        "params": {
          "_bonds": "Amount of bonded KP3R owned by the keeper"
        },
        "returns": {
          "_boost": "Multiplier per gas unit. Takes into account the base fee and the amount of bonded KP3R",
          "_extra": "Amount of extra gas that should be added to the gas spent",
          "_oneEthQuote": "Amount of KP3R tokens equivalent to 1 ETH"
        }
      },
      "getPoolTokens(address)": {
        "params": {
          "_pool": "Address of the correspondant pool"
        },
        "returns": {
          "_token0": "Address of the first token of the pair",
          "_token1": "Address of the second token of the pair"
        }
      },
      "getQuoteAtTick(uint128,int56,uint256)": {
        "params": {
          "_baseAmount": "Amount of token to be converted",
          "_tickDifference": "Tick value used to calculate the quote",
          "_timeInterval": "Time value used to calculate the quote"
        },
        "returns": {
          "_quoteAmount": "Amount of credits deserved for the baseAmount at the tick value"
        }
      },
      "getRewardAmount(uint256)": {
        "params": {
          "_gasUsed": "The amount of gas used that will be rewarded"
        },
        "returns": {
          "_amount": "The amount of KP3R that should be awarded to tx.origin"
        }
      },
      "getRewardAmountFor(address,uint256)": {
        "params": {
          "_gasUsed": "The amount of gas used that will be rewarded",
          "_keeper": "The address of the keeper to check"
        },
        "returns": {
          "_kp3r": "The amount of KP3R that should be awarded to the keeper"
        }
      },
      "getRewardBoostFor(uint256)": {
        "params": {
          "_bonds": "The amount of KP3R tokens bonded by the keeper"
        },
        "returns": {
          "_rewardBoost": "The reward boost that corresponds to the keeper"
        }
      },
      "isKP3RToken0(address)": {
        "params": {
          "_pool": "Address of the correspondant pool"
        },
        "returns": {
          "_isKP3RToken0": "Boolean indicating the order of the tokens in the pair"
        }
      },
      "observe(address,uint32[])": {
        "params": {
          "_pool": "Address of the pool to observe",
          "_secondsAgo": "Array with time references to observe"
        },
        "returns": {
          "_success": "Boolean indicating if the observe call was succesfull",
          "_tickCumulative1": "Cummulative sum of ticks until first time reference",
          "_tickCumulative2": "Cummulative sum of ticks until second time reference"
        }
      },
      "quote(uint256)": {
        "details": "This function allows us to calculate how much KP3R we should pay to a keeper for things expressed in ETH, like gas",
        "params": {
          "_eth": "The amount of ETH"
        },
        "returns": {
          "_amountOut": "The amount of KP3R"
        }
      },
      "setGovernance(address)": {
        "params": {
          "_governance": "The address being proposed as the new governance"
        }
      },
      "setKeep3rV2(address)": {
        "params": {
          "_keep3rV2": "The address of Keep3r V2"
        }
      },
      "setKp3rWethPool(address)": {
        "params": {
          "_poolAddress": "The address of the KP3R-WETH pool"
        }
      },
      "setMaxBoost(uint256)": {
        "params": {
          "_maxBoost": "The maximum boost multiplier"
        }
      },
      "setMinBoost(uint256)": {
        "params": {
          "_minBoost": "The minimum boost multiplier"
        }
      },
      "setQuoteTwapTime(uint32)": {
        "params": {
          "_quoteTwapTime": "The twap time for quoting"
        }
      },
      "setTargetBond(uint256)": {
        "params": {
          "_targetBond": "The target bond amount"
        }
      },
      "setWorkExtraGas(uint256)": {
        "params": {
          "_workExtraGas": "The work extra gas"
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "errors": {
      "InvalidKp3rPool()": [
        {
          "notice": "Throws when pool does not have KP3R as token0 nor token1"
        }
      ],
      "LiquidityPairInvalid()": [
        {
          "notice": "Throws when none of the tokens in the liquidity pair is KP3R"
        }
      ],
      "NoGovernanceZeroAddress()": [
        {
          "notice": "Throws if trying to set governance to zero address"
        }
      ],
      "OnlyGovernance()": [
        {
          "notice": "Throws if the caller of the function is not governance"
        }
      ],
      "OnlyPendingGovernance()": [
        {
          "notice": "Throws if the caller of the function is not pendingGovernance"
        }
      ]
    },
    "events": {
      "GovernanceProposal(address)": {
        "notice": "Emitted when a new governance is proposed"
      },
      "GovernanceSet(address)": {
        "notice": "Emitted when pendingGovernance accepts to be governance"
      },
      "Keep3rV2Change(address)": {
        "notice": "Emitted when the Keep3r V2 address is changed"
      },
      "Kp3rWethPoolChange(address,bool)": {
        "notice": "Emitted when the kp3r weth pool is changed"
      },
      "MaxBoostChange(uint256)": {
        "notice": "Emitted when the maximum boost multiplier is changed"
      },
      "MinBoostChange(uint256)": {
        "notice": "Emitted when the minimum boost multiplier is changed"
      },
      "QuoteTwapTimeChange(uint32)": {
        "notice": "Emitted when the quote twap time is changed"
      },
      "TargetBondChange(uint256)": {
        "notice": "Emitted when the target bond amount is changed"
      },
      "WorkExtraGasChange(uint256)": {
        "notice": "Emitted when the work extra gas amount is changed"
      }
    },
    "kind": "user",
    "methods": {
      "BOOST_BASE()": {
        "notice": "The boost base used to calculate the boost rewards for the keeper"
      },
      "KP3R()": {
        "notice": "Address of KP3R token"
      },
      "acceptGovernance()": {
        "notice": "Changes the governance from the current governance to the previously proposed address"
      },
      "bonds(address)": {
        "notice": "Returns the amount of KP3R the keeper has bonded"
      },
      "getKP3RsAtTick(uint256,int56,uint256)": {
        "notice": "Given a tick and a liquidity amount, calculates the underlying KP3R tokens"
      },
      "getPaymentParams(uint256)": {
        "notice": "Get multiplier, quote, and extra, in order to calculate keeper payment"
      },
      "getPoolTokens(address)": {
        "notice": "Given a pool address, returns the underlying tokens of the pair"
      },
      "getQuoteAtTick(uint128,int56,uint256)": {
        "notice": "Given a tick and a token amount, calculates the output in correspondant token"
      },
      "getRewardAmount(uint256)": {
        "notice": "Calculates the reward (in KP3R) that corresponds to tx.origin for using gas"
      },
      "getRewardAmountFor(address,uint256)": {
        "notice": "Calculates the reward (in KP3R) that corresponds to a keeper for using gas"
      },
      "getRewardBoostFor(uint256)": {
        "notice": "Calculates the boost in the reward given to a keeper based on the amount of KP3R that keeper has bonded"
      },
      "governance()": {
        "notice": "Stores the governance address"
      },
      "isKP3RToken0(address)": {
        "notice": "Defines the order of the tokens in the pair for twap calculations"
      },
      "keep3rV2()": {
        "notice": "Address of Keep3r V2"
      },
      "kp3rWethPool()": {
        "notice": "KP3R-WETH pool that is being used as oracle"
      },
      "maxBoost()": {
        "notice": "The maximum multiplier used to calculate the amount of gas paid to the Keeper for the gas used to perform a job         For example: if the quoted gas used is 1000, then the maximum amount to be paid will be 1000 * maxBoost / BOOST_BASE"
      },
      "minBoost()": {
        "notice": "The minimum multiplier used to calculate the amount of gas paid to the Keeper for the gas used to perform a job         For example: if the quoted gas used is 1000, then the minimum amount to be paid will be 1000 * minBoost / BOOST_BASE"
      },
      "observe(address,uint32[])": {
        "notice": "Given an array of secondsAgo, returns UniswapV3 pool cumulatives at that moment"
      },
      "pendingGovernance()": {
        "notice": "Stores the pendingGovernance address"
      },
      "quote(uint256)": {
        "notice": "Calculates the amount of KP3R that corresponds to the ETH passed into the function"
      },
      "quoteTwapTime()": {
        "notice": "The twap time for quoting"
      },
      "setGovernance(address)": {
        "notice": "Proposes a new address to be governance"
      },
      "setKeep3rV2(address)": {
        "notice": "Sets the Keep3r V2 address"
      },
      "setKp3rWethPool(address)": {
        "notice": "Sets KP3R-WETH pool"
      },
      "setMaxBoost(uint256)": {
        "notice": "Sets the maximum boost multiplier"
      },
      "setMinBoost(uint256)": {
        "notice": "Sets the minimum boost multiplier"
      },
      "setQuoteTwapTime(uint32)": {
        "notice": "Sets the quote twap time"
      },
      "setTargetBond(uint256)": {
        "notice": "Sets the target bond amount"
      },
      "setWorkExtraGas(uint256)": {
        "notice": "Sets the work extra gas amount"
      },
      "targetBond()": {
        "notice": "The targeted amount of bonded KP3Rs to max-up reward multiplier         For example: if the amount of KP3R the keeper has bonded is targetBond or more, then the keeper will get                      the maximum boost possible in his rewards, if it's less, the reward boost will be proportional"
      },
      "workExtraGas()": {
        "notice": "The amount of unaccounted gas that is going to be added to keeper payments"
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 5266,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "governance",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 5270,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "pendingGovernance",
        "offset": 0,
        "slot": "1",
        "type": "t_address"
      },
      {
        "astId": 2986,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "minBoost",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 2991,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "maxBoost",
        "offset": 0,
        "slot": "3",
        "type": "t_uint256"
      },
      {
        "astId": 2996,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "targetBond",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 3001,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "workExtraGas",
        "offset": 0,
        "slot": "5",
        "type": "t_uint256"
      },
      {
        "astId": 3006,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "quoteTwapTime",
        "offset": 0,
        "slot": "6",
        "type": "t_uint32"
      },
      {
        "astId": 3010,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "keep3rV2",
        "offset": 4,
        "slot": "6",
        "type": "t_address"
      },
      {
        "astId": 3015,
        "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
        "label": "kp3rWethPool",
        "offset": 0,
        "slot": "7",
        "type": "t_struct(Kp3rWethPool)11533_storage"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_struct(Kp3rWethPool)11533_storage": {
        "encoding": "inplace",
        "label": "struct IKeep3rHelperParameters.Kp3rWethPool",
        "members": [
          {
            "astId": 11530,
            "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
            "label": "poolAddress",
            "offset": 0,
            "slot": "0",
            "type": "t_address"
          },
          {
            "astId": 11532,
            "contract": "solidity/contracts/Keep3rHelper.sol:Keep3rHelper",
            "label": "isKP3RToken0",
            "offset": 20,
            "slot": "0",
            "type": "t_bool"
          }
        ],
        "numberOfBytes": "32"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint32": {
        "encoding": "inplace",
        "label": "uint32",
        "numberOfBytes": "4"
      }
    }
  }
}