{
  "address": "0xdc02981c9C062d48a9bD54adBf51b816623dcc6E",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_governance",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_keep3rHelper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_keep3rV1",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_keep3rV1Proxy",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_kp3rWethPool",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AlreadyAJob",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyAKeeper",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyDisputed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BondsLocked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BondsUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Disputed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "DisputerExistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "DisputerUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientFunds",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientJobTokenCredits",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobAlreadyAdded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobDisputed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobLiquidityInsufficient",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobLiquidityLessThanMin",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobLiquidityUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobMigrationImpossible",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobMigrationLocked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobMigrationUnavailable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobTokenCreditsLocked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobTokenInsufficient",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobTokenUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobUnapproved",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "JobUnavailable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LiquidityPairApproved",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LiquidityPairUnapproved",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LiquidityPairUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "MinRewardPeriod",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoGovernanceZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotDisputed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyDisputer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyGovernance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyJobOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyPendingGovernance",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyPendingJobOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlySlasher",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "SlasherExistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "SlasherUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TokenUnallowed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnbondsLocked",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnbondsUnexistent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_bond",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "Activation",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_bondTime",
          "type": "uint256"
        }
      ],
      "name": "BondTimeChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_bonding",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "Bonding",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_jobOrKeeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_disputer",
          "type": "address"
        }
      ],
      "name": "Dispute",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_disputer",
          "type": "address"
        }
      ],
      "name": "DisputerAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_disputer",
          "type": "address"
        }
      ],
      "name": "DisputerRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "DustSent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_fee",
          "type": "uint256"
        }
      ],
      "name": "FeeChange",
      "type": "event"
    },
    {
      "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": "uint256",
          "name": "_inflationPeriod",
          "type": "uint256"
        }
      ],
      "name": "InflationPeriodChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_jobOwner",
          "type": "address"
        }
      ],
      "name": "JobAddition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_fromJob",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_toJob",
          "type": "address"
        }
      ],
      "name": "JobMigrationRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_fromJob",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_toJob",
          "type": "address"
        }
      ],
      "name": "JobMigrationSuccessful",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_newOwner",
          "type": "address"
        }
      ],
      "name": "JobOwnershipAssent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_pendingOwner",
          "type": "address"
        }
      ],
      "name": "JobOwnershipChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "JobSlashLiquidity",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "JobSlashToken",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_keep3rHelper",
          "type": "address"
        }
      ],
      "name": "Keep3rHelperChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_keep3rV1",
          "type": "address"
        }
      ],
      "name": "Keep3rV1Change",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_keep3rV1Proxy",
          "type": "address"
        }
      ],
      "name": "Keep3rV1ProxyChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        }
      ],
      "name": "KeeperRevoke",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "KeeperSlash",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_gasLeft",
          "type": "uint256"
        }
      ],
      "name": "KeeperValidation",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_credit",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_gasLeft",
          "type": "uint256"
        }
      ],
      "name": "KeeperWork",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_kp3rWethPool",
          "type": "address"
        }
      ],
      "name": "Kp3rWethPoolChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "LiquidityAddition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        }
      ],
      "name": "LiquidityApproval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_rewardedAt",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_currentCredits",
          "type": "uint256"
        }
      ],
      "name": "LiquidityCreditsForced",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_rewardedAt",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_currentCredits",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_periodCredits",
          "type": "uint256"
        }
      ],
      "name": "LiquidityCreditsReward",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_liquidityMinimum",
          "type": "uint256"
        }
      ],
      "name": "LiquidityMinimumChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        }
      ],
      "name": "LiquidityRevocation",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "LiquidityWithdrawal",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_jobOrKeeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_resolver",
          "type": "address"
        }
      ],
      "name": "Resolve",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_rewardPeriodTime",
          "type": "uint256"
        }
      ],
      "name": "RewardPeriodTimeChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        }
      ],
      "name": "SlasherAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        }
      ],
      "name": "SlasherRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "TokenCreditAddition",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "TokenCreditWithdrawal",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_unbondTime",
          "type": "uint256"
        }
      ],
      "name": "UnbondTimeChange",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeperOrJob",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_unbonding",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "Unbonding",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_bond",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "Withdrawal",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "BASE",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ETH_ADDRESS",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MIN_REWARD_PERIOD_TIME",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptGovernance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_fromJob",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_toJob",
          "type": "address"
        }
      ],
      "name": "acceptJobMigration",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        }
      ],
      "name": "acceptJobOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_bonding",
          "type": "address"
        }
      ],
      "name": "activate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_disputer",
          "type": "address"
        }
      ],
      "name": "addDisputer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        }
      ],
      "name": "addJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "addLiquidityToJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        }
      ],
      "name": "addSlasher",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "addTokenCreditsToJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        }
      ],
      "name": "approveLiquidity",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "approvedLiquidities",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "_list",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_bonding",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "bond",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "bondTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_payment",
          "type": "uint256"
        }
      ],
      "name": "bondedPayment",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "bonds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "canActivateAfter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "canWithdrawAfter",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_newOwner",
          "type": "address"
        }
      ],
      "name": "changeJobOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "directTokenPayment",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_jobOrKeeper",
          "type": "address"
        }
      ],
      "name": "dispute",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "disputers",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "disputes",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "firstSeen",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "forceLiquidityCreditsToJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "governance",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "hasBonded",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "inflationPeriod",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_bond",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_minBond",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_earned",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_age",
          "type": "uint256"
        }
      ],
      "name": "isBondedKeeper",
      "outputs": [
        {
          "internalType": "bool",
          "name": "_isBondedKeeper",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        }
      ],
      "name": "isKeeper",
      "outputs": [
        {
          "internalType": "bool",
          "name": "_isKeeper",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        }
      ],
      "name": "jobLiquidityCredits",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_liquidityCredits",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "jobOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "jobPendingOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        }
      ],
      "name": "jobPeriodCredits",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_periodCredits",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "jobTokenCredits",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "jobTokenCreditsAddedAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "jobs",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "_list",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "keep3rHelper",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "keep3rV1",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "keep3rV1Proxy",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "keepers",
      "outputs": [
        {
          "internalType": "address[]",
          "name": "_list",
          "type": "address[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "kp3rWethPool",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "liquidityAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "liquidityMinimum",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_fromJob",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_toJob",
          "type": "address"
        }
      ],
      "name": "migrateJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        }
      ],
      "name": "observeLiquidity",
      "outputs": [
        {
          "components": [
            {
              "internalType": "int56",
              "name": "current",
              "type": "int56"
            },
            {
              "internalType": "int56",
              "name": "difference",
              "type": "int56"
            },
            {
              "internalType": "uint256",
              "name": "period",
              "type": "uint256"
            }
          ],
          "internalType": "struct IKeep3rJobFundableLiquidity.TickCache",
          "name": "_tickCache",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "pendingBonds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pendingGovernance",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "pendingJobMigrations",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "pendingUnbonds",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "quoteLiquidity",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_periodCredits",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_disputer",
          "type": "address"
        }
      ],
      "name": "removeDisputer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_slasher",
          "type": "address"
        }
      ],
      "name": "removeSlasher",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_jobOrKeeper",
          "type": "address"
        }
      ],
      "name": "resolve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        }
      ],
      "name": "revoke",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        }
      ],
      "name": "revokeLiquidity",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardPeriodTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "rewardedAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "sendDust",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_bondTime",
          "type": "uint256"
        }
      ],
      "name": "setBondTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_fee",
          "type": "uint256"
        }
      ],
      "name": "setFee",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_governance",
          "type": "address"
        }
      ],
      "name": "setGovernance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_inflationPeriod",
          "type": "uint256"
        }
      ],
      "name": "setInflationPeriod",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keep3rHelper",
          "type": "address"
        }
      ],
      "name": "setKeep3rHelper",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keep3rV1",
          "type": "address"
        }
      ],
      "name": "setKeep3rV1",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keep3rV1Proxy",
          "type": "address"
        }
      ],
      "name": "setKeep3rV1Proxy",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_kp3rWethPool",
          "type": "address"
        }
      ],
      "name": "setKp3rWethPool",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_liquidityMinimum",
          "type": "uint256"
        }
      ],
      "name": "setLiquidityMinimum",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_rewardPeriodTime",
          "type": "uint256"
        }
      ],
      "name": "setRewardPeriodTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_unbondTime",
          "type": "uint256"
        }
      ],
      "name": "setUnbondTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_bonded",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "slash",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "slashLiquidityFromJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "slashTokenFromJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "slashers",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        }
      ],
      "name": "totalJobCredits",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_credits",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_bonding",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "unbond",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "unbondLiquidityFromJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unbondTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_bonding",
          "type": "address"
        }
      ],
      "name": "withdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_liquidity",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "withdrawLiquidityFromJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_job",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "withdrawTokenCreditsFromJob",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "workCompleted",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_keeper",
          "type": "address"
        }
      ],
      "name": "worked",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "workedAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xb4f6c752f9cb8e15afeeb7a19e6f49dd3c00abd62334c1e2dace759eee7debc3",
  "receipt": {
    "to": null,
    "from": "0x54054EA2db6eDC336cB87966815FD66Cc337f224",
    "contractAddress": "0xdc02981c9C062d48a9bD54adBf51b816623dcc6E",
    "transactionIndex": 51,
    "gasUsed": "5668938",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xaf7074d0607103674dae6ca51f79ed19111d5f186155d0c753abc036e871ac82",
    "transactionHash": "0xb4f6c752f9cb8e15afeeb7a19e6f49dd3c00abd62334c1e2dace759eee7debc3",
    "logs": [],
    "blockNumber": 13595407,
    "cumulativeGasUsed": "11116945",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x54054EA2db6eDC336cB87966815FD66Cc337f224",
    "0xC07C37A0A1e557E0d1704c90d966B37A67a45dD4",
    "0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44",
    "0xFC48aC750959d5d5aE9A4bb38f548A7CA8763F8d",
    "0x11b7a6bc0259ed6cf9db8f499988f9ecc7167bf5"
  ],
  "solcInputHash": "f2135d1d9c1b65279853f8327888dda7",
  "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_keep3rHelper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_keep3rV1\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_keep3rV1Proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_kp3rWethPool\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyAJob\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyAKeeper\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondsLocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BondsUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Disputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputerExistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DisputerUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientJobTokenCredits\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobLiquidityInsufficient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobLiquidityLessThanMin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobLiquidityUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobMigrationImpossible\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobMigrationLocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobMigrationUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobTokenCreditsLocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobTokenInsufficient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobTokenUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobUnapproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"JobUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityPairApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityPairUnapproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityPairUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MinRewardPeriod\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoGovernanceZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotDisputed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyDisputer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyGovernance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyJobOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPendingGovernance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPendingJobOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySlasher\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SlasherExistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SlasherUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenUnallowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnbondsLocked\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnbondsUnexistent\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bond\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Activation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_bondTime\",\"type\":\"uint256\"}],\"name\":\"BondTimeChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bonding\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Bonding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_jobOrKeeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_disputer\",\"type\":\"address\"}],\"name\":\"Dispute\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_disputer\",\"type\":\"address\"}],\"name\":\"DisputerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_disputer\",\"type\":\"address\"}],\"name\":\"DisputerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"DustSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"FeeChange\",\"type\":\"event\"},{\"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\":\"uint256\",\"name\":\"_inflationPeriod\",\"type\":\"uint256\"}],\"name\":\"InflationPeriodChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_jobOwner\",\"type\":\"address\"}],\"name\":\"JobAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_fromJob\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_toJob\",\"type\":\"address\"}],\"name\":\"JobMigrationRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_fromJob\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_toJob\",\"type\":\"address\"}],\"name\":\"JobMigrationSuccessful\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"JobOwnershipAssent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_pendingOwner\",\"type\":\"address\"}],\"name\":\"JobOwnershipChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"JobSlashLiquidity\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"JobSlashToken\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_keep3rHelper\",\"type\":\"address\"}],\"name\":\"Keep3rHelperChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_keep3rV1\",\"type\":\"address\"}],\"name\":\"Keep3rV1Change\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_keep3rV1Proxy\",\"type\":\"address\"}],\"name\":\"Keep3rV1ProxyChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"}],\"name\":\"KeeperRevoke\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"KeeperSlash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLeft\",\"type\":\"uint256\"}],\"name\":\"KeeperValidation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_credit\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_gasLeft\",\"type\":\"uint256\"}],\"name\":\"KeeperWork\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_kp3rWethPool\",\"type\":\"address\"}],\"name\":\"Kp3rWethPoolChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"}],\"name\":\"LiquidityApproval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_rewardedAt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_currentCredits\",\"type\":\"uint256\"}],\"name\":\"LiquidityCreditsForced\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_rewardedAt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_currentCredits\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_periodCredits\",\"type\":\"uint256\"}],\"name\":\"LiquidityCreditsReward\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_liquidityMinimum\",\"type\":\"uint256\"}],\"name\":\"LiquidityMinimumChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"}],\"name\":\"LiquidityRevocation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_jobOrKeeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_resolver\",\"type\":\"address\"}],\"name\":\"Resolve\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_rewardPeriodTime\",\"type\":\"uint256\"}],\"name\":\"RewardPeriodTimeChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"}],\"name\":\"SlasherAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"}],\"name\":\"SlasherRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenCreditAddition\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"TokenCreditWithdrawal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_unbondTime\",\"type\":\"uint256\"}],\"name\":\"UnbondTimeChange\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeperOrJob\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_unbonding\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Unbonding\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_bond\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BASE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ETH_ADDRESS\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_REWARD_PERIOD_TIME\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_fromJob\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_toJob\",\"type\":\"address\"}],\"name\":\"acceptJobMigration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"}],\"name\":\"acceptJobOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bonding\",\"type\":\"address\"}],\"name\":\"activate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_disputer\",\"type\":\"address\"}],\"name\":\"addDisputer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"}],\"name\":\"addJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"addLiquidityToJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"}],\"name\":\"addSlasher\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"addTokenCreditsToJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"}],\"name\":\"approveLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"approvedLiquidities\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"_list\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bonding\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"bond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bondTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_payment\",\"type\":\"uint256\"}],\"name\":\"bondedPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"bonds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"canActivateAfter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"canWithdrawAfter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"changeJobOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"directTokenPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_jobOrKeeper\",\"type\":\"address\"}],\"name\":\"dispute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"disputers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"disputes\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"firstSeen\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"forceLiquidityCreditsToJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"hasBonded\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inflationPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bond\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minBond\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_earned\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_age\",\"type\":\"uint256\"}],\"name\":\"isBondedKeeper\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_isBondedKeeper\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"}],\"name\":\"isKeeper\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"_isKeeper\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"}],\"name\":\"jobLiquidityCredits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityCredits\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"jobOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"jobPendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"}],\"name\":\"jobPeriodCredits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_periodCredits\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"jobTokenCredits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"jobTokenCreditsAddedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"jobs\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"_list\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"keep3rHelper\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"keep3rV1\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"keep3rV1Proxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"keepers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"_list\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"kp3rWethPool\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"liquidityAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidityMinimum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_fromJob\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_toJob\",\"type\":\"address\"}],\"name\":\"migrateJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"}],\"name\":\"observeLiquidity\",\"outputs\":[{\"components\":[{\"internalType\":\"int56\",\"name\":\"current\",\"type\":\"int56\"},{\"internalType\":\"int56\",\"name\":\"difference\",\"type\":\"int56\"},{\"internalType\":\"uint256\",\"name\":\"period\",\"type\":\"uint256\"}],\"internalType\":\"struct IKeep3rJobFundableLiquidity.TickCache\",\"name\":\"_tickCache\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingBonds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingGovernance\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingJobMigrations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"pendingUnbonds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"quoteLiquidity\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_periodCredits\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_disputer\",\"type\":\"address\"}],\"name\":\"removeDisputer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_slasher\",\"type\":\"address\"}],\"name\":\"removeSlasher\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_jobOrKeeper\",\"type\":\"address\"}],\"name\":\"resolve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"}],\"name\":\"revoke\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"}],\"name\":\"revokeLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPeriodTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewardedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"sendDust\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bondTime\",\"type\":\"uint256\"}],\"name\":\"setBondTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"}],\"name\":\"setFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governance\",\"type\":\"address\"}],\"name\":\"setGovernance\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_inflationPeriod\",\"type\":\"uint256\"}],\"name\":\"setInflationPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keep3rHelper\",\"type\":\"address\"}],\"name\":\"setKeep3rHelper\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keep3rV1\",\"type\":\"address\"}],\"name\":\"setKeep3rV1\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keep3rV1Proxy\",\"type\":\"address\"}],\"name\":\"setKeep3rV1Proxy\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_kp3rWethPool\",\"type\":\"address\"}],\"name\":\"setKp3rWethPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_liquidityMinimum\",\"type\":\"uint256\"}],\"name\":\"setLiquidityMinimum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rewardPeriodTime\",\"type\":\"uint256\"}],\"name\":\"setRewardPeriodTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_unbondTime\",\"type\":\"uint256\"}],\"name\":\"setUnbondTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_bonded\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"slashLiquidityFromJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"slashTokenFromJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"slashers\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"}],\"name\":\"totalJobCredits\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"_credits\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bonding\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"unbond\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"unbondLiquidityFromJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unbondTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bonding\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_liquidity\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"withdrawLiquidityFromJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_job\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"withdrawTokenCreditsFromJob\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"workCompleted\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_keeper\",\"type\":\"address\"}],\"name\":\"worked\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"workedAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"acceptJobMigration(address,address)\":{\"details\":\"Unbond/withdraw process doesn't get migrated\",\"params\":{\"_fromJob\":\"The address of the job that requested to migrate\",\"_toJob\":\"The address to which the job wants to migrate to\"}},\"activate(address)\":{\"params\":{\"_bonding\":\"The asset being activated as bond collateral\"}},\"addJob(address)\":{\"params\":{\"_job\":\"Address of the contract for which work should be performed\"}},\"addLiquidityToJob(address,address,uint256)\":{\"params\":{\"_amount\":\"The amount of liquidity tokens to add\",\"_job\":\"The address of the job to assign liquidity to\",\"_liquidity\":\"The liquidity being added\"}},\"addTokenCreditsToJob(address,address,uint256)\":{\"params\":{\"_amount\":\"The amount of credit being added\",\"_job\":\"The address of the job being credited\",\"_token\":\"The address of the token being credited\"}},\"approveLiquidity(address)\":{\"params\":{\"_liquidity\":\"The address of the liquidity accepted\"}},\"approvedLiquidities()\":{\"returns\":{\"_list\":\"An array of addresses with all the approved liquidity pairs\"}},\"bond(address,uint256)\":{\"params\":{\"_amount\":\"The amount of bonding asset being bound\",\"_bonding\":\"The asset being bound\"}},\"bondedPayment(address,uint256)\":{\"details\":\"Pays the keeper that performs the work with KP3R\",\"params\":{\"_keeper\":\"Address of the keeper that performed the work\",\"_payment\":\"The reward that should be allocated for the job\"}},\"directTokenPayment(address,address,uint256)\":{\"details\":\"Pays the keeper that performs the work with a specific token\",\"params\":{\"_amount\":\"The reward that should be allocated\",\"_keeper\":\"Address of the keeper that performed the work\",\"_token\":\"The asset being awarded to the keeper\"}},\"dispute(address)\":{\"params\":{\"_jobOrKeeper\":\"The address in dispute\"}},\"forceLiquidityCreditsToJob(address,uint256)\":{\"params\":{\"_amount\":\"The amount of liquidity credits to gift\",\"_job\":\"The address of the job being credited\"}},\"isBondedKeeper(address,address,uint256,uint256,uint256)\":{\"params\":{\"_age\":\"The minimum keeper age required\",\"_bond\":\"The bond token being evaluated\",\"_earned\":\"The minimum funds earned in the keepers lifetime\",\"_keeper\":\"The keeper to check\",\"_minBond\":\"The minimum amount of bonded tokens\"},\"returns\":{\"_isBondedKeeper\":\"Whether the `_keeper` meets the given requirements\"}},\"isKeeper(address)\":{\"params\":{\"_keeper\":\"The keeper being investigated\"},\"returns\":{\"_isKeeper\":\"Whether the address passed as a parameter is a keeper or not\"}},\"jobLiquidityCredits(address)\":{\"params\":{\"_job\":\"The address of the job of which we want to know the liquidity credits\"},\"returns\":{\"_liquidityCredits\":\"The liquidity credits of a given job\"}},\"jobPeriodCredits(address)\":{\"params\":{\"_job\":\"The address of the job of which we want to know the period credits\"},\"returns\":{\"_periodCredits\":\"The credits the given job has at the current period\"}},\"jobs()\":{\"returns\":{\"_list\":\"Array with all the jobs in _jobs\"}},\"keepers()\":{\"returns\":{\"_list\":\"Array with all the jobs in keepers\"}},\"migrateJob(address,address)\":{\"params\":{\"_fromJob\":\"The address of the job that is requesting to migrate\",\"_toJob\":\"The address at which the job is requesting to migrate\"}},\"observeLiquidity(address)\":{\"params\":{\"_liquidity\":\"The liquidity pair being observed\"},\"returns\":{\"_tickCache\":\"The updated TickCache\"}},\"quoteLiquidity(address,uint256)\":{\"details\":\"_periodCredits = underlying KP3Rs for given liquidity amount * rewardPeriod / inflationPeriod\",\"params\":{\"_amount\":\"The amount of liquidity to provide\",\"_liquidity\":\"The liquidity to provide\"},\"returns\":{\"_periodCredits\":\"The amount of KP3R periodically minted for the given liquidity\"}},\"resolve(address)\":{\"params\":{\"_jobOrKeeper\":\"The address cleared\"}},\"revoke(address)\":{\"params\":{\"_keeper\":\"The address being slashed\"}},\"revokeLiquidity(address)\":{\"params\":{\"_liquidity\":\"The liquidity no longer accepted\"}},\"sendDust(address,uint256,address)\":{\"params\":{\"_amount\":\"The amont of the token that will be transferred\",\"_to\":\"The address that will receive the idle funds\",\"_token\":\"The token that will be transferred\"}},\"setBondTime(uint256)\":{\"params\":{\"_bond\":\"The new bond time\"}},\"setFee(uint256)\":{\"params\":{\"_fee\":\"The new fee\"}},\"setGovernance(address)\":{\"params\":{\"_governance\":\"The address of the user proposed to be the new governance\"}},\"setInflationPeriod(uint256)\":{\"params\":{\"_inflationPeriod\":\"The new inflation period\"}},\"setKeep3rHelper(address)\":{\"params\":{\"_keep3rHelper\":\"The Keep3rHelper address\"}},\"setKeep3rV1(address)\":{\"params\":{\"_keep3rV1\":\"The Keep3rV1 address\"}},\"setKeep3rV1Proxy(address)\":{\"params\":{\"_keep3rV1Proxy\":\"The Keep3rV1Proxy address\"}},\"setKp3rWethPool(address)\":{\"params\":{\"_kp3rWethPool\":\"The KP3R-WETH pool address\"}},\"setLiquidityMinimum(uint256)\":{\"params\":{\"_liquidityMinimum\":\"The new minimum amount of liquidity\"}},\"setRewardPeriodTime(uint256)\":{\"params\":{\"_rewardPeriodTime\":\"The new amount of time required to pass between rewards\"}},\"setUnbondTime(uint256)\":{\"params\":{\"_unbond\":\"The new unbond time\"}},\"slash(address,address,uint256)\":{\"params\":{\"_amount\":\"The amount being slashed\",\"_bonded\":\"The asset being slashed\",\"_keeper\":\"The address being slashed\"}},\"slashLiquidityFromJob(address,address,uint256)\":{\"params\":{\"_amount\":\"The amount of liquidity that will be slashed\",\"_job\":\"The address being slashed\",\"_liquidity\":\"The address of the liquidity that will be slashed\"}},\"slashTokenFromJob(address,address,uint256)\":{\"params\":{\"_amount\":\"The amount of the token that will be slashed\",\"_job\":\"The address of the job from which the token will be slashed\",\"_token\":\"The address of the token that will be slashed\"}},\"totalJobCredits(address)\":{\"params\":{\"_job\":\"The address of the job of which we want to know the total credits\"},\"returns\":{\"_credits\":\"The total credits of the given job\"}},\"unbond(address,uint256)\":{\"params\":{\"_amount\":\"Allows for partial unbonding\",\"_bonding\":\"The asset being unbound\"}},\"unbondLiquidityFromJob(address,address,uint256)\":{\"details\":\"Can only be called by the job's owner\",\"params\":{\"_amount\":\"The amount of liquidity being removed\",\"_job\":\"The address of the job being unbound from\",\"_liquidity\":\"The liquidity being unbound\"}},\"withdraw(address)\":{\"params\":{\"_bonding\":\"The asset to withdraw from the bonding pool\"}},\"withdrawLiquidityFromJob(address,address,address)\":{\"params\":{\"_job\":\"The address of the job being withdrawn from\",\"_liquidity\":\"The liquidity being withdrawn\",\"_receiver\":\"The address that will receive the withdrawn liquidity\"}},\"withdrawTokenCreditsFromJob(address,address,uint256,address)\":{\"params\":{\"_amount\":\"The amount of token to be withdrawn\",\"_job\":\"The address of the job from which the credits are withdrawn\",\"_receiver\":\"The user that will receive tokens\",\"_token\":\"The address of the token being withdrawn\"}},\"worked(address)\":{\"details\":\"Automatically calculates the payment for the keeper\",\"params\":{\"_keeper\":\"Address of the keeper that performed the work\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"AlreadyAJob()\":[{\"notice\":\"Throws when the address that is trying to register as a job is already a job\"}],\"AlreadyAKeeper()\":[{\"notice\":\"Throws when the address that is trying to register as a keeper is already a keeper\"}],\"AlreadyDisputed()\":[{\"notice\":\"Throws when a job or keeper is already disputed\"}],\"BondsLocked()\":[{\"notice\":\"Throws if the time required to bond an asset has not passed yet\"}],\"BondsUnexistent()\":[{\"notice\":\"Throws if there are no bonded assets\"}],\"Disputed()\":[{\"notice\":\"Throws if either a job or a keeper is disputed\"}],\"DisputerExistent()\":[{\"notice\":\"Throws if the address is already a registered disputer\"}],\"DisputerUnexistent()\":[{\"notice\":\"Throws if caller is not a registered disputer\"}],\"InsufficientFunds()\":[{\"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\"}],\"InsufficientJobTokenCredits()\":[{\"notice\":\"Throws when the user tries to withdraw more tokens than it has\"}],\"JobAlreadyAdded()\":[{\"notice\":\"Throws when trying to add a job that has already been added\"}],\"JobDisputed()\":[{\"notice\":\"Throws when an action that requires an undisputed job is applied on a disputed job\"}],\"JobLiquidityInsufficient()\":[{\"notice\":\"Throws when trying to remove more liquidity than the job has\"}],\"JobLiquidityLessThanMin()\":[{\"notice\":\"Throws when trying to add less liquidity than the minimum liquidity required\"}],\"JobLiquidityUnexistent()\":[{\"notice\":\"Throws when the job doesn't have the requested liquidity\"}],\"JobMigrationImpossible()\":[{\"notice\":\"Throws when the address of the job that requests to migrate wants to migrate to its same address\"}],\"JobMigrationLocked()\":[{\"notice\":\"Throws when cooldown between migrations has not yet passed\"}],\"JobMigrationUnavailable()\":[{\"notice\":\"Throws when the _toJob address differs from the address being tracked in the pendingJobMigrations mapping\"}],\"JobTokenCreditsLocked()\":[{\"notice\":\"Throws when the token withdraw cooldown has not yet passed\"}],\"JobTokenInsufficient()\":[{\"notice\":\"Throws when someone tries to slash more tokens than the job has\"}],\"JobTokenUnexistent()\":[{\"notice\":\"Throws when the token trying to be slashed doesn't exist\"}],\"JobUnapproved()\":[{\"notice\":\"Throws if the address claiming to be a job is not in the list of approved jobs\"}],\"JobUnavailable()\":[{\"notice\":\"Throws when an address is passed as a job, but that address is not a job\"}],\"LiquidityPairApproved()\":[{\"notice\":\"Throws when the liquidity being approved has already been approved\"}],\"LiquidityPairUnapproved()\":[{\"notice\":\"Throws when trying to add liquidity to an unapproved pool\"}],\"LiquidityPairUnexistent()\":[{\"notice\":\"Throws when the liquidity being removed has not been approved\"}],\"MinRewardPeriod()\":[{\"notice\":\"Throws if the reward period is less than the minimum reward period time\"}],\"NoGovernanceZeroAddress()\":[{\"notice\":\"Throws if trying to set governance to zero address\"}],\"NotDisputed()\":[{\"notice\":\"Throws when a job or keeper is not disputed and someone tries to resolve the dispute\"}],\"OnlyDisputer()\":[{\"notice\":\"Throws if the msg.sender is not a disputer or is not a part of governance\"}],\"OnlyGovernance()\":[{\"notice\":\"Throws if the caller of the function is not governance\"}],\"OnlyJobOwner()\":[{\"notice\":\"Throws when the caller of the function is not the job owner\"}],\"OnlyPendingGovernance()\":[{\"notice\":\"Throws if the caller of the function is not pendingGovernance\"}],\"OnlyPendingJobOwner()\":[{\"notice\":\"Throws when the caller of the function is not the pending job owner\"}],\"OnlySlasher()\":[{\"notice\":\"Throws if the msg.sender is not a slasher or is not a part of governance\"}],\"SlasherExistent()\":[{\"notice\":\"Throws if the address is already a registered slasher\"}],\"SlasherUnexistent()\":[{\"notice\":\"Throws if caller is not a registered slasher\"}],\"TokenUnallowed()\":[{\"notice\":\"Throws when the token is KP3R, as it should not be used for direct token payments\"}],\"UnbondsLocked()\":[{\"notice\":\"Throws if the time required to withdraw the bonds has not passed yet\"}],\"UnbondsUnexistent()\":[{\"notice\":\"Throws if there are no bonds to withdraw\"}],\"ZeroAddress()\":[{\"notice\":\"Throws if a variable is assigned to the zero address\"}]},\"events\":{\"Activation(address,address,uint256)\":{\"notice\":\"Emitted when Keep3rKeeperFundable#activate is called\"},\"BondTimeChange(uint256)\":{\"notice\":\"Emitted when bondTime is changed\"},\"Bonding(address,address,uint256)\":{\"notice\":\"Emitted when the bonding process of a new keeper begins\"},\"Dispute(address,address)\":{\"notice\":\"Emitted when a keeper or a job is disputed\"},\"DisputerAdded(address)\":{\"notice\":\"Emitted when a disputer is added\"},\"DisputerRemoved(address)\":{\"notice\":\"Emitted when a disputer is removed\"},\"DustSent(address,uint256,address)\":{\"notice\":\"Emitted when dust is sent\"},\"FeeChange(uint256)\":{\"notice\":\"Emitted when the fee is changed\"},\"GovernanceProposal(address)\":{\"notice\":\"Emitted when a new governance is proposed\"},\"GovernanceSet(address)\":{\"notice\":\"Emitted when pendingGovernance accepts to be governance\"},\"InflationPeriodChange(uint256)\":{\"notice\":\"Emitted when the inflationPeriod is changed\"},\"JobAddition(address,address)\":{\"notice\":\"Emitted when Keep3rJobManager#addJob is called\"},\"JobMigrationRequested(address,address)\":{\"notice\":\"Emitted when Keep3rJobMigration#migrateJob function is called\"},\"JobMigrationSuccessful(address,address)\":{\"notice\":\"Emitted when Keep3rJobMigration#acceptJobMigration function is called\"},\"JobOwnershipAssent(address,address,address)\":{\"notice\":\"Emitted when Keep3rJobOwnership#JobOwnershipAssent is called\"},\"JobOwnershipChange(address,address,address)\":{\"notice\":\"Emitted when Keep3rJobOwnership#changeJobOwnership is called\"},\"JobSlashLiquidity(address,address,address,uint256)\":{\"notice\":\"Emitted when Keep3rJobDisputable#slashLiquidityFromJob is called\"},\"JobSlashToken(address,address,address,uint256)\":{\"notice\":\"Emitted when Keep3rJobDisputable#slashTokenFromJob is called\"},\"Keep3rHelperChange(address)\":{\"notice\":\"Emitted when the Keep3rHelper address is changed\"},\"Keep3rV1Change(address)\":{\"notice\":\"Emitted when the Keep3rV1 address is changed\"},\"Keep3rV1ProxyChange(address)\":{\"notice\":\"Emitted when the Keep3rV1Proxy address is changed\"},\"KeeperRevoke(address,address)\":{\"notice\":\"Emitted when Keep3rKeeperDisputable#revoke is called\"},\"KeeperSlash(address,address,uint256)\":{\"notice\":\"Emitted when Keep3rKeeperDisputable#slash is called\"},\"KeeperValidation(uint256)\":{\"notice\":\"Emitted when a keeper is validated before a job\"},\"KeeperWork(address,address,address,uint256,uint256)\":{\"notice\":\"Emitted when a keeper works a job\"},\"Kp3rWethPoolChange(address)\":{\"notice\":\"Emitted when the KP3R-WETH pool address is changed\"},\"LiquidityAddition(address,address,address,uint256)\":{\"notice\":\"Emitted when IKeep3rJobFundableLiquidity#addLiquidityToJob function is called\"},\"LiquidityApproval(address)\":{\"notice\":\"Emitted when Keep3rJobFundableLiquidity#approveLiquidity function is called\"},\"LiquidityCreditsForced(address,uint256,uint256)\":{\"notice\":\"Emitted when Keep3rJobFundableLiquidity#forceLiquidityCreditsToJob function is called\"},\"LiquidityCreditsReward(address,uint256,uint256,uint256)\":{\"notice\":\"Emitted when Keep3rJobFundableLiquidity#addLiquidityToJob function is called\"},\"LiquidityMinimumChange(uint256)\":{\"notice\":\"Emitted when _liquidityMinimum is changed\"},\"LiquidityRevocation(address)\":{\"notice\":\"Emitted when Keep3rJobFundableLiquidity#revokeLiquidity function is called\"},\"LiquidityWithdrawal(address,address,address,uint256)\":{\"notice\":\"Emitted when IKeep3rJobFundableLiquidity#withdrawLiquidityFromJob function is called\"},\"Resolve(address,address)\":{\"notice\":\"Emitted when a dispute is resolved\"},\"RewardPeriodTimeChange(uint256)\":{\"notice\":\"Emitted when _rewardPeriodTime is changed\"},\"SlasherAdded(address)\":{\"notice\":\"Emitted when a slasher is added\"},\"SlasherRemoved(address)\":{\"notice\":\"Emitted when a slasher is removed\"},\"TokenCreditAddition(address,address,address,uint256)\":{\"notice\":\"Emitted when Keep3rJobFundableCredits#addTokenCreditsToJob is called\"},\"TokenCreditWithdrawal(address,address,address,uint256)\":{\"notice\":\"Emitted when Keep3rJobFundableCredits#withdrawTokenCreditsFromJob is called\"},\"UnbondTimeChange(uint256)\":{\"notice\":\"Emitted when _unbondTime is changed\"},\"Unbonding(address,address,uint256)\":{\"notice\":\"Emitted when a keeper or job begins the unbonding process to withdraw the funds\"},\"Withdrawal(address,address,uint256)\":{\"notice\":\"Emitted when Keep3rKeeperFundable#withdraw is called\"}},\"kind\":\"user\",\"methods\":{\"BASE()\":{\"notice\":\"The base that will be used to calculate the fee\"},\"MIN_REWARD_PERIOD_TIME()\":{\"notice\":\"The minimum rewardPeriodTime value to be set\"},\"acceptGovernance()\":{\"notice\":\"Changes the governance from the current governance to the previously proposed address\"},\"acceptJobMigration(address,address)\":{\"notice\":\"Completes the migration process for a job\"},\"acceptJobOwnership(address)\":{\"notice\":\"The proposed address accepts to be the owner of the job\"},\"activate(address)\":{\"notice\":\"End of the bonding process after bonding time has passed\"},\"addDisputer(address)\":{\"notice\":\"Registers a disputer by updating the disputers mapping\"},\"addJob(address)\":{\"notice\":\"Allows any caller to add a new job\"},\"addLiquidityToJob(address,address,uint256)\":{\"notice\":\"Allows anyone to fund a job with liquidity\"},\"addSlasher(address)\":{\"notice\":\"Registers a slasher by updating the slashers mapping\"},\"addTokenCreditsToJob(address,address,uint256)\":{\"notice\":\"Add credit to a job to be paid out for work\"},\"approveLiquidity(address)\":{\"notice\":\"Approve a liquidity pair for being accepted in future\"},\"approvedLiquidities()\":{\"notice\":\"Lists liquidity pairs\"},\"bond(address,uint256)\":{\"notice\":\"Beginning of the bonding process\"},\"bondTime()\":{\"notice\":\"The amount of time required to pass after a keeper has bonded assets for it to be able to activate\"},\"bondedPayment(address,uint256)\":{\"notice\":\"Implemented by jobs to show that a keeper performed work\"},\"bonds(address,address)\":{\"notice\":\"Mapping (job => bonding => amount)\"},\"canActivateAfter(address,address)\":{\"notice\":\"Tracks when a bonding for a keeper can be activated\"},\"canWithdrawAfter(address,address)\":{\"notice\":\"Tracks when keeper bonds are ready to be withdrawn\"},\"changeJobOwnership(address,address)\":{\"notice\":\"Proposes a new address to be the owner of the job\"},\"directTokenPayment(address,address,uint256)\":{\"notice\":\"Implemented by jobs to show that a keeper performed work\"},\"dispute(address)\":{\"notice\":\"Allows governance to create a dispute for a given keeper/job\"},\"disputers(address)\":{\"notice\":\"Maps an address to a boolean to determine whether the address is a disputer or not.\"},\"disputes(address)\":{\"notice\":\"Tracks if a keeper or job has a pending dispute\"},\"fee()\":{\"notice\":\"The fee to be sent to governance when a user adds liquidity to a job\"},\"firstSeen(address)\":{\"notice\":\"Tracks when a keeper was first registered\"},\"forceLiquidityCreditsToJob(address,uint256)\":{\"notice\":\"Gifts liquidity credits to the specified job\"},\"governance()\":{\"notice\":\"Stores the governance address\"},\"hasBonded(address)\":{\"notice\":\"Checks whether the address has ever bonded an asset\"},\"inflationPeriod()\":{\"notice\":\"The inflation period is the denominator used to regulate the emission of KP3R\"},\"isBondedKeeper(address,address,uint256,uint256,uint256)\":{\"notice\":\"Confirms if the current keeper is registered and has a minimum bond of any asset. Should be used for protected functions\"},\"isKeeper(address)\":{\"notice\":\"Confirms if the current keeper is registered, can be used for general (non critical) functions\"},\"jobLiquidityCredits(address)\":{\"notice\":\"Returns the liquidity credits of a given job\"},\"jobOwner(address)\":{\"notice\":\"Maps the job to the owner of the job (job => user)\"},\"jobPendingOwner(address)\":{\"notice\":\"Maps the owner of the job to its pending owner (job => user)\"},\"jobPeriodCredits(address)\":{\"notice\":\"Returns the credits of a given job for the current period\"},\"jobTokenCredits(address,address)\":{\"notice\":\"The current token credits available for a job\"},\"jobTokenCreditsAddedAt(address,address)\":{\"notice\":\"Last block where tokens were added to the job [job => token => timestamp]\"},\"jobs()\":{\"notice\":\"Lists all jobs\"},\"keep3rHelper()\":{\"notice\":\"Address of Keep3rHelper's contract\"},\"keep3rV1()\":{\"notice\":\"Address of Keep3rV1's contract\"},\"keep3rV1Proxy()\":{\"notice\":\"Address of Keep3rV1Proxy's contract\"},\"keepers()\":{\"notice\":\"Lists all keepers\"},\"kp3rWethPool()\":{\"notice\":\"Address of the KP3R-WETH pool\"},\"liquidityAmount(address,address)\":{\"notice\":\"Amount of liquidity in a specified job\"},\"liquidityMinimum()\":{\"notice\":\"The minimum amount of liquidity required to fund a job per liquidity\"},\"migrateJob(address,address)\":{\"notice\":\"Initializes the migration process for a job by adding the request to the pendingJobMigrations mapping\"},\"observeLiquidity(address)\":{\"notice\":\"Observes the current state of the liquidity pair being observed and updates TickCache with the information\"},\"pendingBonds(address,address)\":{\"notice\":\"Tracks the amount of assets deposited in pending bonds\"},\"pendingGovernance()\":{\"notice\":\"Stores the pendingGovernance address\"},\"pendingJobMigrations(address)\":{\"notice\":\"Maps the jobs that have requested a migration to the address they have requested to migrate to\"},\"pendingUnbonds(address,address)\":{\"notice\":\"Tracks how much keeper bonds are to be withdrawn\"},\"quoteLiquidity(address,uint256)\":{\"notice\":\"Calculates how many credits should be rewarded periodically for a given liquidity amount\"},\"removeDisputer(address)\":{\"notice\":\"Removes a disputer by updating the disputers mapping\"},\"removeSlasher(address)\":{\"notice\":\"Removes a slasher by updating the slashers mapping\"},\"resolve(address)\":{\"notice\":\"Allows governance to resolve a dispute on a keeper/job\"},\"revoke(address)\":{\"notice\":\"Blacklists a keeper from participating in the network\"},\"revokeLiquidity(address)\":{\"notice\":\"Revoke a liquidity pair from being accepted in future\"},\"rewardPeriodTime()\":{\"notice\":\"The amount of time between each scheduled credits reward given to a job\"},\"rewardedAt(address)\":{\"notice\":\"Last time the job was rewarded liquidity credits\"},\"sendDust(address,uint256,address)\":{\"notice\":\"Allows an authorized user to transfer the tokens or eth that may have been left in a contract\"},\"setBondTime(uint256)\":{\"notice\":\"Sets the bond time required to activate as a keeper\"},\"setFee(uint256)\":{\"notice\":\"Sets the new fee\"},\"setGovernance(address)\":{\"notice\":\"Proposes a new address to be governance\"},\"setInflationPeriod(uint256)\":{\"notice\":\"Sets the new inflation period\"},\"setKeep3rHelper(address)\":{\"notice\":\"Sets the Keep3rHelper address\"},\"setKeep3rV1(address)\":{\"notice\":\"Sets the Keep3rV1 address\"},\"setKeep3rV1Proxy(address)\":{\"notice\":\"Sets the Keep3rV1Proxy address\"},\"setKp3rWethPool(address)\":{\"notice\":\"Sets the KP3R-WETH pool address\"},\"setLiquidityMinimum(uint256)\":{\"notice\":\"Sets the minimum amount of liquidity required to fund a job\"},\"setRewardPeriodTime(uint256)\":{\"notice\":\"Sets the time required to pass between rewards for jobs\"},\"setUnbondTime(uint256)\":{\"notice\":\"Sets the unbond time required unbond what has been bonded\"},\"slash(address,address,uint256)\":{\"notice\":\"Allows governance to slash a keeper based on a dispute\"},\"slashLiquidityFromJob(address,address,uint256)\":{\"notice\":\"Allows governance or a slasher to slash liquidity from a job\"},\"slashTokenFromJob(address,address,uint256)\":{\"notice\":\"Allows governance or slasher to slash a job specific token\"},\"slashers(address)\":{\"notice\":\"Maps an address to a boolean to determine whether the address is a slasher or not.\"},\"totalJobCredits(address)\":{\"notice\":\"Calculates the total credits of a given job\"},\"unbond(address,uint256)\":{\"notice\":\"Beginning of the unbonding process\"},\"unbondLiquidityFromJob(address,address,uint256)\":{\"notice\":\"Unbond liquidity for a job\"},\"unbondTime()\":{\"notice\":\"The amount of time required to pass before a keeper can unbond what he has bonded\"},\"withdraw(address)\":{\"notice\":\"Withdraw funds after unbonding has finished\"},\"withdrawLiquidityFromJob(address,address,address)\":{\"notice\":\"Withdraw liquidity from a job\"},\"withdrawTokenCreditsFromJob(address,address,uint256,address)\":{\"notice\":\"Withdraw credit from a job\"},\"workCompleted(address)\":{\"notice\":\"Tracks the total KP3R earnings of a keeper since it started working\"},\"worked(address)\":{\"notice\":\"Implemented by jobs to show that a keeper performed work\"},\"workedAt(address)\":{\"notice\":\"Last time the job was worked\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solidity/contracts/Keep3r.sol\":\"Keep3r\"},\"evmVersion\":\"london\",\"libraries\":{\":__CACHE_BREAKER__\":\"0x00000000d41867734bbee4c6863d9255b2b06ac1\"},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n    // Booleans are more expensive than uint256 or any type that takes up a full\\n    // word because each write operation emits an extra SLOAD to first read the\\n    // slot's contents, replace the bits taken up by the boolean, and then write\\n    // back. This is the compiler's defense against contract upgrades and\\n    // pointer aliasing, and it cannot be disabled.\\n\\n    // The values being non-zero value makes deployment a bit more expensive,\\n    // but in exchange the refund on every call to nonReentrant will be lower in\\n    // amount. Since refunds are capped to a percentage of the total\\n    // transaction's gas, it is best to keep them low in cases like this one, to\\n    // increase the likelihood of the full refund coming into effect.\\n    uint256 private constant _NOT_ENTERED = 1;\\n    uint256 private constant _ENTERED = 2;\\n\\n    uint256 private _status;\\n\\n    constructor() {\\n        _status = _NOT_ENTERED;\\n    }\\n\\n    /**\\n     * @dev Prevents a contract from calling itself, directly or indirectly.\\n     * Calling a `nonReentrant` function from another `nonReentrant`\\n     * function is not supported. It is possible to prevent this from happening\\n     * by making the `nonReentrant` function external, and make it call a\\n     * `private` function that does the actual work.\\n     */\\n    modifier nonReentrant() {\\n        // On the first call to nonReentrant, _notEntered will be true\\n        require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n        // Any calls to nonReentrant after this point will fail\\n        _status = _ENTERED;\\n\\n        _;\\n\\n        // By storing the original value once again, a refund is triggered (see\\n        // https://eips.ethereum.org/EIPS/eip-2200)\\n        _status = _NOT_ENTERED;\\n    }\\n}\\n\",\"keccak256\":\"0x842ccf9a6cd33e17b7acef8372ca42090755217b358fe0c44c98e951ea549d3a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n    /**\\n     * @dev Returns the amount of tokens in existence.\\n     */\\n    function totalSupply() external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the amount of tokens owned by `account`.\\n     */\\n    function balanceOf(address account) external view returns (uint256);\\n\\n    /**\\n     * @dev Moves `amount` tokens from the caller's account to `recipient`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address recipient, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Returns the remaining number of tokens that `spender` will be\\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n     * zero by default.\\n     *\\n     * This value changes when {approve} or {transferFrom} are called.\\n     */\\n    function allowance(address owner, address spender) external view returns (uint256);\\n\\n    /**\\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n     * that someone may use both the old and the new allowance by unfortunate\\n     * transaction ordering. One possible solution to mitigate this race\\n     * condition is to first reduce the spender's allowance to 0 and set the\\n     * desired value afterwards:\\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address spender, uint256 amount) external returns (bool);\\n\\n    /**\\n     * @dev Moves `amount` tokens from `sender` to `recipient` using the\\n     * allowance mechanism. `amount` is then deducted from the caller's\\n     * allowance.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address sender,\\n        address recipient,\\n        uint256 amount\\n    ) external returns (bool);\\n\\n    /**\\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n     * another (`to`).\\n     *\\n     * Note that `value` may be zero.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n    /**\\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n     * a call to {approve}. `value` is the new allowance.\\n     */\\n    event Approval(address indexed owner, address indexed spender, uint256 value);\\n}\\n\",\"keccak256\":\"0x027b891937d20ccf213fdb9c31531574256de774bda99d3a70ecef6e1913ed2a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n    /**\\n     * @dev Returns the name of the token.\\n     */\\n    function name() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the symbol of the token.\\n     */\\n    function symbol() external view returns (string memory);\\n\\n    /**\\n     * @dev Returns the decimals places of the token.\\n     */\\n    function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../../../utils/Address.sol\\\";\\n\\n/**\\n * @title SafeERC20\\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\\n * contract returns false). Tokens that return no value (and instead revert or\\n * throw on failure) are also supported, non-reverting calls are assumed to be\\n * successful.\\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\\n */\\nlibrary SafeERC20 {\\n    using Address for address;\\n\\n    function safeTransfer(\\n        IERC20 token,\\n        address to,\\n        uint256 value\\n    ) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    function safeTransferFrom(\\n        IERC20 token,\\n        address from,\\n        address to,\\n        uint256 value\\n    ) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\\n    }\\n\\n    /**\\n     * @dev Deprecated. This function has issues similar to the ones found in\\n     * {IERC20-approve}, and its usage is discouraged.\\n     *\\n     * Whenever possible, use {safeIncreaseAllowance} and\\n     * {safeDecreaseAllowance} instead.\\n     */\\n    function safeApprove(\\n        IERC20 token,\\n        address spender,\\n        uint256 value\\n    ) internal {\\n        // safeApprove should only be called when setting an initial allowance,\\n        // or when resetting it to zero. To increase and decrease it, use\\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\\n        require(\\n            (value == 0) || (token.allowance(address(this), spender) == 0),\\n            \\\"SafeERC20: approve from non-zero to non-zero allowance\\\"\\n        );\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\\n    }\\n\\n    function safeIncreaseAllowance(\\n        IERC20 token,\\n        address spender,\\n        uint256 value\\n    ) internal {\\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n    }\\n\\n    function safeDecreaseAllowance(\\n        IERC20 token,\\n        address spender,\\n        uint256 value\\n    ) internal {\\n        unchecked {\\n            uint256 oldAllowance = token.allowance(address(this), spender);\\n            require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n            uint256 newAllowance = oldAllowance - value;\\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\\n        }\\n    }\\n\\n    /**\\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\\n     * @param token The token targeted by the call.\\n     * @param data The call data (encoded using abi.encode or one of its variants).\\n     */\\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\\n        // the target address contains contract code and also asserts for success in the low-level call.\\n\\n        bytes memory returndata = address(token).functionCall(data, \\\"SafeERC20: low-level call failed\\\");\\n        if (returndata.length > 0) {\\n            // Return data is optional\\n            require(abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x02348b2e4b9f3200c7e3907c5c2661643a6d8520e9f79939fbb9b4005a54894d\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a delegate call.\\n     *\\n     * _Available since v3.4._\\n     */\\n    function functionDelegateCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x3336baae5cf23e94274d75336e2d412193be508504aee185e61dc7d58cd05c8a\",\"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\"},\"@openzeppelin/contracts/utils/structs/EnumerableSet.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Library for managing\\n * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive\\n * types.\\n *\\n * Sets have the following properties:\\n *\\n * - Elements are added, removed, and checked for existence in constant time\\n * (O(1)).\\n * - Elements are enumerated in O(n). No guarantees are made on the ordering.\\n *\\n * ```\\n * contract Example {\\n *     // Add the library methods\\n *     using EnumerableSet for EnumerableSet.AddressSet;\\n *\\n *     // Declare a set state variable\\n *     EnumerableSet.AddressSet private mySet;\\n * }\\n * ```\\n *\\n * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)\\n * and `uint256` (`UintSet`) are supported.\\n */\\nlibrary EnumerableSet {\\n    // To implement this library for multiple types with as little code\\n    // repetition as possible, we write it in terms of a generic Set type with\\n    // bytes32 values.\\n    // The Set implementation uses private functions, and user-facing\\n    // implementations (such as AddressSet) are just wrappers around the\\n    // underlying Set.\\n    // This means that we can only create new EnumerableSets for types that fit\\n    // in bytes32.\\n\\n    struct Set {\\n        // Storage of set values\\n        bytes32[] _values;\\n        // Position of the value in the `values` array, plus 1 because index 0\\n        // means a value is not in the set.\\n        mapping(bytes32 => uint256) _indexes;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function _add(Set storage set, bytes32 value) private returns (bool) {\\n        if (!_contains(set, value)) {\\n            set._values.push(value);\\n            // The value is stored at length-1, but we add 1 to all indexes\\n            // and use 0 as a sentinel value\\n            set._indexes[value] = set._values.length;\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function _remove(Set storage set, bytes32 value) private returns (bool) {\\n        // We read and store the value's index to prevent multiple reads from the same storage slot\\n        uint256 valueIndex = set._indexes[value];\\n\\n        if (valueIndex != 0) {\\n            // Equivalent to contains(set, value)\\n            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in\\n            // the array, and then remove the last element (sometimes called as 'swap and pop').\\n            // This modifies the order of the array, as noted in {at}.\\n\\n            uint256 toDeleteIndex = valueIndex - 1;\\n            uint256 lastIndex = set._values.length - 1;\\n\\n            if (lastIndex != toDeleteIndex) {\\n                bytes32 lastvalue = set._values[lastIndex];\\n\\n                // Move the last value to the index where the value to delete is\\n                set._values[toDeleteIndex] = lastvalue;\\n                // Update the index for the moved value\\n                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex\\n            }\\n\\n            // Delete the slot where the moved value was stored\\n            set._values.pop();\\n\\n            // Delete the index for the deleted slot\\n            delete set._indexes[value];\\n\\n            return true;\\n        } else {\\n            return false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function _contains(Set storage set, bytes32 value) private view returns (bool) {\\n        return set._indexes[value] != 0;\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function _length(Set storage set) private view returns (uint256) {\\n        return set._values.length;\\n    }\\n\\n    /**\\n     * @dev Returns the value stored at position `index` in the set. O(1).\\n     *\\n     * Note that there are no guarantees on the ordering of values inside the\\n     * array, and it may change when more values are added or removed.\\n     *\\n     * Requirements:\\n     *\\n     * - `index` must be strictly less than {length}.\\n     */\\n    function _at(Set storage set, uint256 index) private view returns (bytes32) {\\n        return set._values[index];\\n    }\\n\\n    /**\\n     * @dev Return the entire set in an array\\n     *\\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n     */\\n    function _values(Set storage set) private view returns (bytes32[] memory) {\\n        return set._values;\\n    }\\n\\n    // Bytes32Set\\n\\n    struct Bytes32Set {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _add(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {\\n        return _remove(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {\\n        return _contains(set._inner, value);\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(Bytes32Set storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n    /**\\n     * @dev Returns the value stored at position `index` in the set. O(1).\\n     *\\n     * Note that there are no guarantees on the ordering of values inside the\\n     * array, and it may change when more values are added or removed.\\n     *\\n     * Requirements:\\n     *\\n     * - `index` must be strictly less than {length}.\\n     */\\n    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {\\n        return _at(set._inner, index);\\n    }\\n\\n    /**\\n     * @dev Return the entire set in an array\\n     *\\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n     */\\n    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {\\n        return _values(set._inner);\\n    }\\n\\n    // AddressSet\\n\\n    struct AddressSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(AddressSet storage set, address value) internal returns (bool) {\\n        return _add(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(AddressSet storage set, address value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(AddressSet storage set, address value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(uint256(uint160(value))));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values in the set. O(1).\\n     */\\n    function length(AddressSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n    /**\\n     * @dev Returns the value stored at position `index` in the set. O(1).\\n     *\\n     * Note that there are no guarantees on the ordering of values inside the\\n     * array, and it may change when more values are added or removed.\\n     *\\n     * Requirements:\\n     *\\n     * - `index` must be strictly less than {length}.\\n     */\\n    function at(AddressSet storage set, uint256 index) internal view returns (address) {\\n        return address(uint160(uint256(_at(set._inner, index))));\\n    }\\n\\n    /**\\n     * @dev Return the entire set in an array\\n     *\\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n     */\\n    function values(AddressSet storage set) internal view returns (address[] memory) {\\n        bytes32[] memory store = _values(set._inner);\\n        address[] memory result;\\n\\n        assembly {\\n            result := store\\n        }\\n\\n        return result;\\n    }\\n\\n    // UintSet\\n\\n    struct UintSet {\\n        Set _inner;\\n    }\\n\\n    /**\\n     * @dev Add a value to a set. O(1).\\n     *\\n     * Returns true if the value was added to the set, that is if it was not\\n     * already present.\\n     */\\n    function add(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _add(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Removes a value from a set. O(1).\\n     *\\n     * Returns true if the value was removed from the set, that is if it was\\n     * present.\\n     */\\n    function remove(UintSet storage set, uint256 value) internal returns (bool) {\\n        return _remove(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns true if the value is in the set. O(1).\\n     */\\n    function contains(UintSet storage set, uint256 value) internal view returns (bool) {\\n        return _contains(set._inner, bytes32(value));\\n    }\\n\\n    /**\\n     * @dev Returns the number of values on the set. O(1).\\n     */\\n    function length(UintSet storage set) internal view returns (uint256) {\\n        return _length(set._inner);\\n    }\\n\\n    /**\\n     * @dev Returns the value stored at position `index` in the set. O(1).\\n     *\\n     * Note that there are no guarantees on the ordering of values inside the\\n     * array, and it may change when more values are added or removed.\\n     *\\n     * Requirements:\\n     *\\n     * - `index` must be strictly less than {length}.\\n     */\\n    function at(UintSet storage set, uint256 index) internal view returns (uint256) {\\n        return uint256(_at(set._inner, index));\\n    }\\n\\n    /**\\n     * @dev Return the entire set in an array\\n     *\\n     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed\\n     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that\\n     * this function has an unbounded cost, and using it as part of a state-changing function may render the function\\n     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.\\n     */\\n    function values(UintSet storage set) internal view returns (uint256[] memory) {\\n        bytes32[] memory store = _values(set._inner);\\n        uint256[] memory result;\\n\\n        assembly {\\n            result := store\\n        }\\n\\n        return result;\\n    }\\n}\\n\",\"keccak256\":\"0x3778dc944f4a696335878bad8beca60f38b7c79b7a0bd8ddbeb618bd502a95ae\",\"license\":\"MIT\"},\"solidity/contracts/Keep3r.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.4 <0.9.0;\\n\\nimport './peripherals/jobs/Keep3rJobs.sol';\\nimport './peripherals/keepers/Keep3rKeepers.sol';\\nimport './peripherals/Keep3rAccountance.sol';\\nimport './peripherals/Keep3rRoles.sol';\\nimport './peripherals/Keep3rParameters.sol';\\nimport './peripherals/DustCollector.sol';\\n\\ncontract Keep3r is DustCollector, Keep3rJobs, Keep3rKeepers {\\n  constructor(\\n    address _governance,\\n    address _keep3rHelper,\\n    address _keep3rV1,\\n    address _keep3rV1Proxy,\\n    address _kp3rWethPool\\n  ) Keep3rParameters(_keep3rHelper, _keep3rV1, _keep3rV1Proxy, _kp3rWethPool) Keep3rRoles(_governance) DustCollector() {}\\n}\\n\",\"keccak256\":\"0xd2a7417d7decff283aef255a21712d76b0f24dc1975f9953b62cd4453c8017ae\",\"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/peripherals/DustCollector.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\\nimport '../../contracts/peripherals/Governable.sol';\\nimport '../../interfaces/peripherals/IDustCollector.sol';\\n\\nabstract contract DustCollector is IDustCollector, Governable {\\n  using SafeERC20 for IERC20;\\n\\n  address public constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\\n\\n  function sendDust(\\n    address _token,\\n    uint256 _amount,\\n    address _to\\n  ) external override onlyGovernance {\\n    if (_to == address(0)) revert ZeroAddress();\\n    if (_token == ETH_ADDRESS) {\\n      payable(_to).transfer(_amount);\\n    } else {\\n      IERC20(_token).safeTransfer(_to, _amount);\\n    }\\n    emit DustSent(_token, _amount, _to);\\n  }\\n}\\n\",\"keccak256\":\"0x1e936ce945289b7123e76bc0318c2591b9c5305db37bce508b3ccec1d26e8243\",\"license\":\"MIT\"},\"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/contracts/peripherals/Keep3rAccountance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '@openzeppelin/contracts/utils/structs/EnumerableSet.sol';\\nimport '../../interfaces/peripherals/IKeep3rAccountance.sol';\\n\\nabstract contract Keep3rAccountance is IKeep3rAccountance {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n\\n  /// @notice List of all enabled keepers\\n  EnumerableSet.AddressSet internal _keepers;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => uint256) public override workCompleted;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => uint256) public override firstSeen;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => bool) public override disputes;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  /// @notice Mapping (job => bonding => amount)\\n  mapping(address => mapping(address => uint256)) public override bonds;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => mapping(address => uint256)) public override jobTokenCredits;\\n\\n  /// @notice The current liquidity credits available for a job\\n  mapping(address => uint256) internal _jobLiquidityCredits;\\n\\n  /// @notice Map the address of a job to its correspondent periodCredits\\n  mapping(address => uint256) internal _jobPeriodCredits;\\n\\n  /// @notice Enumerable array of Job Tokens for Credits\\n  mapping(address => EnumerableSet.AddressSet) internal _jobTokens;\\n\\n  /// @notice List of liquidities that a job has (job => liquidities)\\n  mapping(address => EnumerableSet.AddressSet) internal _jobLiquidities;\\n\\n  /// @notice Liquidity pool to observe\\n  mapping(address => address) internal _liquidityPool;\\n\\n  /// @notice Tracks if a pool has KP3R as token0\\n  mapping(address => bool) internal _isKP3RToken0;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => mapping(address => uint256)) public override pendingBonds;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => mapping(address => uint256)) public override canActivateAfter;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => mapping(address => uint256)) public override canWithdrawAfter;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => mapping(address => uint256)) public override pendingUnbonds;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  mapping(address => bool) public override hasBonded;\\n\\n  /// @notice List of all enabled jobs\\n  EnumerableSet.AddressSet internal _jobs;\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  function jobs() external view override returns (address[] memory _list) {\\n    _list = _jobs.values();\\n  }\\n\\n  /// @inheritdoc IKeep3rAccountance\\n  function keepers() external view override returns (address[] memory _list) {\\n    _list = _keepers.values();\\n  }\\n}\\n\",\"keccak256\":\"0x34413d1868370b551522d7bea6b940707ac67234f312155f96fb7ee027f29baa\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/Keep3rDisputable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rParameters.sol';\\nimport './Keep3rRoles.sol';\\nimport '../../interfaces/peripherals/IKeep3rDisputable.sol';\\n\\nabstract contract Keep3rDisputable is IKeep3rDisputable, Keep3rAccountance, Keep3rRoles {\\n  /// @inheritdoc IKeep3rDisputable\\n  function dispute(address _jobOrKeeper) external override onlyDisputer {\\n    if (disputes[_jobOrKeeper]) revert AlreadyDisputed();\\n    disputes[_jobOrKeeper] = true;\\n    emit Dispute(_jobOrKeeper, msg.sender);\\n  }\\n\\n  /// @inheritdoc IKeep3rDisputable\\n  function resolve(address _jobOrKeeper) external override onlyDisputer {\\n    if (!disputes[_jobOrKeeper]) revert NotDisputed();\\n    disputes[_jobOrKeeper] = false;\\n    emit Resolve(_jobOrKeeper, msg.sender);\\n  }\\n}\\n\",\"keccak256\":\"0x941e9ba02b2ad3975edc444cd771ef1e5386051553632140f882258ea7e4d4bc\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/Keep3rParameters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../../interfaces/IKeep3rHelper.sol';\\nimport '../../interfaces/peripherals/IKeep3rParameters.sol';\\nimport './Keep3rAccountance.sol';\\nimport './Keep3rRoles.sol';\\n\\nabstract contract Keep3rParameters is IKeep3rParameters, Keep3rAccountance, Keep3rRoles {\\n  /// @inheritdoc IKeep3rParameters\\n  address public override keep3rV1;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  address public override keep3rV1Proxy;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  address public override keep3rHelper;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  address public override kp3rWethPool;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public override bondTime = 3 days;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public override unbondTime = 14 days;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public override liquidityMinimum = 3 ether;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public override rewardPeriodTime = 5 days;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public override inflationPeriod = 34 days;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public override fee = 30;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public constant override BASE = 10000;\\n\\n  /// @inheritdoc IKeep3rParameters\\n  uint256 public constant override MIN_REWARD_PERIOD_TIME = 1 days;\\n\\n  constructor(\\n    address _keep3rHelper,\\n    address _keep3rV1,\\n    address _keep3rV1Proxy,\\n    address _kp3rWethPool\\n  ) {\\n    keep3rHelper = _keep3rHelper;\\n    keep3rV1 = _keep3rV1;\\n    keep3rV1Proxy = _keep3rV1Proxy;\\n    kp3rWethPool = _kp3rWethPool;\\n    _liquidityPool[kp3rWethPool] = kp3rWethPool;\\n    _isKP3RToken0[_kp3rWethPool] = IKeep3rHelper(keep3rHelper).isKP3RToken0(kp3rWethPool);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setKeep3rHelper(address _keep3rHelper) external override onlyGovernance {\\n    if (_keep3rHelper == address(0)) revert ZeroAddress();\\n    keep3rHelper = _keep3rHelper;\\n    emit Keep3rHelperChange(_keep3rHelper);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setKeep3rV1(address _keep3rV1) external override onlyGovernance {\\n    if (_keep3rV1 == address(0)) revert ZeroAddress();\\n    keep3rV1 = _keep3rV1;\\n    emit Keep3rV1Change(_keep3rV1);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setKeep3rV1Proxy(address _keep3rV1Proxy) external override onlyGovernance {\\n    if (_keep3rV1Proxy == address(0)) revert ZeroAddress();\\n    keep3rV1Proxy = _keep3rV1Proxy;\\n    emit Keep3rV1ProxyChange(_keep3rV1Proxy);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setKp3rWethPool(address _kp3rWethPool) external override onlyGovernance {\\n    if (_kp3rWethPool == address(0)) revert ZeroAddress();\\n    kp3rWethPool = _kp3rWethPool;\\n    _liquidityPool[kp3rWethPool] = kp3rWethPool;\\n    _isKP3RToken0[_kp3rWethPool] = IKeep3rHelper(keep3rHelper).isKP3RToken0(_kp3rWethPool);\\n    emit Kp3rWethPoolChange(_kp3rWethPool);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setBondTime(uint256 _bondTime) external override onlyGovernance {\\n    bondTime = _bondTime;\\n    emit BondTimeChange(_bondTime);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setUnbondTime(uint256 _unbondTime) external override onlyGovernance {\\n    unbondTime = _unbondTime;\\n    emit UnbondTimeChange(_unbondTime);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setLiquidityMinimum(uint256 _liquidityMinimum) external override onlyGovernance {\\n    liquidityMinimum = _liquidityMinimum;\\n    emit LiquidityMinimumChange(_liquidityMinimum);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setRewardPeriodTime(uint256 _rewardPeriodTime) external override onlyGovernance {\\n    if (_rewardPeriodTime < MIN_REWARD_PERIOD_TIME) revert MinRewardPeriod();\\n    rewardPeriodTime = _rewardPeriodTime;\\n    emit RewardPeriodTimeChange(_rewardPeriodTime);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setInflationPeriod(uint256 _inflationPeriod) external override onlyGovernance {\\n    inflationPeriod = _inflationPeriod;\\n    emit InflationPeriodChange(_inflationPeriod);\\n  }\\n\\n  /// @inheritdoc IKeep3rParameters\\n  function setFee(uint256 _fee) external override onlyGovernance {\\n    fee = _fee;\\n    emit FeeChange(_fee);\\n  }\\n}\\n\",\"keccak256\":\"0x95d9d4f2eed9abc51ec2a7cd9ab2c9f4c61360ae7854dbff2e3de9d34c5e419c\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/Keep3rRoles.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../../interfaces/peripherals/IKeep3rRoles.sol';\\nimport '@openzeppelin/contracts/utils/structs/EnumerableSet.sol';\\nimport './Governable.sol';\\n\\ncontract Keep3rRoles is IKeep3rRoles, Governable {\\n  /// @inheritdoc IKeep3rRoles\\n  mapping(address => bool) public override slashers;\\n\\n  /// @inheritdoc IKeep3rRoles\\n  mapping(address => bool) public override disputers;\\n\\n  constructor(address _governance) Governable(_governance) {}\\n\\n  /// @inheritdoc IKeep3rRoles\\n  function addSlasher(address _slasher) external override onlyGovernance {\\n    if (slashers[_slasher]) revert SlasherExistent();\\n    slashers[_slasher] = true;\\n    emit SlasherAdded(_slasher);\\n  }\\n\\n  /// @inheritdoc IKeep3rRoles\\n  function removeSlasher(address _slasher) external override onlyGovernance {\\n    if (!slashers[_slasher]) revert SlasherUnexistent();\\n    delete slashers[_slasher];\\n    emit SlasherRemoved(_slasher);\\n  }\\n\\n  /// @inheritdoc IKeep3rRoles\\n  function addDisputer(address _disputer) external override onlyGovernance {\\n    if (disputers[_disputer]) revert DisputerExistent();\\n    disputers[_disputer] = true;\\n    emit DisputerAdded(_disputer);\\n  }\\n\\n  /// @inheritdoc IKeep3rRoles\\n  function removeDisputer(address _disputer) external override onlyGovernance {\\n    if (!disputers[_disputer]) revert DisputerUnexistent();\\n    delete disputers[_disputer];\\n    emit DisputerRemoved(_disputer);\\n  }\\n\\n  /// @notice Functions with this modifier can only be called by either a slasher or governance\\n  modifier onlySlasher {\\n    if (!slashers[msg.sender]) revert OnlySlasher();\\n    _;\\n  }\\n\\n  /// @notice Functions with this modifier can only be called by either a disputer or governance\\n  modifier onlyDisputer {\\n    if (!disputers[msg.sender]) revert OnlyDisputer();\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0x8c3558fb55fbf7f6512dcd648b835f84802a50d7b12ad60ac3906521056a4461\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobDisputable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rJobFundableCredits.sol';\\nimport './Keep3rJobFundableLiquidity.sol';\\nimport '../Keep3rDisputable.sol';\\n\\nabstract contract Keep3rJobDisputable is IKeep3rJobDisputable, Keep3rDisputable, Keep3rJobFundableCredits, Keep3rJobFundableLiquidity {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n  using SafeERC20 for IERC20;\\n\\n  /// @inheritdoc IKeep3rJobDisputable\\n  function slashTokenFromJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount\\n  ) external override onlySlasher {\\n    if (!disputes[_job]) revert NotDisputed();\\n    if (!_jobTokens[_job].contains(_token)) revert JobTokenUnexistent();\\n    if (jobTokenCredits[_job][_token] < _amount) revert JobTokenInsufficient();\\n\\n    try IERC20(_token).transfer(governance, _amount) {} catch {}\\n    jobTokenCredits[_job][_token] -= _amount;\\n    if (jobTokenCredits[_job][_token] == 0) {\\n      _jobTokens[_job].remove(_token);\\n    }\\n\\n    // emit event\\n    emit JobSlashToken(_job, _token, msg.sender, _amount);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobDisputable\\n  function slashLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external override onlySlasher {\\n    if (!disputes[_job]) revert NotDisputed();\\n\\n    _unbondLiquidityFromJob(_job, _liquidity, _amount);\\n    try IERC20(_liquidity).transfer(governance, _amount) {} catch {}\\n    emit JobSlashLiquidity(_job, _liquidity, msg.sender, _amount);\\n  }\\n}\\n\",\"keccak256\":\"0xa2b6ba5832b3c7f4f45e22c5818143259711018daccce008b24770c89e358bfd\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobFundableCredits.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rJobOwnership.sol';\\nimport '../Keep3rAccountance.sol';\\nimport '../Keep3rParameters.sol';\\nimport '../../../interfaces/peripherals/IKeep3rJobs.sol';\\n\\nimport '@openzeppelin/contracts/security/ReentrancyGuard.sol';\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\\nimport '@openzeppelin/contracts/utils/math/Math.sol';\\n\\nabstract contract Keep3rJobFundableCredits is IKeep3rJobFundableCredits, ReentrancyGuard, Keep3rJobOwnership, Keep3rParameters {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n  using SafeERC20 for IERC20;\\n\\n  /// @notice Cooldown between withdrawals\\n  uint256 internal constant _WITHDRAW_TOKENS_COOLDOWN = 1 minutes;\\n\\n  /// @inheritdoc IKeep3rJobFundableCredits\\n  mapping(address => mapping(address => uint256)) public override jobTokenCreditsAddedAt;\\n\\n  /// @inheritdoc IKeep3rJobFundableCredits\\n  function addTokenCreditsToJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount\\n  ) external override nonReentrant {\\n    if (!_jobs.contains(_job)) revert JobUnavailable();\\n    // KP3R shouldn't be used for direct token payments\\n    if (_token == keep3rV1) revert TokenUnallowed();\\n    uint256 _before = IERC20(_token).balanceOf(address(this));\\n    IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount);\\n    uint256 _received = IERC20(_token).balanceOf(address(this)) - _before;\\n    uint256 _tokenFee = (_received * fee) / BASE;\\n    jobTokenCredits[_job][_token] += _received - _tokenFee;\\n    jobTokenCreditsAddedAt[_job][_token] = block.timestamp;\\n    IERC20(_token).safeTransfer(governance, _tokenFee);\\n    _jobTokens[_job].add(_token);\\n\\n    emit TokenCreditAddition(_job, _token, msg.sender, _received);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableCredits\\n  function withdrawTokenCreditsFromJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount,\\n    address _receiver\\n  ) external override nonReentrant onlyJobOwner(_job) {\\n    if (block.timestamp <= jobTokenCreditsAddedAt[_job][_token] + _WITHDRAW_TOKENS_COOLDOWN) revert JobTokenCreditsLocked();\\n    if (jobTokenCredits[_job][_token] < _amount) revert InsufficientJobTokenCredits();\\n    if (disputes[_job]) revert JobDisputed();\\n\\n    jobTokenCredits[_job][_token] -= _amount;\\n    IERC20(_token).safeTransfer(_receiver, _amount);\\n\\n    if (jobTokenCredits[_job][_token] == 0) {\\n      _jobTokens[_job].remove(_token);\\n    }\\n\\n    emit TokenCreditWithdrawal(_job, _token, _receiver, _amount);\\n  }\\n}\\n\",\"keccak256\":\"0xdb2b0d3e46ee54fa99c184f67b7447961ee8e2ba41015829ba09c74bb2b42f9e\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobFundableLiquidity.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rJobOwnership.sol';\\nimport '../Keep3rAccountance.sol';\\nimport '../Keep3rParameters.sol';\\nimport '../../../interfaces/IPairManager.sol';\\nimport '../../../interfaces/peripherals/IKeep3rJobs.sol';\\n\\nimport '../../libraries/FullMath.sol';\\n\\nimport '@openzeppelin/contracts/security/ReentrancyGuard.sol';\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\\nimport '@openzeppelin/contracts/utils/math/Math.sol';\\n\\nabstract contract Keep3rJobFundableLiquidity is IKeep3rJobFundableLiquidity, ReentrancyGuard, Keep3rJobOwnership, Keep3rParameters {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n  using SafeERC20 for IERC20;\\n\\n  /// @notice List of liquidities that are accepted in the system\\n  EnumerableSet.AddressSet internal _approvedLiquidities;\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  mapping(address => mapping(address => uint256)) public override liquidityAmount;\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  mapping(address => uint256) public override rewardedAt;\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  mapping(address => uint256) public override workedAt;\\n\\n  /// @notice Tracks an address and returns its TickCache\\n  mapping(address => TickCache) internal _tick;\\n\\n  // Views\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function approvedLiquidities() external view override returns (address[] memory _list) {\\n    _list = _approvedLiquidities.values();\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function jobPeriodCredits(address _job) public view override returns (uint256 _periodCredits) {\\n    for (uint256 i; i < _jobLiquidities[_job].length(); i++) {\\n      address _liquidity = _jobLiquidities[_job].at(i);\\n      if (_approvedLiquidities.contains(_liquidity)) {\\n        TickCache memory _tickCache = observeLiquidity(_liquidity);\\n        if (_tickCache.period != 0) {\\n          int56 _tickDifference = _isKP3RToken0[_liquidity] ? _tickCache.difference : -_tickCache.difference;\\n          _periodCredits += _getReward(\\n            IKeep3rHelper(keep3rHelper).getKP3RsAtTick(liquidityAmount[_job][_liquidity], _tickDifference, rewardPeriodTime)\\n          );\\n        }\\n      }\\n    }\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function jobLiquidityCredits(address _job) public view override returns (uint256 _liquidityCredits) {\\n    uint256 _periodCredits = jobPeriodCredits(_job);\\n\\n    // A job can have liquidityCredits without periodCredits (forced by Governance)\\n    if (rewardedAt[_job] > _period(block.timestamp - rewardPeriodTime)) {\\n      // Will calculate job credits only if it was rewarded later than last period\\n      if ((block.timestamp - rewardedAt[_job]) >= rewardPeriodTime) {\\n        // Will return a full period if job was rewarded more than a period ago\\n        _liquidityCredits = _periodCredits;\\n      } else {\\n        // Will update minted job credits (not forced) to new twaps if credits are outdated\\n        _liquidityCredits = _periodCredits > 0\\n          ? (_jobLiquidityCredits[_job] * _periodCredits) / _jobPeriodCredits[_job]\\n          : _jobLiquidityCredits[_job];\\n      }\\n    } else {\\n      // Will return a full period if job credits are expired\\n      _liquidityCredits = _periodCredits;\\n    }\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function totalJobCredits(address _job) external view override returns (uint256 _credits) {\\n    uint256 _periodCredits = jobPeriodCredits(_job);\\n    uint256 _cooldown;\\n\\n    if ((rewardedAt[_job] > _period(block.timestamp - rewardPeriodTime))) {\\n      // Will calculate cooldown if it outdated\\n      if ((block.timestamp - rewardedAt[_job]) >= rewardPeriodTime) {\\n        // Will calculate cooldown from last reward reference in this period\\n        _cooldown = block.timestamp - (rewardedAt[_job] + rewardPeriodTime);\\n      } else {\\n        // Will calculate cooldown from last reward timestamp\\n        _cooldown = block.timestamp - rewardedAt[_job];\\n      }\\n    } else {\\n      // Will calculate cooldown from period start if expired\\n      _cooldown = block.timestamp - _period(block.timestamp);\\n    }\\n    _credits = jobLiquidityCredits(_job) + _phase(_cooldown, _periodCredits);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function quoteLiquidity(address _liquidity, uint256 _amount) external view override returns (uint256 _periodCredits) {\\n    if (_approvedLiquidities.contains(_liquidity)) {\\n      TickCache memory _tickCache = observeLiquidity(_liquidity);\\n      if (_tickCache.period != 0) {\\n        int56 _tickDifference = _isKP3RToken0[_liquidity] ? _tickCache.difference : -_tickCache.difference;\\n        return _getReward(IKeep3rHelper(keep3rHelper).getKP3RsAtTick(_amount, _tickDifference, rewardPeriodTime));\\n      }\\n    }\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function observeLiquidity(address _liquidity) public view override returns (TickCache memory _tickCache) {\\n    if (_tick[_liquidity].period == _period(block.timestamp)) {\\n      // Will return cached twaps if liquidity is updated\\n      _tickCache = _tick[_liquidity];\\n    } else {\\n      bool success;\\n      uint256 lastPeriod = _period(block.timestamp - rewardPeriodTime);\\n\\n      if (_tick[_liquidity].period == lastPeriod) {\\n        // Will only ask for current period accumulator if liquidity is outdated\\n        uint32[] memory _secondsAgo = new uint32[](1);\\n        int56 previousTick = _tick[_liquidity].current;\\n\\n        _secondsAgo[0] = uint32(block.timestamp - _period(block.timestamp));\\n\\n        (_tickCache.current, , success) = IKeep3rHelper(keep3rHelper).observe(_liquidityPool[_liquidity], _secondsAgo);\\n\\n        _tickCache.difference = _tickCache.current - previousTick;\\n      } else if (_tick[_liquidity].period < lastPeriod) {\\n        // Will ask for 2 accumulators if liquidity is expired\\n        uint32[] memory _secondsAgo = new uint32[](2);\\n\\n        _secondsAgo[0] = uint32(block.timestamp - _period(block.timestamp));\\n        _secondsAgo[1] = uint32(block.timestamp - _period(block.timestamp) + rewardPeriodTime);\\n\\n        int56 _tickCumulative2;\\n        (_tickCache.current, _tickCumulative2, success) = IKeep3rHelper(keep3rHelper).observe(_liquidityPool[_liquidity], _secondsAgo);\\n\\n        _tickCache.difference = _tickCache.current - _tickCumulative2;\\n      }\\n      if (success) {\\n        _tickCache.period = _period(block.timestamp);\\n      } else {\\n        _tickCache.period = 0;\\n      }\\n    }\\n  }\\n\\n  // Methods\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function forceLiquidityCreditsToJob(address _job, uint256 _amount) external override onlyGovernance {\\n    if (!_jobs.contains(_job)) revert JobUnavailable();\\n    _settleJobAccountance(_job);\\n    _jobLiquidityCredits[_job] += _amount;\\n    emit LiquidityCreditsForced(_job, rewardedAt[_job], _jobLiquidityCredits[_job]);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function approveLiquidity(address _liquidity) external override onlyGovernance {\\n    if (!_approvedLiquidities.add(_liquidity)) revert LiquidityPairApproved();\\n    _liquidityPool[_liquidity] = IPairManager(_liquidity).pool();\\n    _isKP3RToken0[_liquidity] = IKeep3rHelper(keep3rHelper).isKP3RToken0(_liquidityPool[_liquidity]);\\n    _tick[_liquidity] = observeLiquidity(_liquidity);\\n    emit LiquidityApproval(_liquidity);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function revokeLiquidity(address _liquidity) external override onlyGovernance {\\n    if (!_approvedLiquidities.remove(_liquidity)) revert LiquidityPairUnexistent();\\n    emit LiquidityRevocation(_liquidity);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function addLiquidityToJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external override nonReentrant {\\n    if (!_approvedLiquidities.contains(_liquidity)) revert LiquidityPairUnapproved();\\n    if (!_jobs.contains(_job)) revert JobUnavailable();\\n\\n    _jobLiquidities[_job].add(_liquidity);\\n\\n    _settleJobAccountance(_job);\\n\\n    if (_quoteLiquidity(liquidityAmount[_job][_liquidity] + _amount, _liquidity) < liquidityMinimum) revert JobLiquidityLessThanMin();\\n\\n    emit LiquidityCreditsReward(_job, rewardedAt[_job], _jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n\\n    IERC20(_liquidity).safeTransferFrom(msg.sender, address(this), _amount);\\n    liquidityAmount[_job][_liquidity] += _amount;\\n    _jobPeriodCredits[_job] += _getReward(_quoteLiquidity(_amount, _liquidity));\\n    emit LiquidityAddition(_job, _liquidity, msg.sender, _amount);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function unbondLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external override onlyJobOwner(_job) {\\n    canWithdrawAfter[_job][_liquidity] = block.timestamp + unbondTime;\\n    pendingUnbonds[_job][_liquidity] += _amount;\\n    _unbondLiquidityFromJob(_job, _liquidity, _amount);\\n\\n    uint256 _remainingLiquidity = liquidityAmount[_job][_liquidity];\\n    if (_remainingLiquidity > 0 && _quoteLiquidity(_remainingLiquidity, _liquidity) < liquidityMinimum) revert JobLiquidityLessThanMin();\\n\\n    emit Unbonding(_job, _liquidity, _amount);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobFundableLiquidity\\n  function withdrawLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    address _receiver\\n  ) external override onlyJobOwner(_job) {\\n    if (_receiver == address(0)) revert ZeroAddress();\\n    if (canWithdrawAfter[_job][_liquidity] == 0) revert UnbondsUnexistent();\\n    if (canWithdrawAfter[_job][_liquidity] >= block.timestamp) revert UnbondsLocked();\\n    if (disputes[_job]) revert Disputed();\\n\\n    uint256 _amount = pendingUnbonds[_job][_liquidity];\\n    IERC20(_liquidity).safeTransfer(_receiver, _amount);\\n    emit LiquidityWithdrawal(_job, _liquidity, _receiver, _amount);\\n\\n    pendingUnbonds[_job][_liquidity] = 0;\\n  }\\n\\n  // Internal functions\\n\\n  /// @notice Updates or rewards job liquidity credits depending on time since last job reward\\n  function _updateJobCreditsIfNeeded(address _job) internal returns (bool _rewarded) {\\n    if (rewardedAt[_job] < _period(block.timestamp)) {\\n      // Will exit function if job has been rewarded in current period\\n      if (rewardedAt[_job] <= _period(block.timestamp - rewardPeriodTime)) {\\n        // Will reset job to period syncronicity if a full period passed without rewards\\n        _updateJobPeriod(_job);\\n        _jobLiquidityCredits[_job] = _jobPeriodCredits[_job];\\n        rewardedAt[_job] = _period(block.timestamp);\\n        _rewarded = true;\\n      } else if ((block.timestamp - rewardedAt[_job]) >= rewardPeriodTime) {\\n        // Will reset job's syncronicity if last reward was more than epoch ago\\n        _updateJobPeriod(_job);\\n        _jobLiquidityCredits[_job] = _jobPeriodCredits[_job];\\n        rewardedAt[_job] += rewardPeriodTime;\\n        _rewarded = true;\\n      } else if (workedAt[_job] < _period(block.timestamp)) {\\n        // First keeper on period has to update job accountance to current twaps\\n        uint256 previousPeriodCredits = _jobPeriodCredits[_job];\\n        _updateJobPeriod(_job);\\n        _jobLiquidityCredits[_job] = (_jobLiquidityCredits[_job] * _jobPeriodCredits[_job]) / previousPeriodCredits;\\n        // Updating job accountance does not reward job\\n      }\\n    }\\n  }\\n\\n  /// @notice Only called if _jobLiquidityCredits < payment\\n  function _rewardJobCredits(address _job) internal {\\n    /// @notice Only way to += jobLiquidityCredits is when keeper rewarding (cannot pay work)\\n    /* WARNING: this allows to top up _jobLiquidityCredits to a max of 1.99 but have to spend at least 1 */\\n    _jobLiquidityCredits[_job] += _phase(block.timestamp - rewardedAt[_job], _jobPeriodCredits[_job]);\\n    rewardedAt[_job] = block.timestamp;\\n  }\\n\\n  /// @notice Updates accountance for _jobPeriodCredits\\n  function _updateJobPeriod(address _job) internal {\\n    _jobPeriodCredits[_job] = _calculateJobPeriodCredits(_job);\\n  }\\n\\n  /// @notice Quotes the outdated job liquidities and calculates _periodCredits\\n  /// @dev This function is also responsible for keeping the KP3R/WETH quote updated\\n  function _calculateJobPeriodCredits(address _job) internal returns (uint256 _periodCredits) {\\n    if (_tick[kp3rWethPool].period != _period(block.timestamp)) {\\n      // Updates KP3R/WETH quote if needed\\n      _tick[kp3rWethPool] = observeLiquidity(kp3rWethPool);\\n    }\\n\\n    for (uint256 i; i < _jobLiquidities[_job].length(); i++) {\\n      address _liquidity = _jobLiquidities[_job].at(i);\\n      if (_approvedLiquidities.contains(_liquidity)) {\\n        if (_tick[_liquidity].period != _period(block.timestamp)) {\\n          // Updates liquidity cache only if needed\\n          _tick[_liquidity] = observeLiquidity(_liquidity);\\n        }\\n        _periodCredits += _getReward(_quoteLiquidity(liquidityAmount[_job][_liquidity], _liquidity));\\n      }\\n    }\\n  }\\n\\n  /// @notice Updates job accountance calculating the impact of the unbonded liquidity amount\\n  function _unbondLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) internal nonReentrant {\\n    if (!_jobLiquidities[_job].contains(_liquidity)) revert JobLiquidityUnexistent();\\n    if (liquidityAmount[_job][_liquidity] < _amount) revert JobLiquidityInsufficient();\\n\\n    // Ensures current twaps in job liquidities\\n    _updateJobPeriod(_job);\\n    uint256 _periodCreditsToRemove = _getReward(_quoteLiquidity(_amount, _liquidity));\\n\\n    // A liquidity can be revoked causing a job to have 0 periodCredits\\n    if (_jobPeriodCredits[_job] > 0) {\\n      // Removes a % correspondant to a full rewardPeriodTime for the liquidity withdrawn vs all of the liquidities\\n      _jobLiquidityCredits[_job] -= (_jobLiquidityCredits[_job] * _periodCreditsToRemove) / _jobPeriodCredits[_job];\\n      _jobPeriodCredits[_job] -= _periodCreditsToRemove;\\n    }\\n\\n    liquidityAmount[_job][_liquidity] -= _amount;\\n    if (liquidityAmount[_job][_liquidity] == 0) {\\n      _jobLiquidities[_job].remove(_liquidity);\\n    }\\n  }\\n\\n  /// @notice Returns a fraction of the multiplier or the whole multiplier if equal or more than a rewardPeriodTime has passed\\n  function _phase(uint256 _timePassed, uint256 _multiplier) internal view returns (uint256 _result) {\\n    if (_timePassed < rewardPeriodTime) {\\n      _result = (_timePassed * _multiplier) / rewardPeriodTime;\\n    } else _result = _multiplier;\\n  }\\n\\n  /// @notice Returns the start of the period of the provided timestamp\\n  function _period(uint256 _timestamp) internal view returns (uint256 _periodTimestamp) {\\n    return _timestamp - (_timestamp % rewardPeriodTime);\\n  }\\n\\n  /// @notice Calculates relation between rewardPeriod and inflationPeriod\\n  function _getReward(uint256 _baseAmount) internal view returns (uint256 _credits) {\\n    return FullMath.mulDiv(_baseAmount, rewardPeriodTime, inflationPeriod);\\n  }\\n\\n  /// @notice Returns underlying KP3R amount for a given liquidity amount\\n  function _quoteLiquidity(uint256 _amount, address _liquidity) internal view returns (uint256 _quote) {\\n    if (_tick[_liquidity].period != 0) {\\n      int56 _tickDifference = _isKP3RToken0[_liquidity] ? _tick[_liquidity].difference : -_tick[_liquidity].difference;\\n      _quote = IKeep3rHelper(keep3rHelper).getKP3RsAtTick(_amount, _tickDifference, rewardPeriodTime);\\n    }\\n  }\\n\\n  /// @notice Updates job credits to current quotes and rewards job's pending minted credits\\n  /// @dev Ensures a maximum of 1 period of credits\\n  function _settleJobAccountance(address _job) internal virtual {\\n    _updateJobCreditsIfNeeded(_job);\\n    _rewardJobCredits(_job);\\n    _jobLiquidityCredits[_job] = Math.min(_jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n  }\\n}\\n\",\"keccak256\":\"0xca766bb86101abe62a61b54589a27ea9398b45139cb9c0ae9e04be12d100ee87\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rJobOwnership.sol';\\nimport '../Keep3rRoles.sol';\\nimport '../Keep3rParameters.sol';\\nimport '../../../interfaces/peripherals/IKeep3rJobs.sol';\\n\\nabstract contract Keep3rJobManager is IKeep3rJobManager, Keep3rJobOwnership, Keep3rRoles, Keep3rParameters {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n\\n  /// @inheritdoc IKeep3rJobManager\\n  function addJob(address _job) external override {\\n    if (_jobs.contains(_job)) revert JobAlreadyAdded();\\n    if (hasBonded[_job]) revert AlreadyAKeeper();\\n    _jobs.add(_job);\\n    jobOwner[_job] = msg.sender;\\n    emit JobAddition(msg.sender, _job);\\n  }\\n}\\n\",\"keccak256\":\"0xa1fa3fde2b28e28476f0af438049043e695372ee24e1e780b67f00d14d5f660e\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobMigration.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../../../interfaces/peripherals/IKeep3rJobs.sol';\\nimport './Keep3rJobFundableCredits.sol';\\nimport './Keep3rJobFundableLiquidity.sol';\\n\\nabstract contract Keep3rJobMigration is IKeep3rJobMigration, Keep3rJobFundableCredits, Keep3rJobFundableLiquidity {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n\\n  uint256 internal constant _MIGRATION_COOLDOWN = 1 minutes;\\n\\n  /// @inheritdoc IKeep3rJobMigration\\n  mapping(address => address) public override pendingJobMigrations;\\n  mapping(address => mapping(address => uint256)) internal _migrationCreatedAt;\\n\\n  /// @inheritdoc IKeep3rJobMigration\\n  function migrateJob(address _fromJob, address _toJob) external override onlyJobOwner(_fromJob) {\\n    if (_fromJob == _toJob) revert JobMigrationImpossible();\\n\\n    pendingJobMigrations[_fromJob] = _toJob;\\n    _migrationCreatedAt[_fromJob][_toJob] = block.timestamp;\\n\\n    emit JobMigrationRequested(_fromJob, _toJob);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobMigration\\n  function acceptJobMigration(address _fromJob, address _toJob) external override onlyJobOwner(_toJob) {\\n    if (disputes[_fromJob] || disputes[_toJob]) revert JobDisputed();\\n    if (pendingJobMigrations[_fromJob] != _toJob) revert JobMigrationUnavailable();\\n    if (block.timestamp < _migrationCreatedAt[_fromJob][_toJob] + _MIGRATION_COOLDOWN) revert JobMigrationLocked();\\n\\n    // force job credits update for both jobs\\n    _settleJobAccountance(_fromJob);\\n    _settleJobAccountance(_toJob);\\n\\n    // migrate tokens\\n    while (_jobTokens[_fromJob].length() > 0) {\\n      address _tokenToMigrate = _jobTokens[_fromJob].at(0);\\n      jobTokenCredits[_toJob][_tokenToMigrate] += jobTokenCredits[_fromJob][_tokenToMigrate];\\n      jobTokenCredits[_fromJob][_tokenToMigrate] = 0;\\n      _jobTokens[_fromJob].remove(_tokenToMigrate);\\n      _jobTokens[_toJob].add(_tokenToMigrate);\\n    }\\n\\n    // migrate liquidities\\n    while (_jobLiquidities[_fromJob].length() > 0) {\\n      address _liquidity = _jobLiquidities[_fromJob].at(0);\\n\\n      liquidityAmount[_toJob][_liquidity] += liquidityAmount[_fromJob][_liquidity];\\n      delete liquidityAmount[_fromJob][_liquidity];\\n\\n      _jobLiquidities[_toJob].add(_liquidity);\\n      _jobLiquidities[_fromJob].remove(_liquidity);\\n    }\\n\\n    // migrate job balances\\n    _jobPeriodCredits[_toJob] += _jobPeriodCredits[_fromJob];\\n    delete _jobPeriodCredits[_fromJob];\\n\\n    _jobLiquidityCredits[_toJob] += _jobLiquidityCredits[_fromJob];\\n    delete _jobLiquidityCredits[_fromJob];\\n\\n    // stop _fromJob from being a job\\n    delete rewardedAt[_fromJob];\\n    _jobs.remove(_fromJob);\\n\\n    // delete unused data slots\\n    delete jobOwner[_fromJob];\\n    delete jobPendingOwner[_fromJob];\\n    delete _migrationCreatedAt[_fromJob][_toJob];\\n    delete pendingJobMigrations[_fromJob];\\n\\n    emit JobMigrationSuccessful(_fromJob, _toJob);\\n  }\\n}\\n\",\"keccak256\":\"0x87284161f30a0aa0c0e239cf62facf2bad417d8efbef5a1a1c251c54acaff5c7\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobOwnership.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../../../interfaces/peripherals/IKeep3rJobs.sol';\\n\\nabstract contract Keep3rJobOwnership is IKeep3rJobOwnership {\\n  /// @inheritdoc IKeep3rJobOwnership\\n  mapping(address => address) public override jobOwner;\\n\\n  /// @inheritdoc IKeep3rJobOwnership\\n  mapping(address => address) public override jobPendingOwner;\\n\\n  /// @inheritdoc IKeep3rJobOwnership\\n  function changeJobOwnership(address _job, address _newOwner) external override onlyJobOwner(_job) {\\n    jobPendingOwner[_job] = _newOwner;\\n    emit JobOwnershipChange(_job, jobOwner[_job], _newOwner);\\n  }\\n\\n  /// @inheritdoc IKeep3rJobOwnership\\n  function acceptJobOwnership(address _job) external override onlyPendingJobOwner(_job) {\\n    address _previousOwner = jobOwner[_job];\\n\\n    jobOwner[_job] = jobPendingOwner[_job];\\n    delete jobPendingOwner[_job];\\n\\n    emit JobOwnershipAssent(msg.sender, _job, _previousOwner);\\n  }\\n\\n  modifier onlyJobOwner(address _job) {\\n    if (msg.sender != jobOwner[_job]) revert OnlyJobOwner();\\n    _;\\n  }\\n\\n  modifier onlyPendingJobOwner(address _job) {\\n    if (msg.sender != jobPendingOwner[_job]) revert OnlyPendingJobOwner();\\n    _;\\n  }\\n}\\n\",\"keccak256\":\"0xa837590ade9cd5d25690e3f2d8b9a63e7202f7179b32e42eab4fa4c4324b9728\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobWorkable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rJobMigration.sol';\\nimport '../../../interfaces/IKeep3rHelper.sol';\\nimport '../../../interfaces/peripherals/IKeep3rJobs.sol';\\n\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\\n\\nabstract contract Keep3rJobWorkable is IKeep3rJobWorkable, Keep3rJobMigration {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n  using SafeERC20 for IERC20;\\n\\n  uint256 internal _initialGas;\\n\\n  /// @inheritdoc IKeep3rJobWorkable\\n  function isKeeper(address _keeper) external override returns (bool _isKeeper) {\\n    _initialGas = gasleft();\\n    if (_keepers.contains(_keeper)) {\\n      emit KeeperValidation(gasleft());\\n      return true;\\n    }\\n  }\\n\\n  /// @inheritdoc IKeep3rJobWorkable\\n  function isBondedKeeper(\\n    address _keeper,\\n    address _bond,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) public override returns (bool _isBondedKeeper) {\\n    _initialGas = gasleft();\\n    if (\\n      _keepers.contains(_keeper) &&\\n      bonds[_keeper][_bond] >= _minBond &&\\n      workCompleted[_keeper] >= _earned &&\\n      block.timestamp - firstSeen[_keeper] >= _age\\n    ) {\\n      emit KeeperValidation(gasleft());\\n      return true;\\n    }\\n  }\\n\\n  /// @inheritdoc IKeep3rJobWorkable\\n  function worked(address _keeper) external override {\\n    address _job = msg.sender;\\n    if (disputes[_job]) revert JobDisputed();\\n    if (!_jobs.contains(_job)) revert JobUnapproved();\\n\\n    if (_updateJobCreditsIfNeeded(_job)) {\\n      emit LiquidityCreditsReward(_job, rewardedAt[_job], _jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n    }\\n\\n    uint256 _gasRecord = gasleft();\\n    uint256 _boost = IKeep3rHelper(keep3rHelper).getRewardBoostFor(bonds[_keeper][keep3rV1]);\\n\\n    uint256 _payment = (_quoteLiquidity(_initialGas - _gasRecord, kp3rWethPool) * _boost) / BASE;\\n\\n    if (_payment > _jobLiquidityCredits[_job]) {\\n      _rewardJobCredits(_job);\\n      emit LiquidityCreditsReward(_job, rewardedAt[_job], _jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n    }\\n\\n    uint256 _gasUsed = _initialGas - gasleft();\\n    _payment = (_gasUsed * _payment) / (_initialGas - _gasRecord);\\n\\n    _bondedPayment(_job, _keeper, _payment);\\n    emit KeeperWork(keep3rV1, _job, _keeper, _payment, gasleft());\\n  }\\n\\n  /// @inheritdoc IKeep3rJobWorkable\\n  function bondedPayment(address _keeper, uint256 _payment) public override {\\n    address _job = msg.sender;\\n\\n    if (disputes[_job]) revert JobDisputed();\\n    if (!_jobs.contains(_job)) revert JobUnapproved();\\n\\n    if (_updateJobCreditsIfNeeded(_job)) {\\n      emit LiquidityCreditsReward(_job, rewardedAt[_job], _jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n    }\\n\\n    if (_payment > _jobLiquidityCredits[_job]) {\\n      _rewardJobCredits(_job);\\n      emit LiquidityCreditsReward(_job, rewardedAt[_job], _jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n    }\\n\\n    _bondedPayment(_job, _keeper, _payment);\\n    emit KeeperWork(keep3rV1, _job, _keeper, _payment, gasleft());\\n  }\\n\\n  function _bondedPayment(\\n    address _job,\\n    address _keeper,\\n    uint256 _payment\\n  ) internal {\\n    if (_payment > _jobLiquidityCredits[_job]) revert InsufficientFunds();\\n\\n    workedAt[_job] = block.timestamp;\\n    _jobLiquidityCredits[_job] -= _payment;\\n    bonds[_keeper][keep3rV1] += _payment;\\n    workCompleted[_keeper] += _payment;\\n  }\\n\\n  /// @inheritdoc IKeep3rJobWorkable\\n  function directTokenPayment(\\n    address _token,\\n    address _keeper,\\n    uint256 _amount\\n  ) external override {\\n    address _job = msg.sender;\\n\\n    if (disputes[_job]) revert JobDisputed();\\n    if (disputes[_keeper]) revert Disputed();\\n    if (!_jobs.contains(_job)) revert JobUnapproved();\\n    if (jobTokenCredits[_job][_token] < _amount) revert InsufficientFunds();\\n    jobTokenCredits[_job][_token] -= _amount;\\n    IERC20(_token).safeTransfer(_keeper, _amount);\\n    emit KeeperWork(_token, _job, _keeper, _amount, gasleft());\\n  }\\n}\\n\",\"keccak256\":\"0x970ed930a25888bd4d73f6ed964dd939d2f02e20410326e123b065bf1a2ddede\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/jobs/Keep3rJobs.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rJobDisputable.sol';\\nimport './Keep3rJobWorkable.sol';\\nimport './Keep3rJobManager.sol';\\n\\nabstract contract Keep3rJobs is Keep3rJobDisputable, Keep3rJobManager, Keep3rJobWorkable {}\\n\",\"keccak256\":\"0xc9939ffd28f6402b60ef4dd2b23cb5eb88099e4ce374248e1f2c80c5c7039df1\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/keepers/Keep3rKeeperDisputable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rKeeperFundable.sol';\\nimport '../Keep3rDisputable.sol';\\nimport '../../../interfaces/external/IKeep3rV1.sol';\\nimport '../../../interfaces/peripherals/IKeep3rKeepers.sol';\\n\\nabstract contract Keep3rKeeperDisputable is IKeep3rKeeperDisputable, Keep3rDisputable, Keep3rKeeperFundable {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n  using SafeERC20 for IERC20;\\n\\n  /// @inheritdoc IKeep3rKeeperDisputable\\n  function slash(\\n    address _keeper,\\n    address _bonded,\\n    uint256 _amount\\n  ) public override onlySlasher {\\n    if (!disputes[_keeper]) revert NotDisputed();\\n    _slash(_keeper, _bonded, _amount);\\n    emit KeeperSlash(_keeper, msg.sender, _amount);\\n  }\\n\\n  /// @inheritdoc IKeep3rKeeperDisputable\\n  function revoke(address _keeper) external override onlySlasher {\\n    if (!disputes[_keeper]) revert NotDisputed();\\n    _keepers.remove(_keeper);\\n    _slash(_keeper, keep3rV1, bonds[_keeper][keep3rV1]);\\n    emit KeeperRevoke(_keeper, msg.sender);\\n  }\\n\\n  function _slash(\\n    address _keeper,\\n    address _bonded,\\n    uint256 _amount\\n  ) internal {\\n    if (_bonded != keep3rV1) {\\n      try IERC20(_bonded).transfer(governance, _amount) returns (bool) {} catch (bytes memory) {}\\n    }\\n    bonds[_keeper][_bonded] -= _amount;\\n  }\\n}\\n\",\"keccak256\":\"0xe5f0656b8b252d4e06ee92306f54a9825fa8d339576820c83327267bbd243ea8\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/keepers/Keep3rKeeperFundable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../Keep3rAccountance.sol';\\nimport '../Keep3rParameters.sol';\\nimport '../../../interfaces/peripherals/IKeep3rKeepers.sol';\\n\\nimport '../../../interfaces/external/IKeep3rV1.sol';\\nimport '../../../interfaces/external/IKeep3rV1Proxy.sol';\\n\\nimport '@openzeppelin/contracts/security/ReentrancyGuard.sol';\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';\\n\\nabstract contract Keep3rKeeperFundable is IKeep3rKeeperFundable, ReentrancyGuard, Keep3rParameters {\\n  using EnumerableSet for EnumerableSet.AddressSet;\\n  using SafeERC20 for IERC20;\\n\\n  /// @inheritdoc IKeep3rKeeperFundable\\n  function bond(address _bonding, uint256 _amount) external override nonReentrant {\\n    if (disputes[msg.sender]) revert Disputed();\\n    if (_jobs.contains(msg.sender)) revert AlreadyAJob();\\n    canActivateAfter[msg.sender][_bonding] = block.timestamp + bondTime;\\n\\n    uint256 _before = IERC20(_bonding).balanceOf(address(this));\\n    IERC20(_bonding).safeTransferFrom(msg.sender, address(this), _amount);\\n    _amount = IERC20(_bonding).balanceOf(address(this)) - _before;\\n\\n    hasBonded[msg.sender] = true;\\n    pendingBonds[msg.sender][_bonding] += _amount;\\n\\n    emit Bonding(msg.sender, _bonding, _amount);\\n  }\\n\\n  /// @inheritdoc IKeep3rKeeperFundable\\n  function activate(address _bonding) external override {\\n    if (disputes[msg.sender]) revert Disputed();\\n    if (canActivateAfter[msg.sender][_bonding] == 0) revert BondsUnexistent();\\n    if (canActivateAfter[msg.sender][_bonding] >= block.timestamp) revert BondsLocked();\\n\\n    _activate(msg.sender, _bonding);\\n  }\\n\\n  /// @inheritdoc IKeep3rKeeperFundable\\n  function unbond(address _bonding, uint256 _amount) external override {\\n    canWithdrawAfter[msg.sender][_bonding] = block.timestamp + unbondTime;\\n    bonds[msg.sender][_bonding] -= _amount;\\n    pendingUnbonds[msg.sender][_bonding] += _amount;\\n\\n    emit Unbonding(msg.sender, _bonding, _amount);\\n  }\\n\\n  /// @inheritdoc IKeep3rKeeperFundable\\n  function withdraw(address _bonding) external override nonReentrant {\\n    if (canWithdrawAfter[msg.sender][_bonding] == 0) revert UnbondsUnexistent();\\n    if (canWithdrawAfter[msg.sender][_bonding] >= block.timestamp) revert UnbondsLocked();\\n    if (disputes[msg.sender]) revert Disputed();\\n\\n    uint256 _amount = pendingUnbonds[msg.sender][_bonding];\\n\\n    if (_bonding == keep3rV1) {\\n      IKeep3rV1Proxy(keep3rV1Proxy).mint(_amount);\\n    }\\n\\n    pendingUnbonds[msg.sender][_bonding] = 0;\\n    IERC20(_bonding).safeTransfer(msg.sender, _amount);\\n\\n    emit Withdrawal(msg.sender, _bonding, _amount);\\n  }\\n\\n  function _bond(\\n    address _bonding,\\n    address _from,\\n    uint256 _amount\\n  ) internal {\\n    bonds[_from][_bonding] += _amount;\\n    if (_bonding == keep3rV1) {\\n      IKeep3rV1(keep3rV1).burn(_amount);\\n    }\\n  }\\n\\n  function _activate(address _keeper, address _bonding) internal {\\n    if (firstSeen[_keeper] == 0) {\\n      firstSeen[_keeper] = block.timestamp;\\n    }\\n    _keepers.add(_keeper);\\n    uint256 _amount = pendingBonds[_keeper][_bonding];\\n    pendingBonds[_keeper][_bonding] = 0;\\n    _bond(_bonding, _keeper, _amount);\\n\\n    emit Activation(_keeper, _bonding, _amount);\\n  }\\n}\\n\",\"keccak256\":\"0xf9faaf6ecb8f503bec775326cbac29ce527b0fbec50efea38ad9d3e4620983d9\",\"license\":\"MIT\"},\"solidity/contracts/peripherals/keepers/Keep3rKeepers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './Keep3rKeeperDisputable.sol';\\n\\nabstract contract Keep3rKeepers is Keep3rKeeperDisputable {}\\n\",\"keccak256\":\"0xced9f9ec9610bb34b2e87fc1f05f036d37cee5a9df61d4fe527d92b1d9c1e244\",\"license\":\"MIT\"},\"solidity/interfaces/IKeep3rHelper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\n/// @title Keep3rHelper contract\\n/// @notice Contains all the helper functions used throughout the different files.\\ninterface IKeep3rHelper {\\n  // Errors\\n\\n  /// @notice Throws when none of the tokens in the liquidity pair is KP3R\\n  error LiquidityPairInvalid();\\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 Address of KP3R-WETH pool to use as oracle\\n  /// @return _kp3rWeth Address of KP3R-WETH pool to use as oracle\\n  function KP3R_WETH_POOL() external view returns (address _kp3rWeth);\\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 * MIN / BOOST_BASE\\n  /// @return _multiplier The MIN multiplier\\n  function MIN() 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 * MAX / BOOST_BASE\\n  /// @return _multiplier The MAX multiplier\\n  function MAX() external view returns (uint256 _multiplier);\\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 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  // 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 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\":\"0xc1403ca749d220ed4798d4285a91e1f63466fa57a0d1e6e564d26aba98239333\",\"license\":\"MIT\"},\"solidity/interfaces/IPairManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <0.9.0;\\n\\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\\n\\n/// @title  Pair Manager interface\\n/// @notice Generic interface for Keep3r liquidity pools (kLP)\\ninterface IPairManager is IERC20Metadata {\\n  /// @notice Address of the pool from which the Keep3r pair manager will interact with\\n  /// @return _pool The pool's address\\n  function pool() external view returns (address _pool);\\n\\n  /// @notice Token0 of the pool\\n  /// @return _token0 The address of token0\\n  function token0() external view returns (address _token0);\\n\\n  /// @notice Token1 of the pool\\n  /// @return _token1 The address of token1\\n  function token1() external view returns (address _token1);\\n}\\n\",\"keccak256\":\"0xf4a6cdbc481a5f7f03ff888b11fc128b13336c19182437cfd4530e4dc21ed894\",\"license\":\"MIT\"},\"solidity/interfaces/external/IKeep3rV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.0 <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\":\"0x450dd3f1205ddb06547eeabbf470a8df4b4858ea7c84b06d23dd4d41c9645477\",\"license\":\"MIT\"},\"solidity/interfaces/external/IKeep3rV1Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '../peripherals/IGovernable.sol';\\n\\ninterface IKeep3rV1Proxy is IGovernable {\\n  // Structs\\n  struct Recipient {\\n    address recipient;\\n    uint256 caps;\\n  }\\n\\n  // Variables\\n  function keep3rV1() external view returns (address);\\n\\n  function minter() external view returns (address);\\n\\n  function next(address) external view returns (uint256);\\n\\n  function caps(address) external view returns (uint256);\\n\\n  function recipients() external view returns (address[] memory);\\n\\n  function recipientsCaps() external view returns (Recipient[] memory);\\n\\n  // Errors\\n  error Cooldown();\\n  error NoDrawableAmount();\\n  error ZeroAddress();\\n  error OnlyMinter();\\n\\n  // Methods\\n  function addRecipient(address recipient, uint256 amount) external;\\n\\n  function removeRecipient(address recipient) external;\\n\\n  function draw() external returns (uint256 _amount);\\n\\n  function setKeep3rV1(address _keep3rV1) external;\\n\\n  function setMinter(address _minter) external;\\n\\n  function mint(uint256 _amount) external;\\n\\n  function mint(address _account, uint256 _amount) external;\\n\\n  function setKeep3rV1Governance(address _governance) external;\\n\\n  function acceptKeep3rV1Governance() external;\\n\\n  function dispute(address _keeper) external;\\n\\n  function slash(\\n    address _bonded,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n\\n  function revoke(address _keeper) external;\\n\\n  function resolve(address _keeper) external;\\n\\n  function addJob(address _job) external;\\n\\n  function removeJob(address _job) 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 setKeep3rHelper(address _keep3rHelper) external;\\n\\n  function addVotes(address _voter, uint256 _amount) external;\\n\\n  function removeVotes(address _voter, uint256 _amount) external;\\n}\\n\",\"keccak256\":\"0xfb2e81fe347b39aabce849ef2d42c6df846b7ef0ed5ae952c85bbb708da99408\",\"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/IDustCollector.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './IBaseErrors.sol';\\n\\ninterface IDustCollector is IBaseErrors {\\n  /// @notice Emitted when dust is sent\\n  /// @param _to The address which wil received the funds\\n  /// @param _token The token that will be transferred\\n  /// @param _amount The amount of the token that will be transferred\\n  event DustSent(address _token, uint256 _amount, address _to);\\n\\n  /// @notice Allows an authorized user to transfer the tokens or eth that may have been left in a contract\\n  /// @param _token The token that will be transferred\\n  /// @param _amount The amont of the token that will be transferred\\n  /// @param _to The address that will receive the idle funds\\n  function sendDust(\\n    address _token,\\n    uint256 _amount,\\n    address _to\\n  ) external;\\n}\\n\",\"keccak256\":\"0x4ac17b48321c60a65ddc79d200a618ce686f2ff8f075356e1b39bac01982214a\",\"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 of the user proposed to be 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\":\"0xbf544faa1011d7772f891f3cbfd9966602a6a2bc596e3492dc117fcf4765d9ce\",\"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  /// @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  /// @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  /// @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  /// @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  /// @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  /// @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  /// @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  /// @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  /// @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  /// @return _hasBonded Whether the address has ever bonded an asset\\n  function hasBonded(address _keeper) external view returns (bool _hasBonded);\\n\\n  // Methods\\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 jobs 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\":\"0x48095f8ba437fc0f89e351c662de465d8a388f23cd1e533fb6cd0b1644bacb23\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rDisputable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rDisputable contract\\n/// @notice Creates/resolves disputes for jobs or keepers\\n///         A disputed keeper is slashable and is not able to bond, activate, withdraw or receive direct payments\\n///         A disputed job is slashable and is not able to pay the keepers, withdraw tokens or to migrate\\ninterface IKeep3rDisputable {\\n  /// @notice Emitted when a keeper or a job is disputed\\n  /// @param _jobOrKeeper The address of the disputed keeper/job\\n  /// @param _disputer The user that called the function and disputed the keeper\\n  event Dispute(address indexed _jobOrKeeper, address indexed _disputer);\\n\\n  /// @notice Emitted when a dispute is resolved\\n  /// @param _jobOrKeeper The address of the disputed keeper/job\\n  /// @param _resolver The user that called the function and resolved the dispute\\n  event Resolve(address indexed _jobOrKeeper, address indexed _resolver);\\n\\n  /// @notice Throws when a job or keeper is already disputed\\n  error AlreadyDisputed();\\n\\n  /// @notice Throws when a job or keeper is not disputed and someone tries to resolve the dispute\\n  error NotDisputed();\\n\\n  /// @notice Allows governance to create a dispute for a given keeper/job\\n  /// @param _jobOrKeeper The address in dispute\\n  function dispute(address _jobOrKeeper) external;\\n\\n  /// @notice Allows governance to resolve a dispute on a keeper/job\\n  /// @param _jobOrKeeper The address cleared\\n  function resolve(address _jobOrKeeper) external;\\n}\\n\",\"keccak256\":\"0x002b9b4c75e62d48d74b6447649d39eb5c1e128d2523bb11e08e9cd3e27b1f70\",\"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 [job => token => timestamp]\\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 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 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 unbound from\\n  /// @param _liquidity The liquidity being unbound\\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 _amount 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 _amount, 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, 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. 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\\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 newowner 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 (job => user)\\n  /// @return _owner The addres of the owner of the job\\n  function jobOwner(address _job) external view returns (address _owner);\\n\\n  /// @notice Maps the owner of the job to its pending owner (job => user)\\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  function changeJobOwnership(address _job, address _newOwner) external;\\n\\n  /// @notice The proposed address accepts to be the owner 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\":\"0x86622bf040feda6b63b377c3b1edf4919d73247caedc1725c792be4346f1716d\",\"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 bound\\n  /// @param _amount The amount of bonding asset being bound\\n  function bond(address _bonding, uint256 _amount) external;\\n\\n  /// @notice Beginning of the unbonding process\\n  /// @param _bonding The asset being unbound\\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 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 revoked keeper\\n  /// @param _slasher The user that called Keep3rKeeperDisputable#revoke\\n  event KeeperRevoke(address indexed _keeper, address indexed _slasher);\\n\\n  /// @notice Keeper revoked\\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 _amount The amount being slashed\\n  function slash(\\n    address _keeper,\\n    address _bonded,\\n    uint256 _amount\\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\":\"0xfb28854502f63e7ac13c24cad3b99a78055772683e17930c5a0e02bcc2b3b7ba\",\"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  // solhint-disable func-name-mixedcase\\n  /// @notice The base that will be used to calculate the fee\\n  /// @return _base The base that will be used to calculate the fee\\n  function BASE() external view returns (uint256 _base);\\n\\n  /// @notice The minimum rewardPeriodTime value to be set\\n  /// @return _minPeriod The minimum reward period in seconds\\n  function MIN_REWARD_PERIOD_TIME() external view returns (uint256 _minPeriod);\\n\\n  // solhint-enable func-name-mixedcase\\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\":\"0xd221063890e699e9fc3d3557212ab8ff5a97e9b405a40d6684df59419f32a58a\",\"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 Maps an address to a boolean to determine whether the address is a slasher or not.\\n  /// @return _isSlasher Whether the address is a slasher or not\\n  function slashers(address _slasher) external view returns (bool _isSlasher);\\n\\n  /// @notice Maps an address to a boolean to determine whether the address is a disputer or not.\\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\":\"0x07e0e382930eb6d1432660e0d6ad32a74e01438284db03d8eab1b02bc2a6be9e\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040526203f480601f55621275006020556729a2241af62c000060215562069780602255622cd300602355601e6024553480156200003e57600080fd5b5060405162006210380380620062108339810160408190526200006191620001ce565b60016000558383838388806001600160a01b038116620000935760405162b293ed60e81b815260040160405180910390fd5b601780546001600160a01b03199081166001600160a01b0393841617909155601d80548216888416178155601b80548316888516179055601c80548316878516179055601e8054831686851690811782556000818152600e602052604090819020805490951690911790935590549054915163696a437b60e01b81529183166004830152909116915063696a437b9060240160206040518083038186803b1580156200013e57600080fd5b505afa15801562000153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017991906200023e565b6001600160a01b03919091166000908152600f60205260409020805460ff191691151591909117905550620002699650505050505050565b80516001600160a01b0381168114620001c957600080fd5b919050565b600080600080600060a08688031215620001e757600080fd5b620001f286620001b1565b94506200020260208701620001b1565b93506200021260408701620001b1565b92506200022260608701620001b1565b91506200023260808701620001b1565b90509295509295909350565b6000602082840312156200025157600080fd5b815180151581146200026257600080fd5b9392505050565b615f9780620002796000396000f3fe608060405234801561001057600080fd5b50600436106104cd5760003560e01c806390a4684e11610283578063c7ae40d01161015c578063ec342ad0116100ce578063f25e311b11610092578063f25e311b14610c56578063f39c38a014610c69578063f75f9f7b14610c7c578063f9d46cf214610c8f578063fc253d2b14610ca2578063fe75bc4614610cab57600080fd5b8063ec342ad014610bde578063ec8ca64314610be7578063f0f346b914610c10578063f11a1d1a14610c23578063f136a09d14610c3657600080fd5b8063dd2080d611610120578063dd2080d614610b69578063ddca3f4314610b7c578063e326ac4314610b85578063e74f823914610ba5578063ebbb619414610bb8578063ec00cdfc14610bcb57600080fd5b8063c7ae40d014610af2578063cb4be2bb14610b05578063cb54694d14610b18578063cd22af1b14610b2b578063d55995fe14610b5657600080fd5b8063a7d2e784116101f5578063b2392233116101b9578063b239223314610a58578063b440027f14610a6b578063b600702a14610a96578063b7e7734014610aa9578063b87fcbff14610abc578063c5198abc14610adf57600080fd5b8063a7d2e784146109f3578063aac6aa9c146109fc578063ab033ea914610a0f578063af320e8114610a22578063b0103b1a14610a3557600080fd5b8063a214580911610247578063a214580914610954578063a39744b514610967578063a515366a14610992578063a5d059ca146109a5578063a676f9ff146109b8578063a734f06e146109d857600080fd5b806390a4684e146108ea578063951dc22c146108fd578063966abd001461090557806398e90a0f146109185780639d5c33d81461094157600080fd5b8063594a3a93116103b55780636cf262bc116103275780637b40c913116102eb5780637b40c9131461085d5780637c8fce2314610870578063878c723e146108785780638bb6dfa8146108a15780638cb22b76146108b45780638fe204dd146108d757600080fd5b80636cf262bc146108085780636e2a9ca61461081b57806372da828a1461082e57806374a8f10314610841578063768b5d901461085457600080fd5b8063633fb68f11610379578063633fb68f1461078857806364bb43ee1461079157806368a9f19c146107a4578063694798e6146107b757806369fe0e2d146107e25780636ba42aaa146107f557600080fd5b8063594a3a931461073357806359a2255e146107465780635aa6e675146107595780635ebe23f01461076c5780635feeb7941461077557600080fd5b80631b44555e1161044e578063274a8db411610412578063274a8db4146106aa578063461411bc146106dd57806351cff8d9146106e757806352a4de29146106fa57806355ea6c471461070d578063575288bf1461072057600080fd5b80631b44555e146106195780631c5a9d9c146106395780631ef94b911461064c57806321040b0114610677578063238efcbc146106a257600080fd5b806311466d721161049557806311466d721461056057806315006b8214610573578063160e1e311461059e578063165e62e7146105b1578063168f92e7146105ee57600080fd5b8063034d4c61146104d257806307b435c2146104f85780630c620bce146105235780630d6a1f87146105385780631101eb411461054b575b600080fd5b6104e56104e03660046159db565b610cbe565b6040519081526020015b60405180910390f35b6104e5610506366004615a15565b601260209081526000928352604080842090915290825290205481565b61052b610dc3565b6040516104ef9190615ce9565b6104e5610546366004615b7e565b610dd4565b61055e610559366004615a99565b610ee7565b005b61055e61056e366004615b7e565b611041565b6104e5610581366004615a15565b601060209081526000928352604080842090915290825290205481565b61055e6105ac3660046159db565b6111df565b6105c46105bf3660046159db565b61133c565b604080518251600690810b825260208085015190910b9082015291810151908201526060016104ef565b6104e56105fc366004615a15565b600960209081526000928352604080842090915290825290205481565b6104e56106273660046159db565b60056020526000908152604090205481565b61055e6106473660046159db565b611702565b601b5461065f906001600160a01b031681565b6040516001600160a01b0390911681526020016104ef565b6104e5610685366004615a15565b601360209081526000928352604080842090915290825290205481565b61055e6117c4565b6106cd6106b83660046159db565b601a6020526000908152604090205460ff1681565b60405190151581526020016104ef565b6104e56201518081565b61055e6106f53660046159db565b61184d565b61055e610708366004615a99565b611a3f565b61055e61071b3660046159db565b611c72565b61055e61072e366004615a99565b611d26565b61055e610741366004615a15565b611fe1565b61055e6107543660046159db565b612086565b60175461065f906001600160a01b031681565b6104e5601f5481565b61055e6107833660046159db565b612138565b6104e560215481565b61055e61079f3660046159db565b6123f4565b61055e6107b23660046159db565b612480565b6104e56107c5366004615a15565b602860209081526000928352604080842090915290825290205481565b61055e6107f0366004615c3f565b612539565b6106cd6108033660046159db565b612599565b6104e56108163660046159db565b6125ea565b61055e610829366004615a99565b612732565b61055e61083c3660046159db565b61287e565b61055e61084f3660046159db565b61291e565b6104e560225481565b601e5461065f906001600160a01b031681565b61052b612a05565b61065f6108863660046159db565b6001602052600090815260409020546001600160a01b031681565b6104e56108af3660046159db565b612a11565b6106cd6108c23660046159db565b60146020526000908152604090205460ff1681565b61055e6108e5366004615c3f565b612ae9565b61055e6108f8366004615a15565b612b47565b61052b612c31565b61055e610913366004615baa565b612c3d565b61065f6109263660046159db565b6002602052600090815260409020546001600160a01b031681565b61055e61094f3660046159db565b612d53565b61055e610962366004615a4e565b612e0c565b6104e5610975366004615a15565b600860209081526000928352604080842090915290825290205481565b61055e6109a0366004615b7e565b612fec565b61055e6109b3366004615b7e565b613243565b6104e56109c63660046159db565b60296020526000908152604090205481565b61065f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6104e560205481565b61055e610a0a3660046159db565b61331d565b61055e610a1d3660046159db565b6133d2565b61055e610a30366004615a15565b61344b565b6106cd610a433660046159db565b60076020526000908152604090205460ff1681565b61055e610a66366004615c3f565b6138c8565b6104e5610a79366004615a15565b602560209081526000928352604080842090915290825290205481565b61055e610aa43660046159db565b613928565b61055e610ab7366004615c3f565b613b48565b6106cd610aca3660046159db565b60196020526000908152604090205460ff1681565b61055e610aed3660046159db565b613ba8565b601c5461065f906001600160a01b031681565b61055e610b133660046159db565b613c6d565b61055e610b26366004615c3f565b613d0d565b6104e5610b39366004615a15565b601160209081526000928352604080842090915290825290205481565b61055e610b64366004615ada565b613d91565b61055e610b77366004615a99565b613fc8565b6104e560245481565b6104e5610b933660046159db565b60066020526000908152604090205481565b61055e610bb3366004615a99565b614150565b61055e610bc6366004615c3f565b614201565b61055e610bd93660046159db565b614261565b6104e561271081565b61065f610bf53660046159db565b602c602052600090815260409020546001600160a01b031681565b61055e610c1e3660046159db565b614301565b601d5461065f906001600160a01b031681565b6104e5610c443660046159db565b602a6020526000908152604090205481565b61055e610c64366004615a99565b6143b6565b60185461065f906001600160a01b031681565b61055e610c8a3660046159db565b6145fc565b6106cd610c9d366004615b2d565b6146b4565b6104e560235481565b61055e610cb9366004615b7e565b61478e565b600080610cca836125ea565b90506000610ce460225442610cdf9190615e3b565b61487e565b6001600160a01b0385166000908152602960205260409020541115610d88576022546001600160a01b038516600090815260296020526040902054610d299042615e3b565b10610d65576022546001600160a01b038516600090815260296020526040902054610d549190615da0565b610d5e9042615e3b565b9050610d9e565b6001600160a01b038416600090815260296020526040902054610d5e9042615e3b565b610d914261487e565b610d9b9042615e3b565b90505b610da88183614898565b610db185612a11565b610dbb9190615da0565b949350505050565b6060610dcf60266148c2565b905090565b6000610de16026846148d6565b15610ee1576000610df18461133c565b90508060400151600014610edf576001600160a01b0384166000908152600f602052604081205460ff16610e32578160200151610e2d90615ead565b610e38565b81602001515b601d5460225460405163a0d2710760e01b815260048101889052600684900b60248201526044810191909152919250610ed6916001600160a01b039091169063a0d27107906064015b60206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190615c58565b6148f8565b92505050610ee1565b505b92915050565b6001600160a01b038381166000908152600160205260409020548491163314610f2357604051636efb4f4160e11b815260040160405180910390fd5b602054610f309042615da0565b6001600160a01b03808616600081815260126020908152604080832094891680845294825280832095909555918152601382528381209281529190529081208054849290610f7f908490615da0565b90915550610f909050848484614909565b6001600160a01b038085166000908152602860209081526040808320938716835292905220548015801590610fcf5750602154610fcd8286614b17565b105b15610fed57604051636f447fcd60e11b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03167f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de8560405161103291815260200190565b60405180910390a35050505050565b3360008181526007602052604090205460ff16156110725760405163ad2fdf3b60e01b815260040160405180910390fd5b61107d6015826148d6565b6110995760405162941a5760e11b815260040160405180910390fd5b6110a281614c3f565b156110ff576001600160a01b038116600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b6001600160a01b0381166000908152600a60205260409020548211156111805761112881614e15565b6001600160a01b038116600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b61118b818484614ea3565b601b546001600160a01b038085169183821691167f46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfa855a6040805192835260208301919091520160405180910390a4505050565b6017546001600160a01b0316331461120a576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166112315760405163d92e233d60e01b815260040160405180910390fd5b601e80546001600160a01b038381166001600160a01b031992831681179093556000838152600e60205260409081902080549093168417909255601d54915163696a437b60e01b81526004810193909352169063696a437b9060240160206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190615be1565b6001600160a01b0382166000818152600f6020908152604091829020805460ff191694151594909417909355519081527f9bb1515b0fc2645a3f011162460a22fdd512e0bca265e7dc9ba6bceae8930afa91015b60405180910390a150565b60408051606081018252600080825260208201819052918101919091526113624261487e565b6001600160a01b0383166000908152602b602052604090206001015414156113d857506001600160a01b03166000908152602b602090815260409182902082516060810184528154600681810b810b810b8352600160381b909104810b810b900b92810192909252600101549181019190915290565b6000806113ec60225442610cdf9190615e3b565b6001600160a01b0385166000908152602b602052604090206001015490915081141561155057604080516001808252818301909252600091602080830190803683375050506001600160a01b0386166000908152602b602052604090205490915060060b6114594261487e565b6114639042615e3b565b8260008151811061147657611476615f16565b63ffffffff909216602092830291909101820152601d546001600160a01b038881166000908152600e90935260409283902054925163dc686d9160e01b81529181169263dc686d91926114d29291909116908690600401615c8d565b60606040518083038186803b1580156114ea57600080fd5b505afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115229190615bfc565b600692830b90920b80885291955061153c91839150615deb565b600690810b900b6020860152506116d99050565b6001600160a01b0384166000908152602b60205260409020600101548111156116d95760408051600280825260608201835260009260208301908036833701905050905061159d4261487e565b6115a79042615e3b565b816000815181106115ba576115ba615f16565b602002602001019063ffffffff16908163ffffffff16815250506022546115e04261487e565b6115ea9042615e3b565b6115f49190615da0565b8160018151811061160757611607615f16565b63ffffffff909216602092830291909101820152601d546001600160a01b038781166000908152600e909352604080842054905163dc686d9160e01b81529282169263dc686d919261165f9216908690600401615c8d565b60606040518083038186803b15801561167757600080fd5b505afa15801561168b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116af9190615bfc565b600692830b90920b80885291955091506116ca908290615deb565b600690810b900b602086015250505b81156116f2576116e84261487e565b60408401526116fa565b600060408401525b50505b919050565b3360009081526007602052604090205460ff1615611733576040516362e6201d60e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b038516845290915290205461177457604051636258f48160e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b038516845290915290205442116117b757604051630fd0eeef60e11b815260040160405180910390fd5b6117c13382614f87565b50565b6018546001600160a01b031633146117ef57604051637ef5703160e11b815260040160405180910390fd5b60188054601780546001600160a01b0383166001600160a01b031991821681179092559091169091556040519081527fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b69060200160405180910390a1565b600260005414156118795760405162461bcd60e51b815260040161187090615d69565b60405180910390fd5b600260009081553381526012602090815260408083206001600160a01b03851684529091529020546118be5760405163184c088160e21b815260040160405180910390fd5b3360009081526012602090815260408083206001600160a01b03851684529091529020544211611901576040516327cfdcb760e01b815260040160405180910390fd5b3360009081526007602052604090205460ff1615611932576040516362e6201d60e01b815260040160405180910390fd5b3360009081526013602090815260408083206001600160a01b0385811680865291909352922054601b549092911614156119c557601c5460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401600060405180830381600087803b1580156119ac57600080fd5b505af11580156119c0573d6000803e3d6000fd5b505050505b3360008181526013602090815260408083206001600160a01b03871680855292528220919091556119f69183615048565b6040518181526001600160a01b0383169033907f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63989060200160405180910390a350506001600055565b60026000541415611a625760405162461bcd60e51b815260040161187090615d69565b6002600055611a726026836148d6565b611a8f5760405163e0b6aead60e01b815260040160405180910390fd5b611a9a6015846148d6565b611ab757604051636211d34960e01b815260040160405180910390fd5b6001600160a01b0383166000908152600d60205260409020611ad990836150b0565b50611ae3836150c5565b6021546001600160a01b03808516600090815260286020908152604080832093871683529290522054611b2190611b1b908490615da0565b84614b17565b1015611b4057604051636f447fcd60e11b815260040160405180910390fd5b6001600160a01b038316600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a2611bac6001600160a01b038316333084615123565b6001600160a01b03808416600090815260286020908152604080832093861683529290529081208054839290611be3908490615da0565b90915550611bf69050610ed18284614b17565b6001600160a01b0384166000908152600b602052604081208054909190611c1e908490615da0565b909155505060405181815233906001600160a01b0384811691908616907f4e186bc75a2220191b826baff3ee63c3e970e94e58a9007ff94c9a7b8e6ebb3f9060200160405180910390a45050600160005550565b336000908152601a602052604090205460ff16611ca257604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16611cdb576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19169055513392917fe02b2375d8fb4aef3e5bc5d53bffcf70b6f185c5c93e69dcbe8b6cfc58e837e291a350565b60026000541415611d495760405162461bcd60e51b815260040161187090615d69565b6002600055611d596015846148d6565b611d7657604051636211d34960e01b815260040160405180910390fd5b601b546001600160a01b0383811691161415611da45760405162822d9760e71b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1e9190615c58565b9050611e356001600160a01b038416333085615123565b6040516370a0823160e01b815230600482015260009082906001600160a01b038616906370a082319060240160206040518083038186803b158015611e7957600080fd5b505afa158015611e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb19190615c58565b611ebb9190615e3b565b9050600061271060245483611ed09190615dcc565b611eda9190615db8565b9050611ee68183615e3b565b6001600160a01b038088166000908152600960209081526040808320938a1683529290529081208054909190611f1d908490615da0565b90915550506001600160a01b0380871660009081526025602090815260408083208985168085529252909120429055601754611f5a921683615048565b6001600160a01b0386166000908152600c60205260409020611f7c90866150b0565b50336001600160a01b0316856001600160a01b0316876001600160a01b03167fec1a37d4a331a5059081e0fb5da1735e7890900cd215a4fb1e9f2779fd7b83eb85604051611fcc91815260200190565b60405180910390a45050600160005550505050565b6001600160a01b03828116600090815260016020526040902054839116331461201d57604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03838116600081815260026020908152604080832080546001600160a01b031916888716908117909155600190925280832054905191941692917fa8bad3f0b781e1d954af9945167d5f80bfe5e57930f17c93843187c77557a6b891a4505050565b6001600160a01b0381811660009081526002602052604090205482911633146120c25760405163cfe9663360e01b815260040160405180910390fd5b6001600160a01b03828116600081815260016020908152604080832080546002909352818420805487166001600160a01b031980861691909117909255805490911690555193169283929133917fcf30c54296d5eee76168b564c59c50578d49c271733a470f32707c8cfbc88a8b9190a4505050565b3360008181526007602052604090205460ff16156121695760405163ad2fdf3b60e01b815260040160405180910390fd5b6121746015826148d6565b6121905760405162941a5760e11b815260040160405180910390fd5b61219981614c3f565b156121f6576001600160a01b038116600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b60005a601d546001600160a01b038581166000908152600860209081526040808320601b548516845290915280822054905163516c332360e01b815260048101919091529394509291169063516c33239060240160206040518083038186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229a9190615c58565b90506000612710826122c485602e546122b39190615e3b565b601e546001600160a01b0316614b17565b6122ce9190615dcc565b6122d89190615db8565b6001600160a01b0385166000908152600a602052604090205490915081111561235c5761230484614e15565b6001600160a01b038416600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b60005a602e5461236c9190615e3b565b905083602e5461237c9190615e3b565b6123868383615dcc565b6123909190615db8565b915061239d858784614ea3565b601b546001600160a01b038088169187821691167f46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfa855a6040805192835260208301919091520160405180910390a4505050505050565b6017546001600160a01b0316331461241f576040516354348f0360e01b815260040160405180910390fd5b61242a602682615161565b61244757604051630a8d08b160e01b815260040160405180910390fd5b6040516001600160a01b03821681527f51199d699bdfd516fa88dd0d2f8487c40c147b4867acaa23adc8d4df6b098e5690602001611331565b6017546001600160a01b031633146124ab576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16156124e55760405163546da66560e11b815260040160405180910390fd5b6001600160a01b038116600081815260196020908152604091829020805460ff1916600117905590519182527f049ccb28ab796d3225573a065712f6e7754487ced56056cda8889c337511807b9101611331565b6017546001600160a01b03163314612564576040516354348f0360e01b815260040160405180910390fd5b60248190556040518181527f4c10ca068ff7002cf5da78f2f697d1e91f6f0ac27f7344b28e8ef25263f87e5d90602001611331565b60005a602e556125aa6003836148d6565b156116fd577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb5a60405190815260200160405180910390a1506001919050565b6000805b6001600160a01b0383166000908152600d6020526040902061260f90615176565b81101561272c576001600160a01b0383166000908152600d602052604081206126389083615180565b90506126456026826148d6565b156127195760006126558261133c565b90508060400151600014612717576001600160a01b0382166000908152600f602052604081205460ff1661269657816020015161269190615ead565b61269c565b81602001515b601d546001600160a01b03888116600090815260286020908152604080832089851684529091529081902054602254915163a0d2710760e01b81526004810191909152600685900b602482015260448101919091529293506127099291169063a0d2710790606401610e81565b6127139086615da0565b9450505b505b508061272481615e7e565b9150506125ee565b50919050565b3360009081526019602052604090205460ff1661276257604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1661279b576040516310cec38560e21b815260040160405180910390fd5b6127a6838383614909565b60175460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156127f457600080fd5b505af1925050508015612824575060408051601f3d908101601f1916820190925261282191810190615be1565b60015b61282d5761282f565b505b604080516001600160a01b038481168252602082018490523392908616917f6e10247c3c094d220ee99436c164b7f38d63b335a20ed817cbefaee4bb02d20e91015b60405180910390a3505050565b6017546001600160a01b031633146128a9576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166128d05760405163d92e233d60e01b815260040160405180910390fd5b601d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f71973fd672e51deb8f739b1f7e1eab991936645acd6f83e2bde6eeeaff5490b090602001611331565b3360009081526019602052604090205460ff1661294e57604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16612987576040516310cec38560e21b815260040160405180910390fd5b612992600382615161565b50601b546001600160a01b0380831660009081526008602090815260408083209390941680835292905291909120546129cc91839161518c565b60405133906001600160a01b038316907f038a17b9b553c0c3fc2ed14b957a5d8420a1666fd2efe5c1b3fe5f23eea61bb390600090a350565b6060610dcf60156148c2565b600080612a1d836125ea565b9050612a3060225442610cdf9190615e3b565b6001600160a01b0384166000908152602960205260409020541115610ee1576022546001600160a01b038416600090815260296020526040902054612a759042615e3b565b10612a825780915061272c565b60008111612aa8576001600160a01b0383166000908152600a6020526040902054612ae2565b6001600160a01b0383166000908152600b6020908152604080832054600a90925290912054612ad8908390615dcc565b612ae29190615db8565b915061272c565b6017546001600160a01b03163314612b14576040516354348f0360e01b815260040160405180910390fd5b60208181556040518281527fc8d443472c9783cc36f8f5f5091f08ce9f37fc2f9e6d79cf1d9aaf40a433fee29101611331565b6001600160a01b038281166000908152600160205260409020548391163314612b8357604051636efb4f4160e11b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03161415612bb65760405163afe7ad4960e01b815260040160405180910390fd5b6001600160a01b038381166000818152602c6020908152604080832080546001600160a01b0319169588169586179055602d8252808320858452825291829020429055905192835290917fff0456758201108de53c0ff04c69988d4678ff455b2ce6f733328cf85722c04c91015b60405180910390a2505050565b6060610dcf60036148c2565b6017546001600160a01b03163314612c68576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116612c8f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612cf0576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612cea573d6000803e3d6000fd5b50612d04565b612d046001600160a01b0384168284615048565b604080516001600160a01b0385811682526020820185905283168183015290517f9a3055ded8c8b5f21bbf4946c5afab6e1fa8b3f057922658e5e1ade125fb0b1e9181900360600190a1505050565b6017546001600160a01b03163314612d7e576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1615612db85760405163274e25dd60e11b815260040160405180910390fd5b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916600117905590519182527f8addc69f897ecca0e41d70ed4ff9d75a9148a615a0fbda8597e53aea2684302f9101611331565b6001600160a01b038381166000908152600160205260409020548491163314612e4857604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b038216612e6f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516600090815260126020908152604080832093871683529290522054612eb25760405163184c088160e21b815260040160405180910390fd5b6001600160a01b038085166000908152601260209081526040808320938716835292905220544211612ef7576040516327cfdcb760e01b815260040160405180910390fd5b6001600160a01b03841660009081526007602052604090205460ff1615612f31576040516362e6201d60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526013602090815260408083209387168084529390915290205490612f66908483615048565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffdb7893bf11f50c621e59cc7f1cf540e94295cb27ca869ec7ed7618ca792886284604051612fb591815260200190565b60405180910390a45050506001600160a01b0391821660009081526013602090815260408083209390941682529190915290812055565b6002600054141561300f5760405162461bcd60e51b815260040161187090615d69565b600260009081553381526007602052604090205460ff1615613044576040516362e6201d60e01b815260040160405180910390fd5b61304f6015336148d6565b1561306d5760405163d7229c4360e01b815260040160405180910390fd5b601f5461307a9042615da0565b3360009081526011602090815260408083206001600160a01b03871680855292528083209390935591516370a0823160e01b81523060048201529091906370a082319060240160206040518083038186803b1580156130d857600080fd5b505afa1580156130ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131109190615c58565b90506131276001600160a01b038416333085615123565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b15801561316857600080fd5b505afa15801561317c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a09190615c58565b6131aa9190615e3b565b336000908152601460209081526040808320805460ff19166001179055601082528083206001600160a01b03881684529091528120805492945084929091906131f4908490615da0565b90915550506040518281526001600160a01b0384169033907fa7e66869262026842e8d81f5e6806cdc8d846e27c824e2e22f4fe51442771b349060200160405180910390a35050600160005550565b6020546132509042615da0565b3360008181526012602090815260408083206001600160a01b0388168085529083528184209590955592825260088152828220938252929092528120805483929061329c908490615e3b565b90915550503360009081526013602090815260408083206001600160a01b0386168452909152812080548392906132d4908490615da0565b90915550506040518181526001600160a01b0383169033907f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de9060200160405180910390a35050565b6017546001600160a01b03163314613348576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16613381576040516336fe17e760e21b815260040160405180910390fd5b6001600160a01b038116600081815260196020908152604091829020805460ff1916905590519182527f3ed8cbce8cab40e59282f1743e2b607effa08b5cbe0111bb4721134f2f80d0259101611331565b6017546001600160a01b031633146133fd576040516354348f0360e01b815260040160405180910390fd5b601880546001600160a01b0319166001600160a01b0383169081179091556040519081527fe987aaedf9d279143bdf1eee16cf1d0feb47742867d81083df8d6cd0a5ac857f90602001611331565b6001600160a01b03818116600090815260016020526040902054829116331461348757604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff16806134c657506001600160a01b03821660009081526007602052604090205460ff165b156134e45760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b038381166000908152602c602052604090205481169083161461352157604051630ced616b60e21b815260040160405180910390fd5b6001600160a01b038084166000908152602d602090815260408083209386168352929052205461355390603c90615da0565b421015613573576040516356248e9760e01b815260040160405180910390fd5b61357c836150c5565b613585826150c5565b6001600160a01b0383166000908152600c602052604081206135a690615176565b1115613688576001600160a01b0383166000908152600c602052604081206135ce9082615180565b6001600160a01b03808616600090815260096020818152604080842085871680865290835281852054958a16855292825280842092845291905281208054939450919261361c908490615da0565b90915550506001600160a01b0380851660008181526009602090815260408083209486168352938152838220829055918152600c9091522061365e9082615161565b506001600160a01b0383166000908152600c6020526040902061368190826150b0565b5050613585565b6001600160a01b0383166000908152600d602052604081206136a990615176565b111561378b576001600160a01b0383166000908152600d602052604081206136d19082615180565b6001600160a01b03808616600090815260286020818152604080842085871680865290835281852054958a16855292825280842092845291905281208054939450919261371f908490615da0565b90915550506001600160a01b038085166000908152602860209081526040808320858516845282528083208390559286168252600d90522061376190826150b0565b506001600160a01b0384166000908152600d602052604090206137849082615161565b5050613688565b6001600160a01b038084166000908152600b6020526040808220549285168252812080549091906137bd908490615da0565b90915550506001600160a01b038084166000908152600b60209081526040808320839055600a90915280822054928516825281208054909190613801908490615da0565b90915550506001600160a01b0383166000908152600a602090815260408083208390556029909152812055613837601584615161565b506001600160a01b03838116600081815260016020908152604080832080546001600160a01b031990811690915560028352818420805482169055602d8352818420958816808552958352818420849055848452602c835292819020805490931690925590519182527f9b712b63e3fb1325fa042d3c238ce8144937875065900528ea1e4f3b00f379f29101612c24565b6017546001600160a01b031633146138f3576040516354348f0360e01b815260040160405180910390fd5b60238190556040518181527fbdcfd7b8482f31cff6a87c362d9e2e3887f4cdc2018c7c485d8e78a7b2fadb6990602001611331565b6017546001600160a01b03163314613953576040516354348f0360e01b815260040160405180910390fd5b61395e6026826150b0565b61397b5760405163f25e6b9f60e01b815260040160405180910390fd5b806001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139b457600080fd5b505afa1580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec91906159f8565b6001600160a01b038281166000908152600e60205260409081902080546001600160a01b0319169383169384179055601d54905163696a437b60e01b81526004810193909352169063696a437b9060240160206040518083038186803b158015613a5557600080fd5b505afa158015613a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8d9190615be1565b6001600160a01b0382166000908152600f60205260409020805460ff1916911515919091179055613abd8161133c565b6001600160a01b0382166000818152602b60209081526040918290208451815486840151600690810b66ffffffffffffff908116600160381b026001600160701b03199093169390910b169190911717815593820151600190940193909355519081527fabfa8db4d238fa78bf4e15fcc91328dd35f3978f200e2857a56bb719732b7b0b9101611331565b6017546001600160a01b03163314613b73576040516354348f0360e01b815260040160405180910390fd5b601f8190556040518181527fd319ef78d2b690bb773fcccc2d096306bac7c9222dd0bb6b300f461e4a376b4390602001611331565b613bb36015826148d6565b15613bd157604051630809740d60e01b815260040160405180910390fd5b6001600160a01b03811660009081526014602052604090205460ff1615613c0b57604051632f3d320560e01b815260040160405180910390fd5b613c166015826150b0565b506001600160a01b03811660008181526001602052604080822080546001600160a01b03191633908117909155905190917fed3faef50715743626cd57de74281a2b17cdbfc11c0486feda541fb911e0293d91a350565b6017546001600160a01b03163314613c98576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116613cbf5760405163d92e233d60e01b815260040160405180910390fd5b601c80546001600160a01b0319166001600160a01b0383169081179091556040519081527feb931b4b5a98d20a6b1e6693a7c59d8e337a06e2f1473bb776e19251db7ae25090602001611331565b6017546001600160a01b03163314613d38576040516354348f0360e01b815260040160405180910390fd5b62015180811015613d5c57604051633f384aad60e21b815260040160405180910390fd5b60228190556040518181527f54aafa56429e22230b52f1495588ffc632277d74f3a85ec755e13ac50c1584d990602001611331565b60026000541415613db45760405162461bcd60e51b815260040161187090615d69565b600260009081556001600160a01b03858116825260016020526040909120548591163314613df557604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03808616600090815260256020908152604080832093881683529290522054613e2790603c90615da0565b4211613e4657604051631e0b407560e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290522054831115613e8c5760405163024ae82d60e61b815260040160405180910390fd5b6001600160a01b03851660009081526007602052604090205460ff1615613ec65760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290529081208054859290613efd908490615e3b565b90915550613f1790506001600160a01b0385168385615048565b6001600160a01b03808616600090815260096020908152604080832093881683529290522054613f65576001600160a01b0385166000908152600c60205260409020613f639085615161565b505b816001600160a01b0316846001600160a01b0316866001600160a01b03167f53e982dd9ec088d634c74c98fbbc161f808b4b6469a26c657120b9a31cb34bfe86604051613fb491815260200190565b60405180910390a450506001600055505050565b3360008181526007602052604090205460ff1615613ff95760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1615614033576040516362e6201d60e01b815260040160405180910390fd5b61403e6015826148d6565b61405a5760405162941a5760e11b815260040160405180910390fd5b6001600160a01b038082166000908152600960209081526040808320938816835292905220548211156140a05760405163356680b760e01b815260040160405180910390fd5b6001600160a01b038082166000908152600960209081526040808320938816835292905290812080548492906140d7908490615e3b565b909155506140f190506001600160a01b0385168484615048565b826001600160a01b0316816001600160a01b0316856001600160a01b03167f46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfa855a6040805192835260208301919091520160405180910390a450505050565b3360009081526019602052604090205460ff1661418057604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff166141b9576040516310cec38560e21b815260040160405180910390fd5b6141c483838361518c565b60405181815233906001600160a01b038516907f10a73de7ab6e9023aa6e2bc23f7abf4dcef591487e7e55f44c00e34fe60d56db90602001612871565b6017546001600160a01b0316331461422c576040516354348f0360e01b815260040160405180910390fd5b60218190556040518181527f24d51b415694a791b1c77df7817c075ac82b83ce611bcd8627d2e66cf37aa3e790602001611331565b6017546001600160a01b0316331461428c576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166142b35760405163d92e233d60e01b815260040160405180910390fd5b601b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d1a3e7caf0717056e48dc8aefa54d806c7af86324fece4e5d49f8e1f01f84bf90602001611331565b6017546001600160a01b0316331461432c576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1661436557604051633ca0d42760e11b815260040160405180910390fd5b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916905590519182527f5e8bd21d0a98cb2caf33706e56139ff40ffbdca7ec5d9d412a0a2292496dc70e9101611331565b3360009081526019602052604090205460ff166143e657604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1661441f576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b0383166000908152600c6020526040902061444190836148d6565b61445e57604051632eda7a1160e01b815260040160405180910390fd5b6001600160a01b038084166000908152600960209081526040808320938616835292905220548111156144a35760405162919bed60e01b815260040160405180910390fd5b60175460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156144f157600080fd5b505af1925050508015614521575060408051601f3d908101601f1916820190925261451e91810190615be1565b60015b61452a5761452c565b505b6001600160a01b03808416600090815260096020908152604080832093861683529290529081208054839290614563908490615e3b565b90915550506001600160a01b038084166000908152600960209081526040808320938616835292905220546145b6576001600160a01b0383166000908152600c602052604090206145b49083615161565b505b604080516001600160a01b038481168252602082018490523392908616917f20262b97130b5cb8f80624eed2733df2b05db4a0789b4a3d0157e1d3183331049101612871565b336000908152601a602052604090205460ff1661462c57604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff1615614666576040516304ee891b60e11b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055513392917f070125a1c0f5202217aae14ec399abfaaa13c2fd98a91d43bd3a897dd4751e8091a350565b60005a602e556146c56003876148d6565b80156146f657506001600160a01b038087166000908152600860209081526040808320938916835292905220548411155b801561471a57506001600160a01b0386166000908152600560205260409020548311155b801561474957506001600160a01b03861660009081526006602052604090205482906147469042615e3b565b10155b15614785577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb5a60405190815260200160405180910390a15060015b95945050505050565b6017546001600160a01b031633146147b9576040516354348f0360e01b815260040160405180910390fd5b6147c46015836148d6565b6147e157604051636211d34960e01b815260040160405180910390fd5b6147ea826150c5565b6001600160a01b0382166000908152600a602052604081208054839290614812908490615da0565b90915550506001600160a01b038216600081815260296020908152604080832054600a909252918290205491517f5abcf5031fdbd3badb9d1e09094208de329aee72730e87650f346584205d23d192614872928252602082015260400190565b60405180910390a25050565b60006022548261488e9190615e99565b610ee19083615e3b565b600060225483101561272c576022546148b18385615dcc565b6148bb9190615db8565b9050610ee1565b606060006148cf83615292565b9392505050565b6001600160a01b038116600090815260018301602052604081205415156148cf565b6000610ee1826022546023546152ee565b6002600054141561492c5760405162461bcd60e51b815260040161187090615d69565b600260009081556001600160a01b0384168152600d6020526040902061495290836148d6565b61496e576040516241cfa560e21b815260040160405180910390fd5b6001600160a01b038084166000908152602860209081526040808320938616835292905220548111156149b45760405163435b562560e01b815260040160405180910390fd5b6149bd8361539c565b60006149cc610ed18385614b17565b6001600160a01b0385166000908152600b602052604090205490915015614a82576001600160a01b0384166000908152600b6020908152604080832054600a90925290912054614a1d908390615dcc565b614a279190615db8565b6001600160a01b0385166000908152600a602052604081208054909190614a4f908490615e3b565b90915550506001600160a01b0384166000908152600b602052604081208054839290614a7c908490615e3b565b90915550505b6001600160a01b03808516600090815260286020908152604080832093871683529290529081208054849290614ab9908490615e3b565b90915550506001600160a01b03808516600090815260286020908152604080832093871683529290522054614b0c576001600160a01b0384166000908152600d60205260409020614b0a9084615161565b505b505060016000555050565b6001600160a01b0381166000908152602b602052604081206001015415610ee1576001600160a01b0382166000908152600f602052604081205460ff16614b89576001600160a01b0383166000908152602b6020526040902054614b8490600160381b900460060b615ead565b614bad565b6001600160a01b0383166000908152602b6020526040902054600160381b900460060b5b601d5460225460405163a0d2710760e01b815260048101889052600684900b602482015260448101919091529192506001600160a01b03169063a0d271079060640160206040518083038186803b158015614c0757600080fd5b505afa158015614c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb9190615c58565b6000614c4a4261487e565b6001600160a01b03831660009081526029602052604090205410156116fd57614c7a60225442610cdf9190615e3b565b6001600160a01b03831660009081526029602052604090205411614cf057614ca18261539c565b6001600160a01b0382166000908152600b6020908152604080832054600a90925290912055614ccf4261487e565b6001600160a01b038316600090815260296020526040902055506001919050565b6022546001600160a01b038316600090815260296020526040902054614d169042615e3b565b10614d7257614d248261539c565b6001600160a01b0382166000908152600b6020908152604080832054600a83528184205560225460299092528220805491929091614d63908490615da0565b90915550600191506116fd9050565b614d7b4261487e565b6001600160a01b0383166000908152602a602052604090205410156116fd576001600160a01b0382166000908152600b6020526040902054614dbc8361539c565b6001600160a01b0383166000908152600b6020908152604080832054600a909252909120548291614dec91615dcc565b614df69190615db8565b6001600160a01b0384166000908152600a602052604090205550919050565b6001600160a01b038116600090815260296020526040902054614e5a90614e3c9042615e3b565b6001600160a01b0383166000908152600b6020526040902054614898565b6001600160a01b0382166000908152600a602052604081208054909190614e82908490615da0565b90915550506001600160a01b03166000908152602960205260409020429055565b6001600160a01b0383166000908152600a6020526040902054811115614edc5760405163356680b760e01b815260040160405180910390fd5b6001600160a01b0383166000908152602a60209081526040808320429055600a90915281208054839290614f11908490615e3b565b90915550506001600160a01b038083166000908152600860209081526040808320601b5490941683529290529081208054839290614f50908490615da0565b90915550506001600160a01b03821660009081526005602052604081208054839290614f7d908490615da0565b9091555050505050565b6001600160a01b038216600090815260066020526040902054614fc0576001600160a01b03821660009081526006602052604090204290555b614fcb6003836150b0565b506001600160a01b038281166000908152601060209081526040808320938516835292905290812080549190556150038284836153c1565b816001600160a01b0316836001600160a01b03167f3673530133b6da67e9854f605b0cfa7bb9798cd33c18036dfc10d8da7c4d4a758360405161287191815260200190565b6040516001600160a01b0383166024820152604481018290526150ab90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615476565b505050565b60006148cf836001600160a01b038416615548565b6150ce81614c3f565b506150d881614e15565b6001600160a01b0381166000908152600a6020908152604080832054600b909252909120546151079190615597565b6001600160a01b039091166000908152600a6020526040902055565b6040516001600160a01b038085166024830152831660448201526064810182905261515b9085906323b872dd60e01b90608401615074565b50505050565b60006148cf836001600160a01b0384166155ad565b6000610ee1825490565b60006148cf83836156a0565b601b546001600160a01b0383811691161461525b5760175460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156151ef57600080fd5b505af192505050801561521f575060408051601f3d908101601f1916820190925261521c91810190615be1565b60015b615259573d80801561524d576040519150601f19603f3d011682016040523d82523d6000602084013e615252565b606091505b505061525b565b505b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054839290614f7d908490615e3b565b6060816000018054806020026020016040519081016040528092919081815260200182805480156152e257602002820191906000526020600020905b8154815260200190600101908083116152ce575b50505050509050919050565b600080806000198587098587029250828110838203039150508060001415615328576000841161531d57600080fd5b5082900490506148cf565b80841161533457600080fd5b600084868809600260036001881981018916988990049182028318808302840302808302840302808302840302808302840302808302840302918202909203026000889003889004909101858311909403939093029303949094049190911702949350505050565b6153a5816156ca565b6001600160a01b039091166000908152600b6020526040902055565b6001600160a01b038083166000908152600860209081526040808320938716835292905290812080548392906153f8908490615da0565b9091555050601b546001600160a01b03848116911614156150ab57601b54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b15801561545957600080fd5b505af115801561546d573d6000803e3d6000fd5b50505050505050565b60006154cb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166158ae9092919063ffffffff16565b8051909150156150ab57808060200190518101906154e99190615be1565b6150ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611870565b600081815260018301602052604081205461558f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ee1565b506000610ee1565b60008183106155a657816148cf565b5090919050565b600081815260018301602052604081205480156156965760006155d1600183615e3b565b85549091506000906155e590600190615e3b565b905081811461564a57600086600001828154811061560557615605615f16565b906000526020600020015490508087600001848154811061562857615628615f16565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061565b5761565b615f00565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ee1565b6000915050610ee1565b60008260000182815481106156b7576156b7615f16565b9060005260206000200154905092915050565b60006156d54261487e565b601e546001600160a01b03166000908152602b60205260409020600101541461576c57601e5461570d906001600160a01b031661133c565b601e546001600160a01b03166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b1617919091178155910151600191909101555b60005b6001600160a01b0383166000908152600d6020526040902061579090615176565b81101561272c576001600160a01b0383166000908152600d602052604081206157b99083615180565b90506157c66026826148d6565b1561589b576157d44261487e565b6001600160a01b0382166000908152602b60205260409020600101541461585a576157fe8161133c565b6001600160a01b0382166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b16179190911781559101516001909101555b6001600160a01b0380851660009081526028602090815260408083209385168352929052205461588e90610ed19083614b17565b6158989084615da0565b92505b50806158a681615e7e565b91505061576f565b6060610dbb848460008585843b6159075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611870565b600080866001600160a01b031685876040516159239190615c71565b60006040518083038185875af1925050503d8060008114615960576040519150601f19603f3d011682016040523d82523d6000602084013e615965565b606091505b5091509150615975828286615980565b979650505050505050565b6060831561598f5750816148cf565b82511561599f5782518084602001fd5b8160405162461bcd60e51b81526004016118709190615d36565b805180151581146116fd57600080fd5b8051600681900b81146116fd57600080fd5b6000602082840312156159ed57600080fd5b81356148cf81615f2c565b600060208284031215615a0a57600080fd5b81516148cf81615f2c565b60008060408385031215615a2857600080fd5b8235615a3381615f2c565b91506020830135615a4381615f2c565b809150509250929050565b600080600060608486031215615a6357600080fd5b8335615a6e81615f2c565b92506020840135615a7e81615f2c565b91506040840135615a8e81615f2c565b809150509250925092565b600080600060608486031215615aae57600080fd5b8335615ab981615f2c565b92506020840135615ac981615f2c565b929592945050506040919091013590565b60008060008060808587031215615af057600080fd5b8435615afb81615f2c565b93506020850135615b0b81615f2c565b9250604085013591506060850135615b2281615f2c565b939692955090935050565b600080600080600060a08688031215615b4557600080fd5b8535615b5081615f2c565b94506020860135615b6081615f2c565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215615b9157600080fd5b8235615b9c81615f2c565b946020939093013593505050565b600080600060608486031215615bbf57600080fd5b8335615bca81615f2c565b9250602084013591506040840135615a8e81615f2c565b600060208284031215615bf357600080fd5b6148cf826159b9565b600080600060608486031215615c1157600080fd5b615c1a846159c9565b9250615c28602085016159c9565b9150615c36604085016159b9565b90509250925092565b600060208284031215615c5157600080fd5b5035919050565b600060208284031215615c6a57600080fd5b5051919050565b60008251615c83818460208701615e52565b9190910192915050565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015615cdc57845163ffffffff1683529383019391830191600101615cba565b5090979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015615d2a5783516001600160a01b031683529284019291840191600101615d05565b50909695505050505050565b6020815260008251806020840152615d55816040850160208701615e52565b601f01601f19169190910160400192915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115615db357615db3615ed4565b500190565b600082615dc757615dc7615eea565b500490565b6000816000190483118215151615615de657615de6615ed4565b500290565b60008160060b8360060b6000811281667fffffffffffff1901831281151615615e1657615e16615ed4565b81667fffffffffffff018313811615615e3157615e31615ed4565b5090039392505050565b600082821015615e4d57615e4d615ed4565b500390565b60005b83811015615e6d578181015183820152602001615e55565b8381111561515b5750506000910152565b6000600019821415615e9257615e92615ed4565b5060010190565b600082615ea857615ea8615eea565b500690565b60008160060b667fffffffffffff19811415615ecb57615ecb615ed4565b60000392915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146117c157600080fdfeee3f0daba9837d1ab0597acf34328550e4832d02e24e467825e7c2dd318c3820a2646970667358221220f051227421825cb0e85255b2df9c3a0fde65e3a21c5dd4cd28b5d291ddc206b164736f6c63430008070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106104cd5760003560e01c806390a4684e11610283578063c7ae40d01161015c578063ec342ad0116100ce578063f25e311b11610092578063f25e311b14610c56578063f39c38a014610c69578063f75f9f7b14610c7c578063f9d46cf214610c8f578063fc253d2b14610ca2578063fe75bc4614610cab57600080fd5b8063ec342ad014610bde578063ec8ca64314610be7578063f0f346b914610c10578063f11a1d1a14610c23578063f136a09d14610c3657600080fd5b8063dd2080d611610120578063dd2080d614610b69578063ddca3f4314610b7c578063e326ac4314610b85578063e74f823914610ba5578063ebbb619414610bb8578063ec00cdfc14610bcb57600080fd5b8063c7ae40d014610af2578063cb4be2bb14610b05578063cb54694d14610b18578063cd22af1b14610b2b578063d55995fe14610b5657600080fd5b8063a7d2e784116101f5578063b2392233116101b9578063b239223314610a58578063b440027f14610a6b578063b600702a14610a96578063b7e7734014610aa9578063b87fcbff14610abc578063c5198abc14610adf57600080fd5b8063a7d2e784146109f3578063aac6aa9c146109fc578063ab033ea914610a0f578063af320e8114610a22578063b0103b1a14610a3557600080fd5b8063a214580911610247578063a214580914610954578063a39744b514610967578063a515366a14610992578063a5d059ca146109a5578063a676f9ff146109b8578063a734f06e146109d857600080fd5b806390a4684e146108ea578063951dc22c146108fd578063966abd001461090557806398e90a0f146109185780639d5c33d81461094157600080fd5b8063594a3a93116103b55780636cf262bc116103275780637b40c913116102eb5780637b40c9131461085d5780637c8fce2314610870578063878c723e146108785780638bb6dfa8146108a15780638cb22b76146108b45780638fe204dd146108d757600080fd5b80636cf262bc146108085780636e2a9ca61461081b57806372da828a1461082e57806374a8f10314610841578063768b5d901461085457600080fd5b8063633fb68f11610379578063633fb68f1461078857806364bb43ee1461079157806368a9f19c146107a4578063694798e6146107b757806369fe0e2d146107e25780636ba42aaa146107f557600080fd5b8063594a3a931461073357806359a2255e146107465780635aa6e675146107595780635ebe23f01461076c5780635feeb7941461077557600080fd5b80631b44555e1161044e578063274a8db411610412578063274a8db4146106aa578063461411bc146106dd57806351cff8d9146106e757806352a4de29146106fa57806355ea6c471461070d578063575288bf1461072057600080fd5b80631b44555e146106195780631c5a9d9c146106395780631ef94b911461064c57806321040b0114610677578063238efcbc146106a257600080fd5b806311466d721161049557806311466d721461056057806315006b8214610573578063160e1e311461059e578063165e62e7146105b1578063168f92e7146105ee57600080fd5b8063034d4c61146104d257806307b435c2146104f85780630c620bce146105235780630d6a1f87146105385780631101eb411461054b575b600080fd5b6104e56104e03660046159db565b610cbe565b6040519081526020015b60405180910390f35b6104e5610506366004615a15565b601260209081526000928352604080842090915290825290205481565b61052b610dc3565b6040516104ef9190615ce9565b6104e5610546366004615b7e565b610dd4565b61055e610559366004615a99565b610ee7565b005b61055e61056e366004615b7e565b611041565b6104e5610581366004615a15565b601060209081526000928352604080842090915290825290205481565b61055e6105ac3660046159db565b6111df565b6105c46105bf3660046159db565b61133c565b604080518251600690810b825260208085015190910b9082015291810151908201526060016104ef565b6104e56105fc366004615a15565b600960209081526000928352604080842090915290825290205481565b6104e56106273660046159db565b60056020526000908152604090205481565b61055e6106473660046159db565b611702565b601b5461065f906001600160a01b031681565b6040516001600160a01b0390911681526020016104ef565b6104e5610685366004615a15565b601360209081526000928352604080842090915290825290205481565b61055e6117c4565b6106cd6106b83660046159db565b601a6020526000908152604090205460ff1681565b60405190151581526020016104ef565b6104e56201518081565b61055e6106f53660046159db565b61184d565b61055e610708366004615a99565b611a3f565b61055e61071b3660046159db565b611c72565b61055e61072e366004615a99565b611d26565b61055e610741366004615a15565b611fe1565b61055e6107543660046159db565b612086565b60175461065f906001600160a01b031681565b6104e5601f5481565b61055e6107833660046159db565b612138565b6104e560215481565b61055e61079f3660046159db565b6123f4565b61055e6107b23660046159db565b612480565b6104e56107c5366004615a15565b602860209081526000928352604080842090915290825290205481565b61055e6107f0366004615c3f565b612539565b6106cd6108033660046159db565b612599565b6104e56108163660046159db565b6125ea565b61055e610829366004615a99565b612732565b61055e61083c3660046159db565b61287e565b61055e61084f3660046159db565b61291e565b6104e560225481565b601e5461065f906001600160a01b031681565b61052b612a05565b61065f6108863660046159db565b6001602052600090815260409020546001600160a01b031681565b6104e56108af3660046159db565b612a11565b6106cd6108c23660046159db565b60146020526000908152604090205460ff1681565b61055e6108e5366004615c3f565b612ae9565b61055e6108f8366004615a15565b612b47565b61052b612c31565b61055e610913366004615baa565b612c3d565b61065f6109263660046159db565b6002602052600090815260409020546001600160a01b031681565b61055e61094f3660046159db565b612d53565b61055e610962366004615a4e565b612e0c565b6104e5610975366004615a15565b600860209081526000928352604080842090915290825290205481565b61055e6109a0366004615b7e565b612fec565b61055e6109b3366004615b7e565b613243565b6104e56109c63660046159db565b60296020526000908152604090205481565b61065f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6104e560205481565b61055e610a0a3660046159db565b61331d565b61055e610a1d3660046159db565b6133d2565b61055e610a30366004615a15565b61344b565b6106cd610a433660046159db565b60076020526000908152604090205460ff1681565b61055e610a66366004615c3f565b6138c8565b6104e5610a79366004615a15565b602560209081526000928352604080842090915290825290205481565b61055e610aa43660046159db565b613928565b61055e610ab7366004615c3f565b613b48565b6106cd610aca3660046159db565b60196020526000908152604090205460ff1681565b61055e610aed3660046159db565b613ba8565b601c5461065f906001600160a01b031681565b61055e610b133660046159db565b613c6d565b61055e610b26366004615c3f565b613d0d565b6104e5610b39366004615a15565b601160209081526000928352604080842090915290825290205481565b61055e610b64366004615ada565b613d91565b61055e610b77366004615a99565b613fc8565b6104e560245481565b6104e5610b933660046159db565b60066020526000908152604090205481565b61055e610bb3366004615a99565b614150565b61055e610bc6366004615c3f565b614201565b61055e610bd93660046159db565b614261565b6104e561271081565b61065f610bf53660046159db565b602c602052600090815260409020546001600160a01b031681565b61055e610c1e3660046159db565b614301565b601d5461065f906001600160a01b031681565b6104e5610c443660046159db565b602a6020526000908152604090205481565b61055e610c64366004615a99565b6143b6565b60185461065f906001600160a01b031681565b61055e610c8a3660046159db565b6145fc565b6106cd610c9d366004615b2d565b6146b4565b6104e560235481565b61055e610cb9366004615b7e565b61478e565b600080610cca836125ea565b90506000610ce460225442610cdf9190615e3b565b61487e565b6001600160a01b0385166000908152602960205260409020541115610d88576022546001600160a01b038516600090815260296020526040902054610d299042615e3b565b10610d65576022546001600160a01b038516600090815260296020526040902054610d549190615da0565b610d5e9042615e3b565b9050610d9e565b6001600160a01b038416600090815260296020526040902054610d5e9042615e3b565b610d914261487e565b610d9b9042615e3b565b90505b610da88183614898565b610db185612a11565b610dbb9190615da0565b949350505050565b6060610dcf60266148c2565b905090565b6000610de16026846148d6565b15610ee1576000610df18461133c565b90508060400151600014610edf576001600160a01b0384166000908152600f602052604081205460ff16610e32578160200151610e2d90615ead565b610e38565b81602001515b601d5460225460405163a0d2710760e01b815260048101889052600684900b60248201526044810191909152919250610ed6916001600160a01b039091169063a0d27107906064015b60206040518083038186803b158015610e9957600080fd5b505afa158015610ead573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed19190615c58565b6148f8565b92505050610ee1565b505b92915050565b6001600160a01b038381166000908152600160205260409020548491163314610f2357604051636efb4f4160e11b815260040160405180910390fd5b602054610f309042615da0565b6001600160a01b03808616600081815260126020908152604080832094891680845294825280832095909555918152601382528381209281529190529081208054849290610f7f908490615da0565b90915550610f909050848484614909565b6001600160a01b038085166000908152602860209081526040808320938716835292905220548015801590610fcf5750602154610fcd8286614b17565b105b15610fed57604051636f447fcd60e11b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03167f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de8560405161103291815260200190565b60405180910390a35050505050565b3360008181526007602052604090205460ff16156110725760405163ad2fdf3b60e01b815260040160405180910390fd5b61107d6015826148d6565b6110995760405162941a5760e11b815260040160405180910390fd5b6110a281614c3f565b156110ff576001600160a01b038116600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b6001600160a01b0381166000908152600a60205260409020548211156111805761112881614e15565b6001600160a01b038116600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b61118b818484614ea3565b601b546001600160a01b038085169183821691167f46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfa855a6040805192835260208301919091520160405180910390a4505050565b6017546001600160a01b0316331461120a576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166112315760405163d92e233d60e01b815260040160405180910390fd5b601e80546001600160a01b038381166001600160a01b031992831681179093556000838152600e60205260409081902080549093168417909255601d54915163696a437b60e01b81526004810193909352169063696a437b9060240160206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190615be1565b6001600160a01b0382166000818152600f6020908152604091829020805460ff191694151594909417909355519081527f9bb1515b0fc2645a3f011162460a22fdd512e0bca265e7dc9ba6bceae8930afa91015b60405180910390a150565b60408051606081018252600080825260208201819052918101919091526113624261487e565b6001600160a01b0383166000908152602b602052604090206001015414156113d857506001600160a01b03166000908152602b602090815260409182902082516060810184528154600681810b810b810b8352600160381b909104810b810b900b92810192909252600101549181019190915290565b6000806113ec60225442610cdf9190615e3b565b6001600160a01b0385166000908152602b602052604090206001015490915081141561155057604080516001808252818301909252600091602080830190803683375050506001600160a01b0386166000908152602b602052604090205490915060060b6114594261487e565b6114639042615e3b565b8260008151811061147657611476615f16565b63ffffffff909216602092830291909101820152601d546001600160a01b038881166000908152600e90935260409283902054925163dc686d9160e01b81529181169263dc686d91926114d29291909116908690600401615c8d565b60606040518083038186803b1580156114ea57600080fd5b505afa1580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115229190615bfc565b600692830b90920b80885291955061153c91839150615deb565b600690810b900b6020860152506116d99050565b6001600160a01b0384166000908152602b60205260409020600101548111156116d95760408051600280825260608201835260009260208301908036833701905050905061159d4261487e565b6115a79042615e3b565b816000815181106115ba576115ba615f16565b602002602001019063ffffffff16908163ffffffff16815250506022546115e04261487e565b6115ea9042615e3b565b6115f49190615da0565b8160018151811061160757611607615f16565b63ffffffff909216602092830291909101820152601d546001600160a01b038781166000908152600e909352604080842054905163dc686d9160e01b81529282169263dc686d919261165f9216908690600401615c8d565b60606040518083038186803b15801561167757600080fd5b505afa15801561168b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116af9190615bfc565b600692830b90920b80885291955091506116ca908290615deb565b600690810b900b602086015250505b81156116f2576116e84261487e565b60408401526116fa565b600060408401525b50505b919050565b3360009081526007602052604090205460ff1615611733576040516362e6201d60e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b038516845290915290205461177457604051636258f48160e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b038516845290915290205442116117b757604051630fd0eeef60e11b815260040160405180910390fd5b6117c13382614f87565b50565b6018546001600160a01b031633146117ef57604051637ef5703160e11b815260040160405180910390fd5b60188054601780546001600160a01b0383166001600160a01b031991821681179092559091169091556040519081527fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b69060200160405180910390a1565b600260005414156118795760405162461bcd60e51b815260040161187090615d69565b60405180910390fd5b600260009081553381526012602090815260408083206001600160a01b03851684529091529020546118be5760405163184c088160e21b815260040160405180910390fd5b3360009081526012602090815260408083206001600160a01b03851684529091529020544211611901576040516327cfdcb760e01b815260040160405180910390fd5b3360009081526007602052604090205460ff1615611932576040516362e6201d60e01b815260040160405180910390fd5b3360009081526013602090815260408083206001600160a01b0385811680865291909352922054601b549092911614156119c557601c5460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401600060405180830381600087803b1580156119ac57600080fd5b505af11580156119c0573d6000803e3d6000fd5b505050505b3360008181526013602090815260408083206001600160a01b03871680855292528220919091556119f69183615048565b6040518181526001600160a01b0383169033907f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63989060200160405180910390a350506001600055565b60026000541415611a625760405162461bcd60e51b815260040161187090615d69565b6002600055611a726026836148d6565b611a8f5760405163e0b6aead60e01b815260040160405180910390fd5b611a9a6015846148d6565b611ab757604051636211d34960e01b815260040160405180910390fd5b6001600160a01b0383166000908152600d60205260409020611ad990836150b0565b50611ae3836150c5565b6021546001600160a01b03808516600090815260286020908152604080832093871683529290522054611b2190611b1b908490615da0565b84614b17565b1015611b4057604051636f447fcd60e11b815260040160405180910390fd5b6001600160a01b038316600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a2611bac6001600160a01b038316333084615123565b6001600160a01b03808416600090815260286020908152604080832093861683529290529081208054839290611be3908490615da0565b90915550611bf69050610ed18284614b17565b6001600160a01b0384166000908152600b602052604081208054909190611c1e908490615da0565b909155505060405181815233906001600160a01b0384811691908616907f4e186bc75a2220191b826baff3ee63c3e970e94e58a9007ff94c9a7b8e6ebb3f9060200160405180910390a45050600160005550565b336000908152601a602052604090205460ff16611ca257604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16611cdb576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19169055513392917fe02b2375d8fb4aef3e5bc5d53bffcf70b6f185c5c93e69dcbe8b6cfc58e837e291a350565b60026000541415611d495760405162461bcd60e51b815260040161187090615d69565b6002600055611d596015846148d6565b611d7657604051636211d34960e01b815260040160405180910390fd5b601b546001600160a01b0383811691161415611da45760405162822d9760e71b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1e9190615c58565b9050611e356001600160a01b038416333085615123565b6040516370a0823160e01b815230600482015260009082906001600160a01b038616906370a082319060240160206040518083038186803b158015611e7957600080fd5b505afa158015611e8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb19190615c58565b611ebb9190615e3b565b9050600061271060245483611ed09190615dcc565b611eda9190615db8565b9050611ee68183615e3b565b6001600160a01b038088166000908152600960209081526040808320938a1683529290529081208054909190611f1d908490615da0565b90915550506001600160a01b0380871660009081526025602090815260408083208985168085529252909120429055601754611f5a921683615048565b6001600160a01b0386166000908152600c60205260409020611f7c90866150b0565b50336001600160a01b0316856001600160a01b0316876001600160a01b03167fec1a37d4a331a5059081e0fb5da1735e7890900cd215a4fb1e9f2779fd7b83eb85604051611fcc91815260200190565b60405180910390a45050600160005550505050565b6001600160a01b03828116600090815260016020526040902054839116331461201d57604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03838116600081815260026020908152604080832080546001600160a01b031916888716908117909155600190925280832054905191941692917fa8bad3f0b781e1d954af9945167d5f80bfe5e57930f17c93843187c77557a6b891a4505050565b6001600160a01b0381811660009081526002602052604090205482911633146120c25760405163cfe9663360e01b815260040160405180910390fd5b6001600160a01b03828116600081815260016020908152604080832080546002909352818420805487166001600160a01b031980861691909117909255805490911690555193169283929133917fcf30c54296d5eee76168b564c59c50578d49c271733a470f32707c8cfbc88a8b9190a4505050565b3360008181526007602052604090205460ff16156121695760405163ad2fdf3b60e01b815260040160405180910390fd5b6121746015826148d6565b6121905760405162941a5760e11b815260040160405180910390fd5b61219981614c3f565b156121f6576001600160a01b038116600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b60005a601d546001600160a01b038581166000908152600860209081526040808320601b548516845290915280822054905163516c332360e01b815260048101919091529394509291169063516c33239060240160206040518083038186803b15801561226257600080fd5b505afa158015612276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229a9190615c58565b90506000612710826122c485602e546122b39190615e3b565b601e546001600160a01b0316614b17565b6122ce9190615dcc565b6122d89190615db8565b6001600160a01b0385166000908152600a602052604090205490915081111561235c5761230484614e15565b6001600160a01b038416600081815260296020908152604080832054600a835281842054600b84529382902054825191825292810193909352820152600080516020615f428339815191529060600160405180910390a25b60005a602e5461236c9190615e3b565b905083602e5461237c9190615e3b565b6123868383615dcc565b6123909190615db8565b915061239d858784614ea3565b601b546001600160a01b038088169187821691167f46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfa855a6040805192835260208301919091520160405180910390a4505050505050565b6017546001600160a01b0316331461241f576040516354348f0360e01b815260040160405180910390fd5b61242a602682615161565b61244757604051630a8d08b160e01b815260040160405180910390fd5b6040516001600160a01b03821681527f51199d699bdfd516fa88dd0d2f8487c40c147b4867acaa23adc8d4df6b098e5690602001611331565b6017546001600160a01b031633146124ab576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16156124e55760405163546da66560e11b815260040160405180910390fd5b6001600160a01b038116600081815260196020908152604091829020805460ff1916600117905590519182527f049ccb28ab796d3225573a065712f6e7754487ced56056cda8889c337511807b9101611331565b6017546001600160a01b03163314612564576040516354348f0360e01b815260040160405180910390fd5b60248190556040518181527f4c10ca068ff7002cf5da78f2f697d1e91f6f0ac27f7344b28e8ef25263f87e5d90602001611331565b60005a602e556125aa6003836148d6565b156116fd577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb5a60405190815260200160405180910390a1506001919050565b6000805b6001600160a01b0383166000908152600d6020526040902061260f90615176565b81101561272c576001600160a01b0383166000908152600d602052604081206126389083615180565b90506126456026826148d6565b156127195760006126558261133c565b90508060400151600014612717576001600160a01b0382166000908152600f602052604081205460ff1661269657816020015161269190615ead565b61269c565b81602001515b601d546001600160a01b03888116600090815260286020908152604080832089851684529091529081902054602254915163a0d2710760e01b81526004810191909152600685900b602482015260448101919091529293506127099291169063a0d2710790606401610e81565b6127139086615da0565b9450505b505b508061272481615e7e565b9150506125ee565b50919050565b3360009081526019602052604090205460ff1661276257604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1661279b576040516310cec38560e21b815260040160405180910390fd5b6127a6838383614909565b60175460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156127f457600080fd5b505af1925050508015612824575060408051601f3d908101601f1916820190925261282191810190615be1565b60015b61282d5761282f565b505b604080516001600160a01b038481168252602082018490523392908616917f6e10247c3c094d220ee99436c164b7f38d63b335a20ed817cbefaee4bb02d20e91015b60405180910390a3505050565b6017546001600160a01b031633146128a9576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166128d05760405163d92e233d60e01b815260040160405180910390fd5b601d80546001600160a01b0319166001600160a01b0383169081179091556040519081527f71973fd672e51deb8f739b1f7e1eab991936645acd6f83e2bde6eeeaff5490b090602001611331565b3360009081526019602052604090205460ff1661294e57604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16612987576040516310cec38560e21b815260040160405180910390fd5b612992600382615161565b50601b546001600160a01b0380831660009081526008602090815260408083209390941680835292905291909120546129cc91839161518c565b60405133906001600160a01b038316907f038a17b9b553c0c3fc2ed14b957a5d8420a1666fd2efe5c1b3fe5f23eea61bb390600090a350565b6060610dcf60156148c2565b600080612a1d836125ea565b9050612a3060225442610cdf9190615e3b565b6001600160a01b0384166000908152602960205260409020541115610ee1576022546001600160a01b038416600090815260296020526040902054612a759042615e3b565b10612a825780915061272c565b60008111612aa8576001600160a01b0383166000908152600a6020526040902054612ae2565b6001600160a01b0383166000908152600b6020908152604080832054600a90925290912054612ad8908390615dcc565b612ae29190615db8565b915061272c565b6017546001600160a01b03163314612b14576040516354348f0360e01b815260040160405180910390fd5b60208181556040518281527fc8d443472c9783cc36f8f5f5091f08ce9f37fc2f9e6d79cf1d9aaf40a433fee29101611331565b6001600160a01b038281166000908152600160205260409020548391163314612b8357604051636efb4f4160e11b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03161415612bb65760405163afe7ad4960e01b815260040160405180910390fd5b6001600160a01b038381166000818152602c6020908152604080832080546001600160a01b0319169588169586179055602d8252808320858452825291829020429055905192835290917fff0456758201108de53c0ff04c69988d4678ff455b2ce6f733328cf85722c04c91015b60405180910390a2505050565b6060610dcf60036148c2565b6017546001600160a01b03163314612c68576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116612c8f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612cf0576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612cea573d6000803e3d6000fd5b50612d04565b612d046001600160a01b0384168284615048565b604080516001600160a01b0385811682526020820185905283168183015290517f9a3055ded8c8b5f21bbf4946c5afab6e1fa8b3f057922658e5e1ade125fb0b1e9181900360600190a1505050565b6017546001600160a01b03163314612d7e576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1615612db85760405163274e25dd60e11b815260040160405180910390fd5b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916600117905590519182527f8addc69f897ecca0e41d70ed4ff9d75a9148a615a0fbda8597e53aea2684302f9101611331565b6001600160a01b038381166000908152600160205260409020548491163314612e4857604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b038216612e6f5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516600090815260126020908152604080832093871683529290522054612eb25760405163184c088160e21b815260040160405180910390fd5b6001600160a01b038085166000908152601260209081526040808320938716835292905220544211612ef7576040516327cfdcb760e01b815260040160405180910390fd5b6001600160a01b03841660009081526007602052604090205460ff1615612f31576040516362e6201d60e01b815260040160405180910390fd5b6001600160a01b0380851660009081526013602090815260408083209387168084529390915290205490612f66908483615048565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffdb7893bf11f50c621e59cc7f1cf540e94295cb27ca869ec7ed7618ca792886284604051612fb591815260200190565b60405180910390a45050506001600160a01b0391821660009081526013602090815260408083209390941682529190915290812055565b6002600054141561300f5760405162461bcd60e51b815260040161187090615d69565b600260009081553381526007602052604090205460ff1615613044576040516362e6201d60e01b815260040160405180910390fd5b61304f6015336148d6565b1561306d5760405163d7229c4360e01b815260040160405180910390fd5b601f5461307a9042615da0565b3360009081526011602090815260408083206001600160a01b03871680855292528083209390935591516370a0823160e01b81523060048201529091906370a082319060240160206040518083038186803b1580156130d857600080fd5b505afa1580156130ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131109190615c58565b90506131276001600160a01b038416333085615123565b6040516370a0823160e01b815230600482015281906001600160a01b038516906370a082319060240160206040518083038186803b15801561316857600080fd5b505afa15801561317c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a09190615c58565b6131aa9190615e3b565b336000908152601460209081526040808320805460ff19166001179055601082528083206001600160a01b03881684529091528120805492945084929091906131f4908490615da0565b90915550506040518281526001600160a01b0384169033907fa7e66869262026842e8d81f5e6806cdc8d846e27c824e2e22f4fe51442771b349060200160405180910390a35050600160005550565b6020546132509042615da0565b3360008181526012602090815260408083206001600160a01b0388168085529083528184209590955592825260088152828220938252929092528120805483929061329c908490615e3b565b90915550503360009081526013602090815260408083206001600160a01b0386168452909152812080548392906132d4908490615da0565b90915550506040518181526001600160a01b0383169033907f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de9060200160405180910390a35050565b6017546001600160a01b03163314613348576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16613381576040516336fe17e760e21b815260040160405180910390fd5b6001600160a01b038116600081815260196020908152604091829020805460ff1916905590519182527f3ed8cbce8cab40e59282f1743e2b607effa08b5cbe0111bb4721134f2f80d0259101611331565b6017546001600160a01b031633146133fd576040516354348f0360e01b815260040160405180910390fd5b601880546001600160a01b0319166001600160a01b0383169081179091556040519081527fe987aaedf9d279143bdf1eee16cf1d0feb47742867d81083df8d6cd0a5ac857f90602001611331565b6001600160a01b03818116600090815260016020526040902054829116331461348757604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff16806134c657506001600160a01b03821660009081526007602052604090205460ff165b156134e45760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b038381166000908152602c602052604090205481169083161461352157604051630ced616b60e21b815260040160405180910390fd5b6001600160a01b038084166000908152602d602090815260408083209386168352929052205461355390603c90615da0565b421015613573576040516356248e9760e01b815260040160405180910390fd5b61357c836150c5565b613585826150c5565b6001600160a01b0383166000908152600c602052604081206135a690615176565b1115613688576001600160a01b0383166000908152600c602052604081206135ce9082615180565b6001600160a01b03808616600090815260096020818152604080842085871680865290835281852054958a16855292825280842092845291905281208054939450919261361c908490615da0565b90915550506001600160a01b0380851660008181526009602090815260408083209486168352938152838220829055918152600c9091522061365e9082615161565b506001600160a01b0383166000908152600c6020526040902061368190826150b0565b5050613585565b6001600160a01b0383166000908152600d602052604081206136a990615176565b111561378b576001600160a01b0383166000908152600d602052604081206136d19082615180565b6001600160a01b03808616600090815260286020818152604080842085871680865290835281852054958a16855292825280842092845291905281208054939450919261371f908490615da0565b90915550506001600160a01b038085166000908152602860209081526040808320858516845282528083208390559286168252600d90522061376190826150b0565b506001600160a01b0384166000908152600d602052604090206137849082615161565b5050613688565b6001600160a01b038084166000908152600b6020526040808220549285168252812080549091906137bd908490615da0565b90915550506001600160a01b038084166000908152600b60209081526040808320839055600a90915280822054928516825281208054909190613801908490615da0565b90915550506001600160a01b0383166000908152600a602090815260408083208390556029909152812055613837601584615161565b506001600160a01b03838116600081815260016020908152604080832080546001600160a01b031990811690915560028352818420805482169055602d8352818420958816808552958352818420849055848452602c835292819020805490931690925590519182527f9b712b63e3fb1325fa042d3c238ce8144937875065900528ea1e4f3b00f379f29101612c24565b6017546001600160a01b031633146138f3576040516354348f0360e01b815260040160405180910390fd5b60238190556040518181527fbdcfd7b8482f31cff6a87c362d9e2e3887f4cdc2018c7c485d8e78a7b2fadb6990602001611331565b6017546001600160a01b03163314613953576040516354348f0360e01b815260040160405180910390fd5b61395e6026826150b0565b61397b5760405163f25e6b9f60e01b815260040160405180910390fd5b806001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156139b457600080fd5b505afa1580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec91906159f8565b6001600160a01b038281166000908152600e60205260409081902080546001600160a01b0319169383169384179055601d54905163696a437b60e01b81526004810193909352169063696a437b9060240160206040518083038186803b158015613a5557600080fd5b505afa158015613a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8d9190615be1565b6001600160a01b0382166000908152600f60205260409020805460ff1916911515919091179055613abd8161133c565b6001600160a01b0382166000818152602b60209081526040918290208451815486840151600690810b66ffffffffffffff908116600160381b026001600160701b03199093169390910b169190911717815593820151600190940193909355519081527fabfa8db4d238fa78bf4e15fcc91328dd35f3978f200e2857a56bb719732b7b0b9101611331565b6017546001600160a01b03163314613b73576040516354348f0360e01b815260040160405180910390fd5b601f8190556040518181527fd319ef78d2b690bb773fcccc2d096306bac7c9222dd0bb6b300f461e4a376b4390602001611331565b613bb36015826148d6565b15613bd157604051630809740d60e01b815260040160405180910390fd5b6001600160a01b03811660009081526014602052604090205460ff1615613c0b57604051632f3d320560e01b815260040160405180910390fd5b613c166015826150b0565b506001600160a01b03811660008181526001602052604080822080546001600160a01b03191633908117909155905190917fed3faef50715743626cd57de74281a2b17cdbfc11c0486feda541fb911e0293d91a350565b6017546001600160a01b03163314613c98576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116613cbf5760405163d92e233d60e01b815260040160405180910390fd5b601c80546001600160a01b0319166001600160a01b0383169081179091556040519081527feb931b4b5a98d20a6b1e6693a7c59d8e337a06e2f1473bb776e19251db7ae25090602001611331565b6017546001600160a01b03163314613d38576040516354348f0360e01b815260040160405180910390fd5b62015180811015613d5c57604051633f384aad60e21b815260040160405180910390fd5b60228190556040518181527f54aafa56429e22230b52f1495588ffc632277d74f3a85ec755e13ac50c1584d990602001611331565b60026000541415613db45760405162461bcd60e51b815260040161187090615d69565b600260009081556001600160a01b03858116825260016020526040909120548591163314613df557604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03808616600090815260256020908152604080832093881683529290522054613e2790603c90615da0565b4211613e4657604051631e0b407560e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290522054831115613e8c5760405163024ae82d60e61b815260040160405180910390fd5b6001600160a01b03851660009081526007602052604090205460ff1615613ec65760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290529081208054859290613efd908490615e3b565b90915550613f1790506001600160a01b0385168385615048565b6001600160a01b03808616600090815260096020908152604080832093881683529290522054613f65576001600160a01b0385166000908152600c60205260409020613f639085615161565b505b816001600160a01b0316846001600160a01b0316866001600160a01b03167f53e982dd9ec088d634c74c98fbbc161f808b4b6469a26c657120b9a31cb34bfe86604051613fb491815260200190565b60405180910390a450506001600055505050565b3360008181526007602052604090205460ff1615613ff95760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1615614033576040516362e6201d60e01b815260040160405180910390fd5b61403e6015826148d6565b61405a5760405162941a5760e11b815260040160405180910390fd5b6001600160a01b038082166000908152600960209081526040808320938816835292905220548211156140a05760405163356680b760e01b815260040160405180910390fd5b6001600160a01b038082166000908152600960209081526040808320938816835292905290812080548492906140d7908490615e3b565b909155506140f190506001600160a01b0385168484615048565b826001600160a01b0316816001600160a01b0316856001600160a01b03167f46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfa855a6040805192835260208301919091520160405180910390a450505050565b3360009081526019602052604090205460ff1661418057604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff166141b9576040516310cec38560e21b815260040160405180910390fd5b6141c483838361518c565b60405181815233906001600160a01b038516907f10a73de7ab6e9023aa6e2bc23f7abf4dcef591487e7e55f44c00e34fe60d56db90602001612871565b6017546001600160a01b0316331461422c576040516354348f0360e01b815260040160405180910390fd5b60218190556040518181527f24d51b415694a791b1c77df7817c075ac82b83ce611bcd8627d2e66cf37aa3e790602001611331565b6017546001600160a01b0316331461428c576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166142b35760405163d92e233d60e01b815260040160405180910390fd5b601b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f1d1a3e7caf0717056e48dc8aefa54d806c7af86324fece4e5d49f8e1f01f84bf90602001611331565b6017546001600160a01b0316331461432c576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1661436557604051633ca0d42760e11b815260040160405180910390fd5b6001600160a01b0381166000818152601a6020908152604091829020805460ff1916905590519182527f5e8bd21d0a98cb2caf33706e56139ff40ffbdca7ec5d9d412a0a2292496dc70e9101611331565b3360009081526019602052604090205460ff166143e657604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1661441f576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b0383166000908152600c6020526040902061444190836148d6565b61445e57604051632eda7a1160e01b815260040160405180910390fd5b6001600160a01b038084166000908152600960209081526040808320938616835292905220548111156144a35760405162919bed60e01b815260040160405180910390fd5b60175460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156144f157600080fd5b505af1925050508015614521575060408051601f3d908101601f1916820190925261451e91810190615be1565b60015b61452a5761452c565b505b6001600160a01b03808416600090815260096020908152604080832093861683529290529081208054839290614563908490615e3b565b90915550506001600160a01b038084166000908152600960209081526040808320938616835292905220546145b6576001600160a01b0383166000908152600c602052604090206145b49083615161565b505b604080516001600160a01b038481168252602082018490523392908616917f20262b97130b5cb8f80624eed2733df2b05db4a0789b4a3d0157e1d3183331049101612871565b336000908152601a602052604090205460ff1661462c57604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff1615614666576040516304ee891b60e11b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055513392917f070125a1c0f5202217aae14ec399abfaaa13c2fd98a91d43bd3a897dd4751e8091a350565b60005a602e556146c56003876148d6565b80156146f657506001600160a01b038087166000908152600860209081526040808320938916835292905220548411155b801561471a57506001600160a01b0386166000908152600560205260409020548311155b801561474957506001600160a01b03861660009081526006602052604090205482906147469042615e3b565b10155b15614785577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb5a60405190815260200160405180910390a15060015b95945050505050565b6017546001600160a01b031633146147b9576040516354348f0360e01b815260040160405180910390fd5b6147c46015836148d6565b6147e157604051636211d34960e01b815260040160405180910390fd5b6147ea826150c5565b6001600160a01b0382166000908152600a602052604081208054839290614812908490615da0565b90915550506001600160a01b038216600081815260296020908152604080832054600a909252918290205491517f5abcf5031fdbd3badb9d1e09094208de329aee72730e87650f346584205d23d192614872928252602082015260400190565b60405180910390a25050565b60006022548261488e9190615e99565b610ee19083615e3b565b600060225483101561272c576022546148b18385615dcc565b6148bb9190615db8565b9050610ee1565b606060006148cf83615292565b9392505050565b6001600160a01b038116600090815260018301602052604081205415156148cf565b6000610ee1826022546023546152ee565b6002600054141561492c5760405162461bcd60e51b815260040161187090615d69565b600260009081556001600160a01b0384168152600d6020526040902061495290836148d6565b61496e576040516241cfa560e21b815260040160405180910390fd5b6001600160a01b038084166000908152602860209081526040808320938616835292905220548111156149b45760405163435b562560e01b815260040160405180910390fd5b6149bd8361539c565b60006149cc610ed18385614b17565b6001600160a01b0385166000908152600b602052604090205490915015614a82576001600160a01b0384166000908152600b6020908152604080832054600a90925290912054614a1d908390615dcc565b614a279190615db8565b6001600160a01b0385166000908152600a602052604081208054909190614a4f908490615e3b565b90915550506001600160a01b0384166000908152600b602052604081208054839290614a7c908490615e3b565b90915550505b6001600160a01b03808516600090815260286020908152604080832093871683529290529081208054849290614ab9908490615e3b565b90915550506001600160a01b03808516600090815260286020908152604080832093871683529290522054614b0c576001600160a01b0384166000908152600d60205260409020614b0a9084615161565b505b505060016000555050565b6001600160a01b0381166000908152602b602052604081206001015415610ee1576001600160a01b0382166000908152600f602052604081205460ff16614b89576001600160a01b0383166000908152602b6020526040902054614b8490600160381b900460060b615ead565b614bad565b6001600160a01b0383166000908152602b6020526040902054600160381b900460060b5b601d5460225460405163a0d2710760e01b815260048101889052600684900b602482015260448101919091529192506001600160a01b03169063a0d271079060640160206040518083038186803b158015614c0757600080fd5b505afa158015614c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbb9190615c58565b6000614c4a4261487e565b6001600160a01b03831660009081526029602052604090205410156116fd57614c7a60225442610cdf9190615e3b565b6001600160a01b03831660009081526029602052604090205411614cf057614ca18261539c565b6001600160a01b0382166000908152600b6020908152604080832054600a90925290912055614ccf4261487e565b6001600160a01b038316600090815260296020526040902055506001919050565b6022546001600160a01b038316600090815260296020526040902054614d169042615e3b565b10614d7257614d248261539c565b6001600160a01b0382166000908152600b6020908152604080832054600a83528184205560225460299092528220805491929091614d63908490615da0565b90915550600191506116fd9050565b614d7b4261487e565b6001600160a01b0383166000908152602a602052604090205410156116fd576001600160a01b0382166000908152600b6020526040902054614dbc8361539c565b6001600160a01b0383166000908152600b6020908152604080832054600a909252909120548291614dec91615dcc565b614df69190615db8565b6001600160a01b0384166000908152600a602052604090205550919050565b6001600160a01b038116600090815260296020526040902054614e5a90614e3c9042615e3b565b6001600160a01b0383166000908152600b6020526040902054614898565b6001600160a01b0382166000908152600a602052604081208054909190614e82908490615da0565b90915550506001600160a01b03166000908152602960205260409020429055565b6001600160a01b0383166000908152600a6020526040902054811115614edc5760405163356680b760e01b815260040160405180910390fd5b6001600160a01b0383166000908152602a60209081526040808320429055600a90915281208054839290614f11908490615e3b565b90915550506001600160a01b038083166000908152600860209081526040808320601b5490941683529290529081208054839290614f50908490615da0565b90915550506001600160a01b03821660009081526005602052604081208054839290614f7d908490615da0565b9091555050505050565b6001600160a01b038216600090815260066020526040902054614fc0576001600160a01b03821660009081526006602052604090204290555b614fcb6003836150b0565b506001600160a01b038281166000908152601060209081526040808320938516835292905290812080549190556150038284836153c1565b816001600160a01b0316836001600160a01b03167f3673530133b6da67e9854f605b0cfa7bb9798cd33c18036dfc10d8da7c4d4a758360405161287191815260200190565b6040516001600160a01b0383166024820152604481018290526150ab90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152615476565b505050565b60006148cf836001600160a01b038416615548565b6150ce81614c3f565b506150d881614e15565b6001600160a01b0381166000908152600a6020908152604080832054600b909252909120546151079190615597565b6001600160a01b039091166000908152600a6020526040902055565b6040516001600160a01b038085166024830152831660448201526064810182905261515b9085906323b872dd60e01b90608401615074565b50505050565b60006148cf836001600160a01b0384166155ad565b6000610ee1825490565b60006148cf83836156a0565b601b546001600160a01b0383811691161461525b5760175460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb90604401602060405180830381600087803b1580156151ef57600080fd5b505af192505050801561521f575060408051601f3d908101601f1916820190925261521c91810190615be1565b60015b615259573d80801561524d576040519150601f19603f3d011682016040523d82523d6000602084013e615252565b606091505b505061525b565b505b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054839290614f7d908490615e3b565b6060816000018054806020026020016040519081016040528092919081815260200182805480156152e257602002820191906000526020600020905b8154815260200190600101908083116152ce575b50505050509050919050565b600080806000198587098587029250828110838203039150508060001415615328576000841161531d57600080fd5b5082900490506148cf565b80841161533457600080fd5b600084868809600260036001881981018916988990049182028318808302840302808302840302808302840302808302840302808302840302918202909203026000889003889004909101858311909403939093029303949094049190911702949350505050565b6153a5816156ca565b6001600160a01b039091166000908152600b6020526040902055565b6001600160a01b038083166000908152600860209081526040808320938716835292905290812080548392906153f8908490615da0565b9091555050601b546001600160a01b03848116911614156150ab57601b54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b15801561545957600080fd5b505af115801561546d573d6000803e3d6000fd5b50505050505050565b60006154cb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166158ae9092919063ffffffff16565b8051909150156150ab57808060200190518101906154e99190615be1565b6150ab5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611870565b600081815260018301602052604081205461558f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610ee1565b506000610ee1565b60008183106155a657816148cf565b5090919050565b600081815260018301602052604081205480156156965760006155d1600183615e3b565b85549091506000906155e590600190615e3b565b905081811461564a57600086600001828154811061560557615605615f16565b906000526020600020015490508087600001848154811061562857615628615f16565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061565b5761565b615f00565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ee1565b6000915050610ee1565b60008260000182815481106156b7576156b7615f16565b9060005260206000200154905092915050565b60006156d54261487e565b601e546001600160a01b03166000908152602b60205260409020600101541461576c57601e5461570d906001600160a01b031661133c565b601e546001600160a01b03166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b1617919091178155910151600191909101555b60005b6001600160a01b0383166000908152600d6020526040902061579090615176565b81101561272c576001600160a01b0383166000908152600d602052604081206157b99083615180565b90506157c66026826148d6565b1561589b576157d44261487e565b6001600160a01b0382166000908152602b60205260409020600101541461585a576157fe8161133c565b6001600160a01b0382166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b16179190911781559101516001909101555b6001600160a01b0380851660009081526028602090815260408083209385168352929052205461588e90610ed19083614b17565b6158989084615da0565b92505b50806158a681615e7e565b91505061576f565b6060610dbb848460008585843b6159075760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611870565b600080866001600160a01b031685876040516159239190615c71565b60006040518083038185875af1925050503d8060008114615960576040519150601f19603f3d011682016040523d82523d6000602084013e615965565b606091505b5091509150615975828286615980565b979650505050505050565b6060831561598f5750816148cf565b82511561599f5782518084602001fd5b8160405162461bcd60e51b81526004016118709190615d36565b805180151581146116fd57600080fd5b8051600681900b81146116fd57600080fd5b6000602082840312156159ed57600080fd5b81356148cf81615f2c565b600060208284031215615a0a57600080fd5b81516148cf81615f2c565b60008060408385031215615a2857600080fd5b8235615a3381615f2c565b91506020830135615a4381615f2c565b809150509250929050565b600080600060608486031215615a6357600080fd5b8335615a6e81615f2c565b92506020840135615a7e81615f2c565b91506040840135615a8e81615f2c565b809150509250925092565b600080600060608486031215615aae57600080fd5b8335615ab981615f2c565b92506020840135615ac981615f2c565b929592945050506040919091013590565b60008060008060808587031215615af057600080fd5b8435615afb81615f2c565b93506020850135615b0b81615f2c565b9250604085013591506060850135615b2281615f2c565b939692955090935050565b600080600080600060a08688031215615b4557600080fd5b8535615b5081615f2c565b94506020860135615b6081615f2c565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215615b9157600080fd5b8235615b9c81615f2c565b946020939093013593505050565b600080600060608486031215615bbf57600080fd5b8335615bca81615f2c565b9250602084013591506040840135615a8e81615f2c565b600060208284031215615bf357600080fd5b6148cf826159b9565b600080600060608486031215615c1157600080fd5b615c1a846159c9565b9250615c28602085016159c9565b9150615c36604085016159b9565b90509250925092565b600060208284031215615c5157600080fd5b5035919050565b600060208284031215615c6a57600080fd5b5051919050565b60008251615c83818460208701615e52565b9190910192915050565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015615cdc57845163ffffffff1683529383019391830191600101615cba565b5090979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015615d2a5783516001600160a01b031683529284019291840191600101615d05565b50909695505050505050565b6020815260008251806020840152615d55816040850160208701615e52565b601f01601f19169190910160400192915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115615db357615db3615ed4565b500190565b600082615dc757615dc7615eea565b500490565b6000816000190483118215151615615de657615de6615ed4565b500290565b60008160060b8360060b6000811281667fffffffffffff1901831281151615615e1657615e16615ed4565b81667fffffffffffff018313811615615e3157615e31615ed4565b5090039392505050565b600082821015615e4d57615e4d615ed4565b500390565b60005b83811015615e6d578181015183820152602001615e55565b8381111561515b5750506000910152565b6000600019821415615e9257615e92615ed4565b5060010190565b600082615ea857615ea8615eea565b500690565b60008160060b667fffffffffffff19811415615ecb57615ecb615ed4565b60000392915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146117c157600080fdfeee3f0daba9837d1ab0597acf34328550e4832d02e24e467825e7c2dd318c3820a2646970667358221220f051227421825cb0e85255b2df9c3a0fde65e3a21c5dd4cd28b5d291ddc206b164736f6c63430008070033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "acceptJobMigration(address,address)": {
        "details": "Unbond/withdraw process doesn't get migrated",
        "params": {
          "_fromJob": "The address of the job that requested to migrate",
          "_toJob": "The address to which the job wants to migrate to"
        }
      },
      "activate(address)": {
        "params": {
          "_bonding": "The asset being activated as bond collateral"
        }
      },
      "addJob(address)": {
        "params": {
          "_job": "Address of the contract for which work should be performed"
        }
      },
      "addLiquidityToJob(address,address,uint256)": {
        "params": {
          "_amount": "The amount of liquidity tokens to add",
          "_job": "The address of the job to assign liquidity to",
          "_liquidity": "The liquidity being added"
        }
      },
      "addTokenCreditsToJob(address,address,uint256)": {
        "params": {
          "_amount": "The amount of credit being added",
          "_job": "The address of the job being credited",
          "_token": "The address of the token being credited"
        }
      },
      "approveLiquidity(address)": {
        "params": {
          "_liquidity": "The address of the liquidity accepted"
        }
      },
      "approvedLiquidities()": {
        "returns": {
          "_list": "An array of addresses with all the approved liquidity pairs"
        }
      },
      "bond(address,uint256)": {
        "params": {
          "_amount": "The amount of bonding asset being bound",
          "_bonding": "The asset being bound"
        }
      },
      "bondedPayment(address,uint256)": {
        "details": "Pays the keeper that performs the work with KP3R",
        "params": {
          "_keeper": "Address of the keeper that performed the work",
          "_payment": "The reward that should be allocated for the job"
        }
      },
      "directTokenPayment(address,address,uint256)": {
        "details": "Pays the keeper that performs the work with a specific token",
        "params": {
          "_amount": "The reward that should be allocated",
          "_keeper": "Address of the keeper that performed the work",
          "_token": "The asset being awarded to the keeper"
        }
      },
      "dispute(address)": {
        "params": {
          "_jobOrKeeper": "The address in dispute"
        }
      },
      "forceLiquidityCreditsToJob(address,uint256)": {
        "params": {
          "_amount": "The amount of liquidity credits to gift",
          "_job": "The address of the job being credited"
        }
      },
      "isBondedKeeper(address,address,uint256,uint256,uint256)": {
        "params": {
          "_age": "The minimum keeper age required",
          "_bond": "The bond token being evaluated",
          "_earned": "The minimum funds earned in the keepers lifetime",
          "_keeper": "The keeper to check",
          "_minBond": "The minimum amount of bonded tokens"
        },
        "returns": {
          "_isBondedKeeper": "Whether the `_keeper` meets the given requirements"
        }
      },
      "isKeeper(address)": {
        "params": {
          "_keeper": "The keeper being investigated"
        },
        "returns": {
          "_isKeeper": "Whether the address passed as a parameter is a keeper or not"
        }
      },
      "jobLiquidityCredits(address)": {
        "params": {
          "_job": "The address of the job of which we want to know the liquidity credits"
        },
        "returns": {
          "_liquidityCredits": "The liquidity credits of a given job"
        }
      },
      "jobPeriodCredits(address)": {
        "params": {
          "_job": "The address of the job of which we want to know the period credits"
        },
        "returns": {
          "_periodCredits": "The credits the given job has at the current period"
        }
      },
      "jobs()": {
        "returns": {
          "_list": "Array with all the jobs in _jobs"
        }
      },
      "keepers()": {
        "returns": {
          "_list": "Array with all the jobs in keepers"
        }
      },
      "migrateJob(address,address)": {
        "params": {
          "_fromJob": "The address of the job that is requesting to migrate",
          "_toJob": "The address at which the job is requesting to migrate"
        }
      },
      "observeLiquidity(address)": {
        "params": {
          "_liquidity": "The liquidity pair being observed"
        },
        "returns": {
          "_tickCache": "The updated TickCache"
        }
      },
      "quoteLiquidity(address,uint256)": {
        "details": "_periodCredits = underlying KP3Rs for given liquidity amount * rewardPeriod / inflationPeriod",
        "params": {
          "_amount": "The amount of liquidity to provide",
          "_liquidity": "The liquidity to provide"
        },
        "returns": {
          "_periodCredits": "The amount of KP3R periodically minted for the given liquidity"
        }
      },
      "resolve(address)": {
        "params": {
          "_jobOrKeeper": "The address cleared"
        }
      },
      "revoke(address)": {
        "params": {
          "_keeper": "The address being slashed"
        }
      },
      "revokeLiquidity(address)": {
        "params": {
          "_liquidity": "The liquidity no longer accepted"
        }
      },
      "sendDust(address,uint256,address)": {
        "params": {
          "_amount": "The amont of the token that will be transferred",
          "_to": "The address that will receive the idle funds",
          "_token": "The token that will be transferred"
        }
      },
      "setBondTime(uint256)": {
        "params": {
          "_bond": "The new bond time"
        }
      },
      "setFee(uint256)": {
        "params": {
          "_fee": "The new fee"
        }
      },
      "setGovernance(address)": {
        "params": {
          "_governance": "The address of the user proposed to be the new governance"
        }
      },
      "setInflationPeriod(uint256)": {
        "params": {
          "_inflationPeriod": "The new inflation period"
        }
      },
      "setKeep3rHelper(address)": {
        "params": {
          "_keep3rHelper": "The Keep3rHelper address"
        }
      },
      "setKeep3rV1(address)": {
        "params": {
          "_keep3rV1": "The Keep3rV1 address"
        }
      },
      "setKeep3rV1Proxy(address)": {
        "params": {
          "_keep3rV1Proxy": "The Keep3rV1Proxy address"
        }
      },
      "setKp3rWethPool(address)": {
        "params": {
          "_kp3rWethPool": "The KP3R-WETH pool address"
        }
      },
      "setLiquidityMinimum(uint256)": {
        "params": {
          "_liquidityMinimum": "The new minimum amount of liquidity"
        }
      },
      "setRewardPeriodTime(uint256)": {
        "params": {
          "_rewardPeriodTime": "The new amount of time required to pass between rewards"
        }
      },
      "setUnbondTime(uint256)": {
        "params": {
          "_unbond": "The new unbond time"
        }
      },
      "slash(address,address,uint256)": {
        "params": {
          "_amount": "The amount being slashed",
          "_bonded": "The asset being slashed",
          "_keeper": "The address being slashed"
        }
      },
      "slashLiquidityFromJob(address,address,uint256)": {
        "params": {
          "_amount": "The amount of liquidity that will be slashed",
          "_job": "The address being slashed",
          "_liquidity": "The address of the liquidity that will be slashed"
        }
      },
      "slashTokenFromJob(address,address,uint256)": {
        "params": {
          "_amount": "The amount of the token that will be slashed",
          "_job": "The address of the job from which the token will be slashed",
          "_token": "The address of the token that will be slashed"
        }
      },
      "totalJobCredits(address)": {
        "params": {
          "_job": "The address of the job of which we want to know the total credits"
        },
        "returns": {
          "_credits": "The total credits of the given job"
        }
      },
      "unbond(address,uint256)": {
        "params": {
          "_amount": "Allows for partial unbonding",
          "_bonding": "The asset being unbound"
        }
      },
      "unbondLiquidityFromJob(address,address,uint256)": {
        "details": "Can only be called by the job's owner",
        "params": {
          "_amount": "The amount of liquidity being removed",
          "_job": "The address of the job being unbound from",
          "_liquidity": "The liquidity being unbound"
        }
      },
      "withdraw(address)": {
        "params": {
          "_bonding": "The asset to withdraw from the bonding pool"
        }
      },
      "withdrawLiquidityFromJob(address,address,address)": {
        "params": {
          "_job": "The address of the job being withdrawn from",
          "_liquidity": "The liquidity being withdrawn",
          "_receiver": "The address that will receive the withdrawn liquidity"
        }
      },
      "withdrawTokenCreditsFromJob(address,address,uint256,address)": {
        "params": {
          "_amount": "The amount of token to be withdrawn",
          "_job": "The address of the job from which the credits are withdrawn",
          "_receiver": "The user that will receive tokens",
          "_token": "The address of the token being withdrawn"
        }
      },
      "worked(address)": {
        "details": "Automatically calculates the payment for the keeper",
        "params": {
          "_keeper": "Address of the keeper that performed the work"
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "errors": {
      "AlreadyAJob()": [
        {
          "notice": "Throws when the address that is trying to register as a job is already a job"
        }
      ],
      "AlreadyAKeeper()": [
        {
          "notice": "Throws when the address that is trying to register as a keeper is already a keeper"
        }
      ],
      "AlreadyDisputed()": [
        {
          "notice": "Throws when a job or keeper is already disputed"
        }
      ],
      "BondsLocked()": [
        {
          "notice": "Throws if the time required to bond an asset has not passed yet"
        }
      ],
      "BondsUnexistent()": [
        {
          "notice": "Throws if there are no bonded assets"
        }
      ],
      "Disputed()": [
        {
          "notice": "Throws if either a job or a keeper is disputed"
        }
      ],
      "DisputerExistent()": [
        {
          "notice": "Throws if the address is already a registered disputer"
        }
      ],
      "DisputerUnexistent()": [
        {
          "notice": "Throws if caller is not a registered disputer"
        }
      ],
      "InsufficientFunds()": [
        {
          "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"
        }
      ],
      "InsufficientJobTokenCredits()": [
        {
          "notice": "Throws when the user tries to withdraw more tokens than it has"
        }
      ],
      "JobAlreadyAdded()": [
        {
          "notice": "Throws when trying to add a job that has already been added"
        }
      ],
      "JobDisputed()": [
        {
          "notice": "Throws when an action that requires an undisputed job is applied on a disputed job"
        }
      ],
      "JobLiquidityInsufficient()": [
        {
          "notice": "Throws when trying to remove more liquidity than the job has"
        }
      ],
      "JobLiquidityLessThanMin()": [
        {
          "notice": "Throws when trying to add less liquidity than the minimum liquidity required"
        }
      ],
      "JobLiquidityUnexistent()": [
        {
          "notice": "Throws when the job doesn't have the requested liquidity"
        }
      ],
      "JobMigrationImpossible()": [
        {
          "notice": "Throws when the address of the job that requests to migrate wants to migrate to its same address"
        }
      ],
      "JobMigrationLocked()": [
        {
          "notice": "Throws when cooldown between migrations has not yet passed"
        }
      ],
      "JobMigrationUnavailable()": [
        {
          "notice": "Throws when the _toJob address differs from the address being tracked in the pendingJobMigrations mapping"
        }
      ],
      "JobTokenCreditsLocked()": [
        {
          "notice": "Throws when the token withdraw cooldown has not yet passed"
        }
      ],
      "JobTokenInsufficient()": [
        {
          "notice": "Throws when someone tries to slash more tokens than the job has"
        }
      ],
      "JobTokenUnexistent()": [
        {
          "notice": "Throws when the token trying to be slashed doesn't exist"
        }
      ],
      "JobUnapproved()": [
        {
          "notice": "Throws if the address claiming to be a job is not in the list of approved jobs"
        }
      ],
      "JobUnavailable()": [
        {
          "notice": "Throws when an address is passed as a job, but that address is not a job"
        }
      ],
      "LiquidityPairApproved()": [
        {
          "notice": "Throws when the liquidity being approved has already been approved"
        }
      ],
      "LiquidityPairUnapproved()": [
        {
          "notice": "Throws when trying to add liquidity to an unapproved pool"
        }
      ],
      "LiquidityPairUnexistent()": [
        {
          "notice": "Throws when the liquidity being removed has not been approved"
        }
      ],
      "MinRewardPeriod()": [
        {
          "notice": "Throws if the reward period is less than the minimum reward period time"
        }
      ],
      "NoGovernanceZeroAddress()": [
        {
          "notice": "Throws if trying to set governance to zero address"
        }
      ],
      "NotDisputed()": [
        {
          "notice": "Throws when a job or keeper is not disputed and someone tries to resolve the dispute"
        }
      ],
      "OnlyDisputer()": [
        {
          "notice": "Throws if the msg.sender is not a disputer or is not a part of governance"
        }
      ],
      "OnlyGovernance()": [
        {
          "notice": "Throws if the caller of the function is not governance"
        }
      ],
      "OnlyJobOwner()": [
        {
          "notice": "Throws when the caller of the function is not the job owner"
        }
      ],
      "OnlyPendingGovernance()": [
        {
          "notice": "Throws if the caller of the function is not pendingGovernance"
        }
      ],
      "OnlyPendingJobOwner()": [
        {
          "notice": "Throws when the caller of the function is not the pending job owner"
        }
      ],
      "OnlySlasher()": [
        {
          "notice": "Throws if the msg.sender is not a slasher or is not a part of governance"
        }
      ],
      "SlasherExistent()": [
        {
          "notice": "Throws if the address is already a registered slasher"
        }
      ],
      "SlasherUnexistent()": [
        {
          "notice": "Throws if caller is not a registered slasher"
        }
      ],
      "TokenUnallowed()": [
        {
          "notice": "Throws when the token is KP3R, as it should not be used for direct token payments"
        }
      ],
      "UnbondsLocked()": [
        {
          "notice": "Throws if the time required to withdraw the bonds has not passed yet"
        }
      ],
      "UnbondsUnexistent()": [
        {
          "notice": "Throws if there are no bonds to withdraw"
        }
      ],
      "ZeroAddress()": [
        {
          "notice": "Throws if a variable is assigned to the zero address"
        }
      ]
    },
    "events": {
      "Activation(address,address,uint256)": {
        "notice": "Emitted when Keep3rKeeperFundable#activate is called"
      },
      "BondTimeChange(uint256)": {
        "notice": "Emitted when bondTime is changed"
      },
      "Bonding(address,address,uint256)": {
        "notice": "Emitted when the bonding process of a new keeper begins"
      },
      "Dispute(address,address)": {
        "notice": "Emitted when a keeper or a job is disputed"
      },
      "DisputerAdded(address)": {
        "notice": "Emitted when a disputer is added"
      },
      "DisputerRemoved(address)": {
        "notice": "Emitted when a disputer is removed"
      },
      "DustSent(address,uint256,address)": {
        "notice": "Emitted when dust is sent"
      },
      "FeeChange(uint256)": {
        "notice": "Emitted when the fee is changed"
      },
      "GovernanceProposal(address)": {
        "notice": "Emitted when a new governance is proposed"
      },
      "GovernanceSet(address)": {
        "notice": "Emitted when pendingGovernance accepts to be governance"
      },
      "InflationPeriodChange(uint256)": {
        "notice": "Emitted when the inflationPeriod is changed"
      },
      "JobAddition(address,address)": {
        "notice": "Emitted when Keep3rJobManager#addJob is called"
      },
      "JobMigrationRequested(address,address)": {
        "notice": "Emitted when Keep3rJobMigration#migrateJob function is called"
      },
      "JobMigrationSuccessful(address,address)": {
        "notice": "Emitted when Keep3rJobMigration#acceptJobMigration function is called"
      },
      "JobOwnershipAssent(address,address,address)": {
        "notice": "Emitted when Keep3rJobOwnership#JobOwnershipAssent is called"
      },
      "JobOwnershipChange(address,address,address)": {
        "notice": "Emitted when Keep3rJobOwnership#changeJobOwnership is called"
      },
      "JobSlashLiquidity(address,address,address,uint256)": {
        "notice": "Emitted when Keep3rJobDisputable#slashLiquidityFromJob is called"
      },
      "JobSlashToken(address,address,address,uint256)": {
        "notice": "Emitted when Keep3rJobDisputable#slashTokenFromJob is called"
      },
      "Keep3rHelperChange(address)": {
        "notice": "Emitted when the Keep3rHelper address is changed"
      },
      "Keep3rV1Change(address)": {
        "notice": "Emitted when the Keep3rV1 address is changed"
      },
      "Keep3rV1ProxyChange(address)": {
        "notice": "Emitted when the Keep3rV1Proxy address is changed"
      },
      "KeeperRevoke(address,address)": {
        "notice": "Emitted when Keep3rKeeperDisputable#revoke is called"
      },
      "KeeperSlash(address,address,uint256)": {
        "notice": "Emitted when Keep3rKeeperDisputable#slash is called"
      },
      "KeeperValidation(uint256)": {
        "notice": "Emitted when a keeper is validated before a job"
      },
      "KeeperWork(address,address,address,uint256,uint256)": {
        "notice": "Emitted when a keeper works a job"
      },
      "Kp3rWethPoolChange(address)": {
        "notice": "Emitted when the KP3R-WETH pool address is changed"
      },
      "LiquidityAddition(address,address,address,uint256)": {
        "notice": "Emitted when IKeep3rJobFundableLiquidity#addLiquidityToJob function is called"
      },
      "LiquidityApproval(address)": {
        "notice": "Emitted when Keep3rJobFundableLiquidity#approveLiquidity function is called"
      },
      "LiquidityCreditsForced(address,uint256,uint256)": {
        "notice": "Emitted when Keep3rJobFundableLiquidity#forceLiquidityCreditsToJob function is called"
      },
      "LiquidityCreditsReward(address,uint256,uint256,uint256)": {
        "notice": "Emitted when Keep3rJobFundableLiquidity#addLiquidityToJob function is called"
      },
      "LiquidityMinimumChange(uint256)": {
        "notice": "Emitted when _liquidityMinimum is changed"
      },
      "LiquidityRevocation(address)": {
        "notice": "Emitted when Keep3rJobFundableLiquidity#revokeLiquidity function is called"
      },
      "LiquidityWithdrawal(address,address,address,uint256)": {
        "notice": "Emitted when IKeep3rJobFundableLiquidity#withdrawLiquidityFromJob function is called"
      },
      "Resolve(address,address)": {
        "notice": "Emitted when a dispute is resolved"
      },
      "RewardPeriodTimeChange(uint256)": {
        "notice": "Emitted when _rewardPeriodTime is changed"
      },
      "SlasherAdded(address)": {
        "notice": "Emitted when a slasher is added"
      },
      "SlasherRemoved(address)": {
        "notice": "Emitted when a slasher is removed"
      },
      "TokenCreditAddition(address,address,address,uint256)": {
        "notice": "Emitted when Keep3rJobFundableCredits#addTokenCreditsToJob is called"
      },
      "TokenCreditWithdrawal(address,address,address,uint256)": {
        "notice": "Emitted when Keep3rJobFundableCredits#withdrawTokenCreditsFromJob is called"
      },
      "UnbondTimeChange(uint256)": {
        "notice": "Emitted when _unbondTime is changed"
      },
      "Unbonding(address,address,uint256)": {
        "notice": "Emitted when a keeper or job begins the unbonding process to withdraw the funds"
      },
      "Withdrawal(address,address,uint256)": {
        "notice": "Emitted when Keep3rKeeperFundable#withdraw is called"
      }
    },
    "kind": "user",
    "methods": {
      "BASE()": {
        "notice": "The base that will be used to calculate the fee"
      },
      "MIN_REWARD_PERIOD_TIME()": {
        "notice": "The minimum rewardPeriodTime value to be set"
      },
      "acceptGovernance()": {
        "notice": "Changes the governance from the current governance to the previously proposed address"
      },
      "acceptJobMigration(address,address)": {
        "notice": "Completes the migration process for a job"
      },
      "acceptJobOwnership(address)": {
        "notice": "The proposed address accepts to be the owner of the job"
      },
      "activate(address)": {
        "notice": "End of the bonding process after bonding time has passed"
      },
      "addDisputer(address)": {
        "notice": "Registers a disputer by updating the disputers mapping"
      },
      "addJob(address)": {
        "notice": "Allows any caller to add a new job"
      },
      "addLiquidityToJob(address,address,uint256)": {
        "notice": "Allows anyone to fund a job with liquidity"
      },
      "addSlasher(address)": {
        "notice": "Registers a slasher by updating the slashers mapping"
      },
      "addTokenCreditsToJob(address,address,uint256)": {
        "notice": "Add credit to a job to be paid out for work"
      },
      "approveLiquidity(address)": {
        "notice": "Approve a liquidity pair for being accepted in future"
      },
      "approvedLiquidities()": {
        "notice": "Lists liquidity pairs"
      },
      "bond(address,uint256)": {
        "notice": "Beginning of the bonding process"
      },
      "bondTime()": {
        "notice": "The amount of time required to pass after a keeper has bonded assets for it to be able to activate"
      },
      "bondedPayment(address,uint256)": {
        "notice": "Implemented by jobs to show that a keeper performed work"
      },
      "bonds(address,address)": {
        "notice": "Mapping (job => bonding => amount)"
      },
      "canActivateAfter(address,address)": {
        "notice": "Tracks when a bonding for a keeper can be activated"
      },
      "canWithdrawAfter(address,address)": {
        "notice": "Tracks when keeper bonds are ready to be withdrawn"
      },
      "changeJobOwnership(address,address)": {
        "notice": "Proposes a new address to be the owner of the job"
      },
      "directTokenPayment(address,address,uint256)": {
        "notice": "Implemented by jobs to show that a keeper performed work"
      },
      "dispute(address)": {
        "notice": "Allows governance to create a dispute for a given keeper/job"
      },
      "disputers(address)": {
        "notice": "Maps an address to a boolean to determine whether the address is a disputer or not."
      },
      "disputes(address)": {
        "notice": "Tracks if a keeper or job has a pending dispute"
      },
      "fee()": {
        "notice": "The fee to be sent to governance when a user adds liquidity to a job"
      },
      "firstSeen(address)": {
        "notice": "Tracks when a keeper was first registered"
      },
      "forceLiquidityCreditsToJob(address,uint256)": {
        "notice": "Gifts liquidity credits to the specified job"
      },
      "governance()": {
        "notice": "Stores the governance address"
      },
      "hasBonded(address)": {
        "notice": "Checks whether the address has ever bonded an asset"
      },
      "inflationPeriod()": {
        "notice": "The inflation period is the denominator used to regulate the emission of KP3R"
      },
      "isBondedKeeper(address,address,uint256,uint256,uint256)": {
        "notice": "Confirms if the current keeper is registered and has a minimum bond of any asset. Should be used for protected functions"
      },
      "isKeeper(address)": {
        "notice": "Confirms if the current keeper is registered, can be used for general (non critical) functions"
      },
      "jobLiquidityCredits(address)": {
        "notice": "Returns the liquidity credits of a given job"
      },
      "jobOwner(address)": {
        "notice": "Maps the job to the owner of the job (job => user)"
      },
      "jobPendingOwner(address)": {
        "notice": "Maps the owner of the job to its pending owner (job => user)"
      },
      "jobPeriodCredits(address)": {
        "notice": "Returns the credits of a given job for the current period"
      },
      "jobTokenCredits(address,address)": {
        "notice": "The current token credits available for a job"
      },
      "jobTokenCreditsAddedAt(address,address)": {
        "notice": "Last block where tokens were added to the job [job => token => timestamp]"
      },
      "jobs()": {
        "notice": "Lists all jobs"
      },
      "keep3rHelper()": {
        "notice": "Address of Keep3rHelper's contract"
      },
      "keep3rV1()": {
        "notice": "Address of Keep3rV1's contract"
      },
      "keep3rV1Proxy()": {
        "notice": "Address of Keep3rV1Proxy's contract"
      },
      "keepers()": {
        "notice": "Lists all keepers"
      },
      "kp3rWethPool()": {
        "notice": "Address of the KP3R-WETH pool"
      },
      "liquidityAmount(address,address)": {
        "notice": "Amount of liquidity in a specified job"
      },
      "liquidityMinimum()": {
        "notice": "The minimum amount of liquidity required to fund a job per liquidity"
      },
      "migrateJob(address,address)": {
        "notice": "Initializes the migration process for a job by adding the request to the pendingJobMigrations mapping"
      },
      "observeLiquidity(address)": {
        "notice": "Observes the current state of the liquidity pair being observed and updates TickCache with the information"
      },
      "pendingBonds(address,address)": {
        "notice": "Tracks the amount of assets deposited in pending bonds"
      },
      "pendingGovernance()": {
        "notice": "Stores the pendingGovernance address"
      },
      "pendingJobMigrations(address)": {
        "notice": "Maps the jobs that have requested a migration to the address they have requested to migrate to"
      },
      "pendingUnbonds(address,address)": {
        "notice": "Tracks how much keeper bonds are to be withdrawn"
      },
      "quoteLiquidity(address,uint256)": {
        "notice": "Calculates how many credits should be rewarded periodically for a given liquidity amount"
      },
      "removeDisputer(address)": {
        "notice": "Removes a disputer by updating the disputers mapping"
      },
      "removeSlasher(address)": {
        "notice": "Removes a slasher by updating the slashers mapping"
      },
      "resolve(address)": {
        "notice": "Allows governance to resolve a dispute on a keeper/job"
      },
      "revoke(address)": {
        "notice": "Blacklists a keeper from participating in the network"
      },
      "revokeLiquidity(address)": {
        "notice": "Revoke a liquidity pair from being accepted in future"
      },
      "rewardPeriodTime()": {
        "notice": "The amount of time between each scheduled credits reward given to a job"
      },
      "rewardedAt(address)": {
        "notice": "Last time the job was rewarded liquidity credits"
      },
      "sendDust(address,uint256,address)": {
        "notice": "Allows an authorized user to transfer the tokens or eth that may have been left in a contract"
      },
      "setBondTime(uint256)": {
        "notice": "Sets the bond time required to activate as a keeper"
      },
      "setFee(uint256)": {
        "notice": "Sets the new fee"
      },
      "setGovernance(address)": {
        "notice": "Proposes a new address to be governance"
      },
      "setInflationPeriod(uint256)": {
        "notice": "Sets the new inflation period"
      },
      "setKeep3rHelper(address)": {
        "notice": "Sets the Keep3rHelper address"
      },
      "setKeep3rV1(address)": {
        "notice": "Sets the Keep3rV1 address"
      },
      "setKeep3rV1Proxy(address)": {
        "notice": "Sets the Keep3rV1Proxy address"
      },
      "setKp3rWethPool(address)": {
        "notice": "Sets the KP3R-WETH pool address"
      },
      "setLiquidityMinimum(uint256)": {
        "notice": "Sets the minimum amount of liquidity required to fund a job"
      },
      "setRewardPeriodTime(uint256)": {
        "notice": "Sets the time required to pass between rewards for jobs"
      },
      "setUnbondTime(uint256)": {
        "notice": "Sets the unbond time required unbond what has been bonded"
      },
      "slash(address,address,uint256)": {
        "notice": "Allows governance to slash a keeper based on a dispute"
      },
      "slashLiquidityFromJob(address,address,uint256)": {
        "notice": "Allows governance or a slasher to slash liquidity from a job"
      },
      "slashTokenFromJob(address,address,uint256)": {
        "notice": "Allows governance or slasher to slash a job specific token"
      },
      "slashers(address)": {
        "notice": "Maps an address to a boolean to determine whether the address is a slasher or not."
      },
      "totalJobCredits(address)": {
        "notice": "Calculates the total credits of a given job"
      },
      "unbond(address,uint256)": {
        "notice": "Beginning of the unbonding process"
      },
      "unbondLiquidityFromJob(address,address,uint256)": {
        "notice": "Unbond liquidity for a job"
      },
      "unbondTime()": {
        "notice": "The amount of time required to pass before a keeper can unbond what he has bonded"
      },
      "withdraw(address)": {
        "notice": "Withdraw funds after unbonding has finished"
      },
      "withdrawLiquidityFromJob(address,address,address)": {
        "notice": "Withdraw liquidity from a job"
      },
      "withdrawTokenCreditsFromJob(address,address,uint256,address)": {
        "notice": "Withdraw credit from a job"
      },
      "workCompleted(address)": {
        "notice": "Tracks the total KP3R earnings of a keeper since it started working"
      },
      "worked(address)": {
        "notice": "Implemented by jobs to show that a keeper performed work"
      },
      "workedAt(address)": {
        "notice": "Last time the job was worked"
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 10,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_status",
        "offset": 0,
        "slot": "0",
        "type": "t_uint256"
      },
      {
        "astId": 8005,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobOwner",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 8011,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobPendingOwner",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 5047,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_keepers",
        "offset": 0,
        "slot": "3",
        "type": "t_struct(AddressSet)1631_storage"
      },
      {
        "astId": 5053,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "workCompleted",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5059,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "firstSeen",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5065,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "disputes",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5073,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "bonds",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5081,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobTokenCredits",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5086,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobLiquidityCredits",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5091,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobPeriodCredits",
        "offset": 0,
        "slot": "11",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5097,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobTokens",
        "offset": 0,
        "slot": "12",
        "type": "t_mapping(t_address,t_struct(AddressSet)1631_storage)"
      },
      {
        "astId": 5103,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobLiquidities",
        "offset": 0,
        "slot": "13",
        "type": "t_mapping(t_address,t_struct(AddressSet)1631_storage)"
      },
      {
        "astId": 5108,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_liquidityPool",
        "offset": 0,
        "slot": "14",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 5113,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_isKP3RToken0",
        "offset": 0,
        "slot": "15",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5121,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingBonds",
        "offset": 0,
        "slot": "16",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5129,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "canActivateAfter",
        "offset": 0,
        "slot": "17",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5137,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "canWithdrawAfter",
        "offset": 0,
        "slot": "18",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5145,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingUnbonds",
        "offset": 0,
        "slot": "19",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5151,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "hasBonded",
        "offset": 0,
        "slot": "20",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5155,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobs",
        "offset": 0,
        "slot": "21",
        "type": "t_struct(AddressSet)1631_storage"
      },
      {
        "astId": 4945,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "governance",
        "offset": 0,
        "slot": "23",
        "type": "t_address"
      },
      {
        "astId": 4949,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingGovernance",
        "offset": 0,
        "slot": "24",
        "type": "t_address"
      },
      {
        "astId": 5630,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "slashers",
        "offset": 0,
        "slot": "25",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5636,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "disputers",
        "offset": 0,
        "slot": "26",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5273,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "keep3rV1",
        "offset": 0,
        "slot": "27",
        "type": "t_address"
      },
      {
        "astId": 5277,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "keep3rV1Proxy",
        "offset": 0,
        "slot": "28",
        "type": "t_address"
      },
      {
        "astId": 5281,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "keep3rHelper",
        "offset": 0,
        "slot": "29",
        "type": "t_address"
      },
      {
        "astId": 5285,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "kp3rWethPool",
        "offset": 0,
        "slot": "30",
        "type": "t_address"
      },
      {
        "astId": 5290,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "bondTime",
        "offset": 0,
        "slot": "31",
        "type": "t_uint256"
      },
      {
        "astId": 5295,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "unbondTime",
        "offset": 0,
        "slot": "32",
        "type": "t_uint256"
      },
      {
        "astId": 5300,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "liquidityMinimum",
        "offset": 0,
        "slot": "33",
        "type": "t_uint256"
      },
      {
        "astId": 5305,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "rewardPeriodTime",
        "offset": 0,
        "slot": "34",
        "type": "t_uint256"
      },
      {
        "astId": 5310,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "inflationPeriod",
        "offset": 0,
        "slot": "35",
        "type": "t_uint256"
      },
      {
        "astId": 5315,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "fee",
        "offset": 0,
        "slot": "36",
        "type": "t_uint256"
      },
      {
        "astId": 5978,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobTokenCreditsAddedAt",
        "offset": 0,
        "slot": "37",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 6221,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_approvedLiquidities",
        "offset": 0,
        "slot": "38",
        "type": "t_struct(AddressSet)1631_storage"
      },
      {
        "astId": 6229,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "liquidityAmount",
        "offset": 0,
        "slot": "40",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 6235,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "rewardedAt",
        "offset": 0,
        "slot": "41",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 6241,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "workedAt",
        "offset": 0,
        "slot": "42",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 6247,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_tick",
        "offset": 0,
        "slot": "43",
        "type": "t_mapping(t_address,t_struct(TickCache)12540_storage)"
      },
      {
        "astId": 7725,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingJobMigrations",
        "offset": 0,
        "slot": "44",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 7731,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_migrationCreatedAt",
        "offset": 0,
        "slot": "45",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 8129,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_initialGas",
        "offset": 0,
        "slot": "46",
        "type": "t_uint256"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_bytes32)dyn_storage": {
        "base": "t_bytes32",
        "encoding": "dynamic_array",
        "label": "bytes32[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_bytes32": {
        "encoding": "inplace",
        "label": "bytes32",
        "numberOfBytes": "32"
      },
      "t_int56": {
        "encoding": "inplace",
        "label": "int56",
        "numberOfBytes": "7"
      },
      "t_mapping(t_address,t_address)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      },
      "t_mapping(t_address,t_mapping(t_address,t_uint256))": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => mapping(address => uint256))",
        "numberOfBytes": "32",
        "value": "t_mapping(t_address,t_uint256)"
      },
      "t_mapping(t_address,t_struct(AddressSet)1631_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct EnumerableSet.AddressSet)",
        "numberOfBytes": "32",
        "value": "t_struct(AddressSet)1631_storage"
      },
      "t_mapping(t_address,t_struct(TickCache)12540_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct IKeep3rJobFundableLiquidity.TickCache)",
        "numberOfBytes": "32",
        "value": "t_struct(TickCache)12540_storage"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_mapping(t_bytes32,t_uint256)": {
        "encoding": "mapping",
        "key": "t_bytes32",
        "label": "mapping(bytes32 => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_struct(AddressSet)1631_storage": {
        "encoding": "inplace",
        "label": "struct EnumerableSet.AddressSet",
        "members": [
          {
            "astId": 1630,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "_inner",
            "offset": 0,
            "slot": "0",
            "type": "t_struct(Set)1330_storage"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(Set)1330_storage": {
        "encoding": "inplace",
        "label": "struct EnumerableSet.Set",
        "members": [
          {
            "astId": 1325,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "_values",
            "offset": 0,
            "slot": "0",
            "type": "t_array(t_bytes32)dyn_storage"
          },
          {
            "astId": 1329,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "_indexes",
            "offset": 0,
            "slot": "1",
            "type": "t_mapping(t_bytes32,t_uint256)"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_struct(TickCache)12540_storage": {
        "encoding": "inplace",
        "label": "struct IKeep3rJobFundableLiquidity.TickCache",
        "members": [
          {
            "astId": 12535,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "current",
            "offset": 0,
            "slot": "0",
            "type": "t_int56"
          },
          {
            "astId": 12537,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "difference",
            "offset": 7,
            "slot": "0",
            "type": "t_int56"
          },
          {
            "astId": 12539,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "period",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "64"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      }
    }
  }
}