{
  "address": "0xeb02addCfD8B773A5FFA6B9d1FE99c566f8c44CC",
  "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": "_payment",
          "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": "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": "_bondAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_unbondAmount",
          "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": "0xb1310a9dd5fa5eff681016e0213bc39797cd8e75ef21ef3f45ad52c9c0ca3bb9",
  "receipt": {
    "to": null,
    "from": "0x54054EA2db6eDC336cB87966815FD66Cc337f224",
    "contractAddress": "0xeb02addCfD8B773A5FFA6B9d1FE99c566f8c44CC",
    "transactionIndex": 80,
    "gasUsed": "5680145",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x7f18cd350e35b0c045221b6a1d8441fe3f7fc990bdd546595042bfd758614674",
    "transactionHash": "0xb1310a9dd5fa5eff681016e0213bc39797cd8e75ef21ef3f45ad52c9c0ca3bb9",
    "logs": [],
    "blockNumber": 14524602,
    "cumulativeGasUsed": "10661805",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x54054EA2db6eDC336cB87966815FD66Cc337f224",
    "0xd36ac9ff5562abb541f51345f340fb650547a661",
    "0x1cEB5cB57C4D4E2b2433641b95Dd330A33185A44",
    "0x976b01c02c636Dd5901444B941442FD70b86dcd5",
    "0x11b7a6bc0259ed6cf9db8f499988f9ecc7167bf5"
  ],
  "numDeployments": 2,
  "solcInputHash": "b8876691210a06f2046b37f0b14142fa",
  "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\":\"_payment\",\"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\":\"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\":\"_bondAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_unbondAmount\",\"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\"}},\"acceptJobOwnership(address)\":{\"params\":{\"_job\":\"The address of the job\"}},\"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 bonded\",\"_bonding\":\"The asset being bonded\"}},\"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\"}},\"changeJobOwnership(address,address)\":{\"params\":{\"_job\":\"The address of the job\",\"_newOwner\":\"The address of the proposed new owner\"}},\"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)\":{\"details\":\"Should be used for protected functions\",\"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)\":{\"details\":\"Can be used for general (non critical) functions\",\"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 keepers 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 address of 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 address of 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 amount 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 being proposed as 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,uint256)\":{\"params\":{\"_bondAmount\":\"The bonded amount being slashed\",\"_bonded\":\"The asset being slashed\",\"_keeper\":\"The address being slashed\",\"_unbondAmount\":\"The pending unbond amount 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 unbonded\"}},\"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 unbonded from\",\"_liquidity\":\"The liquidity being unbonded\"}},\"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 and pays the keeper with bonded KP3R\",\"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\":{\"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\":\"Tracks 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.\"},\"isKeeper(address)\":{\"notice\":\"Confirms if the current keeper is registered\"},\"jobLiquidityCredits(address)\":{\"notice\":\"Returns the liquidity credits of a given job\"},\"jobOwner(address)\":{\"notice\":\"Maps the job to the owner of the job\"},\"jobPendingOwner(address)\":{\"notice\":\"Maps the job to its pending owner\"},\"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\"},\"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,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\":\"Tracks 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\":33},\"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 internal 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\":\"0x246ac2c4057520bb627ea8040367549786f4477a04fd79358927cd607952bc2f\",\"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  /// @notice The base that will be used to calculate the fee\\n  uint256 internal constant _BASE = 10_000;\\n\\n  /// @notice The minimum reward period\\n  uint256 internal constant _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  // TODO: check what happens to credit minting when changing this. Shouldn't we update the cached ticks?\\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\":\"0x713ce68b5c6c5f788422a0d3ec1b8b8db394348708448f3422e071ab70f89e27\",\"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 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\":\"0x86cdbf44dfa46c6b6e184e48e11cb8571e26cf50c793b6b07227c29e743da397\",\"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\":\"0xb600d18903a008a1ca03743de7cef8330c2d5e66db52c900822551a4be75f7a5\",\"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    // If the job was rewarded in the past 1 period time\\n    if ((block.timestamp - rewardedAt[_job]) < rewardPeriodTime) {\\n      // If the job has period credits, update minted job credits to new twap\\n      _liquidityCredits = _periodCredits > 0\\n        ? (_jobLiquidityCredits[_job] * _periodCredits) / _jobPeriodCredits[_job] // If the job has period credits, return remaining job credits updated to new twap\\n        : _jobLiquidityCredits[_job]; // If not, return remaining credits, forced credits should not be updated\\n    } else {\\n      // Else return a full period worth of credits if current credits have 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 = block.timestamp;\\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 -= (rewardedAt[_job] + rewardPeriodTime);\\n      } else {\\n        // Will calculate cooldown from last reward timestamp\\n        _cooldown -= rewardedAt[_job];\\n      }\\n    } else {\\n      // Will calculate cooldown from period start if expired\\n      _cooldown -= _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        delete _tickCache.period;\\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 (pendingUnbonds[_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\\n    delete pendingUnbonds[_job][_liquidity];\\n    delete canWithdrawAfter[_job][_liquidity];\\n\\n    IERC20(_liquidity).safeTransfer(_receiver, _amount);\\n    emit LiquidityWithdrawal(_job, _liquidity, _receiver, _amount);\\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\":\"0xdb64c1f3b0d5df700535f587e1e16369a79f09c192341537aa982319211f7840\",\"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      delete jobTokenCredits[_fromJob][_tokenToMigrate];\\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\":\"0xd46c3c9ce970098d8d75f11966894a341824aceb40583fcfbbc0ebda93d869f9\",\"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 = _getGasLeft();\\n    if (_keepers.contains(_keeper)) {\\n      emit KeeperValidation(_initialGas);\\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 = _getGasLeft();\\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(_initialGas);\\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 _boost, uint256 _oneEthQuote, uint256 _extraGas) = IKeep3rHelper(keep3rHelper).getPaymentParams(bonds[_keeper][keep3rV1]);\\n\\n    uint256 _gasLeft = _getGasLeft();\\n    uint256 _payment = _calculatePayment(_gasLeft, _extraGas, _oneEthQuote, _boost);\\n\\n    if (_payment > _jobLiquidityCredits[_job]) {\\n      _rewardJobCredits(_job);\\n      emit LiquidityCreditsReward(_job, rewardedAt[_job], _jobLiquidityCredits[_job], _jobPeriodCredits[_job]);\\n\\n      _gasLeft = _getGasLeft();\\n      _payment = _calculatePayment(_gasLeft, _extraGas, _oneEthQuote, _boost);\\n    }\\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, _getGasLeft());\\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, _getGasLeft());\\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  /// @notice Calculate amount to be payed in KP3R, taking into account multiple parameters\\n  /// @param _gasLeft Amount of gas left after working the job\\n  /// @param _extraGas Amount of expected unaccounted gas\\n  /// @param _oneEthQuote Amount of KP3R equivalent to 1 ETH\\n  /// @param _boost Reward given to the keeper for having bonded KP3R tokens\\n  /// @return _payment Amount to be payed in KP3R tokens\\n  function _calculatePayment(\\n    uint256 _gasLeft,\\n    uint256 _extraGas,\\n    uint256 _oneEthQuote,\\n    uint256 _boost\\n  ) internal view returns (uint256 _payment) {\\n    uint256 _accountedGas = _initialGas - _gasLeft + _extraGas;\\n    _payment = (((_accountedGas * _boost) / _BASE) * _oneEthQuote) / 1 ether;\\n  }\\n\\n  /// @notice Return the gas left and add 1/64 in order to match real gas left at first level of depth (EIP-150)\\n  /// @return _gasLeft Amount of gas left recording taking into account EIP-150\\n  function _getGasLeft() internal view returns (uint256 _gasLeft) {\\n    _gasLeft = (gasleft() * 64) / 63;\\n  }\\n}\\n\",\"keccak256\":\"0x22a457d0af01de7b4fb5c8b60ad6c20c7b6608d36457910252b8009c4fdb2646\",\"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 _bondAmount,\\n    uint256 _unbondAmount\\n  ) public override onlySlasher {\\n    if (!disputes[_keeper]) revert NotDisputed();\\n    _slash(_keeper, _bonded, _bondAmount, _unbondAmount);\\n    emit KeeperSlash(_keeper, msg.sender, _bondAmount + _unbondAmount);\\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], pendingUnbonds[_keeper][keep3rV1]);\\n    emit KeeperRevoke(_keeper, msg.sender);\\n  }\\n\\n  function _slash(\\n    address _keeper,\\n    address _bonded,\\n    uint256 _bondAmount,\\n    uint256 _unbondAmount\\n  ) internal {\\n    if (_bonded != keep3rV1) {\\n      try IERC20(_bonded).transfer(governance, _bondAmount + _unbondAmount) returns (bool) {} catch (bytes memory) {}\\n    }\\n    bonds[_keeper][_bonded] -= _bondAmount;\\n    pendingUnbonds[_keeper][_bonded] -= _unbondAmount;\\n  }\\n}\\n\",\"keccak256\":\"0x1b983519e5367b29d8cd4698c56ed9c18013f757bf0a6a2656572547aaf20208\",\"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    delete canActivateAfter[msg.sender][_bonding];\\n\\n    uint256 _amount = _activate(msg.sender, _bonding);\\n    emit Activation(msg.sender, _bonding, _amount);\\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 (pendingUnbonds[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    delete pendingUnbonds[msg.sender][_bonding];\\n    delete canWithdrawAfter[msg.sender][_bonding];\\n\\n    IERC20(_bonding).safeTransfer(msg.sender, _amount);\\n\\n    emit Withdrawal(msg.sender, _bonding, _amount);\\n  }\\n\\n  function _activate(address _keeper, address _bonding) internal returns (uint256 _amount) {\\n    if (firstSeen[_keeper] == 0) {\\n      firstSeen[_keeper] = block.timestamp;\\n    }\\n    _keepers.add(_keeper);\\n    _amount = pendingBonds[_keeper][_bonding];\\n    delete pendingBonds[_keeper][_bonding];\\n\\n    // bond provided tokens\\n    bonds[_keeper][_bonding] += _amount;\\n    if (_bonding == keep3rV1) {\\n      IKeep3rV1(keep3rV1).burn(_amount);\\n    }\\n  }\\n}\\n\",\"keccak256\":\"0x8160a5608050e5541562f3b98ed04d0cabeb99b7fb4aa598af4186f6282598be\",\"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.4 <0.9.0;\\n\\n/// @title Keep3rHelper contract\\n/// @notice Contains all the helper functions used throughout the different files.\\n\\ninterface IKeep3rHelper {\\n  // Errors\\n\\n  /// @notice Throws when none of the tokens in the liquidity pair is KP3R\\n  error LiquidityPairInvalid();\\n\\n  // Methods\\n  // solhint-enable func-name-mixedcase\\n\\n  /// @notice Calculates the amount of KP3R that corresponds to the ETH passed into the function\\n  /// @dev This function allows us to calculate how much KP3R we should pay to a keeper for things expressed in ETH, like gas\\n  /// @param _eth The amount of ETH\\n  /// @return _amountOut The amount of KP3R\\n  function quote(uint256 _eth) external view returns (uint256 _amountOut);\\n\\n  /// @notice Returns the amount of KP3R the keeper has bonded\\n  /// @param _keeper The address of the keeper to check\\n  /// @return _amountBonded The amount of KP3R the keeper has bonded\\n  function bonds(address _keeper) external view returns (uint256 _amountBonded);\\n\\n  /// @notice Calculates the reward (in KP3R) that corresponds to a keeper for using gas\\n  /// @param _keeper The address of the keeper to check\\n  /// @param _gasUsed The amount of gas used that will be rewarded\\n  /// @return _kp3r The amount of KP3R that should be awarded to the keeper\\n  function getRewardAmountFor(address _keeper, uint256 _gasUsed) external view returns (uint256 _kp3r);\\n\\n  /// @notice Calculates the boost in the reward given to a keeper based on the amount of KP3R that keeper has bonded\\n  /// @param _bonds The amount of KP3R tokens bonded by the keeper\\n  /// @return _rewardBoost The reward boost that corresponds to the keeper\\n  function getRewardBoostFor(uint256 _bonds) external view returns (uint256 _rewardBoost);\\n\\n  /// @notice Calculates the reward (in KP3R) that corresponds to tx.origin for using gas\\n  /// @param _gasUsed The amount of gas used that will be rewarded\\n  /// @return _amount The amount of KP3R that should be awarded to tx.origin\\n  function getRewardAmount(uint256 _gasUsed) external view returns (uint256 _amount);\\n\\n  /// @notice Given a pool address, returns the underlying tokens of the pair\\n  /// @param _pool Address of the correspondant pool\\n  /// @return _token0 Address of the first token of the pair\\n  /// @return _token1 Address of the second token of the pair\\n  function getPoolTokens(address _pool) external view returns (address _token0, address _token1);\\n\\n  /// @notice Defines the order of the tokens in the pair for twap calculations\\n  /// @param _pool Address of the correspondant pool\\n  /// @return _isKP3RToken0 Boolean indicating the order of the tokens in the pair\\n  function isKP3RToken0(address _pool) external view returns (bool _isKP3RToken0);\\n\\n  /// @notice Given an array of secondsAgo, returns UniswapV3 pool cumulatives at that moment\\n  /// @param _pool Address of the pool to observe\\n  /// @param _secondsAgo Array with time references to observe\\n  /// @return _tickCumulative1 Cummulative sum of ticks until first time reference\\n  /// @return _tickCumulative2 Cummulative sum of ticks until second time reference\\n  /// @return _success Boolean indicating if the observe call was succesfull\\n  function observe(address _pool, uint32[] memory _secondsAgo)\\n    external\\n    view\\n    returns (\\n      int56 _tickCumulative1,\\n      int56 _tickCumulative2,\\n      bool _success\\n    );\\n\\n  /// @notice Get multiplier, quote, and extra, in order to calculate keeper payment\\n  /// @param _bonds Amount of bonded KP3R owned by the keeper\\n  /// @return _boost Multiplier per gas unit. Takes into account the base fee and the amount of bonded KP3R\\n  /// @return _oneEthQuote Amount of KP3R tokens equivalent to 1 ETH\\n  /// @return _extra Amount of extra gas that should be added to the gas spent\\n  function getPaymentParams(uint256 _bonds)\\n    external\\n    view\\n    returns (\\n      uint256 _boost,\\n      uint256 _oneEthQuote,\\n      uint256 _extra\\n    );\\n\\n  /// @notice Given a tick and a liquidity amount, calculates the underlying KP3R tokens\\n  /// @param _liquidityAmount Amount of liquidity to be converted\\n  /// @param _tickDifference Tick value used to calculate the quote\\n  /// @param _timeInterval Time value used to calculate the quote\\n  /// @return _kp3rAmount Amount of KP3R tokens underlying on the given liquidity\\n  function getKP3RsAtTick(\\n    uint256 _liquidityAmount,\\n    int56 _tickDifference,\\n    uint256 _timeInterval\\n  ) external pure returns (uint256 _kp3rAmount);\\n\\n  /// @notice Given a tick and a token amount, calculates the output in correspondant token\\n  /// @param _baseAmount Amount of token to be converted\\n  /// @param _tickDifference Tick value used to calculate the quote\\n  /// @param _timeInterval Time value used to calculate the quote\\n  /// @return _quoteAmount Amount of credits deserved for the baseAmount at the tick value\\n  function getQuoteAtTick(\\n    uint128 _baseAmount,\\n    int56 _tickDifference,\\n    uint256 _timeInterval\\n  ) external pure returns (uint256 _quoteAmount);\\n}\\n\",\"keccak256\":\"0x1b7daa4263dd21102f0418fba16f5a35a805070ebba3b39b39cadc6fc34d50e9\",\"license\":\"MIT\"},\"solidity/interfaces/IPairManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <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 factory from which the pair manager was created\\n  /// @return _factory The address of the PairManager Factory\\n  function factory() external view returns (address _factory);\\n\\n  /// @notice Address of the pool from which the Keep3r pair manager will interact with\\n  /// @return _pool The address of the pool\\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\":\"0x345c312b340c5775fb8f68d89ce851c7f75522940bd9bc64f2301a3f8312636a\",\"license\":\"MIT\"},\"solidity/interfaces/external/IKeep3rV1.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport '@openzeppelin/contracts/token/ERC20/IERC20.sol';\\nimport '@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol';\\n\\n// solhint-disable func-name-mixedcase\\ninterface IKeep3rV1 is IERC20, IERC20Metadata {\\n  // Structs\\n  struct Checkpoint {\\n    uint32 fromBlock;\\n    uint256 votes;\\n  }\\n\\n  // Events\\n  event DelegateChanged(address indexed _delegator, address indexed _fromDelegate, address indexed _toDelegate);\\n  event DelegateVotesChanged(address indexed _delegate, uint256 _previousBalance, uint256 _newBalance);\\n  event SubmitJob(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event ApplyCredit(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event RemoveJob(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event UnbondJob(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _block, uint256 _credit);\\n  event JobAdded(address indexed _job, uint256 _block, address _governance);\\n  event JobRemoved(address indexed _job, uint256 _block, address _governance);\\n  event KeeperWorked(address indexed _credit, address indexed _job, address indexed _keeper, uint256 _block, uint256 _amount);\\n  event KeeperBonding(address indexed _keeper, uint256 _block, uint256 _active, uint256 _bond);\\n  event KeeperBonded(address indexed _keeper, uint256 _block, uint256 _activated, uint256 _bond);\\n  event KeeperUnbonding(address indexed _keeper, uint256 _block, uint256 _deactive, uint256 _bond);\\n  event KeeperUnbound(address indexed _keeper, uint256 _block, uint256 _deactivated, uint256 _bond);\\n  event KeeperSlashed(address indexed _keeper, address indexed _slasher, uint256 _block, uint256 _slash);\\n  event KeeperDispute(address indexed _keeper, uint256 _block);\\n  event KeeperResolved(address indexed _keeper, uint256 _block);\\n  event TokenCreditAddition(address indexed _credit, address indexed _job, address indexed _creditor, uint256 _block, uint256 _amount);\\n\\n  // Variables\\n  function KPRH() external returns (address);\\n\\n  function delegates(address _delegator) external view returns (address);\\n\\n  function checkpoints(address _account, uint32 _checkpoint) external view returns (Checkpoint memory);\\n\\n  function numCheckpoints(address _account) external view returns (uint32);\\n\\n  function DOMAIN_TYPEHASH() external returns (bytes32);\\n\\n  function DOMAINSEPARATOR() external returns (bytes32);\\n\\n  function DELEGATION_TYPEHASH() external returns (bytes32);\\n\\n  function PERMIT_TYPEHASH() external returns (bytes32);\\n\\n  function nonces(address _user) external view returns (uint256);\\n\\n  function BOND() external returns (uint256);\\n\\n  function UNBOND() external returns (uint256);\\n\\n  function LIQUIDITYBOND() external returns (uint256);\\n\\n  function FEE() external returns (uint256);\\n\\n  function BASE() external returns (uint256);\\n\\n  function ETH() external returns (address);\\n\\n  function bondings(address _user, address _bonding) external view returns (uint256);\\n\\n  function canWithdrawAfter(address _user, address _bonding) external view returns (uint256);\\n\\n  function pendingUnbonds(address _keeper, address _bonding) external view returns (uint256);\\n\\n  function pendingbonds(address _keeper, address _bonding) external view returns (uint256);\\n\\n  function bonds(address _keeper, address _bonding) external view returns (uint256);\\n\\n  function votes(address _delegator) external view returns (uint256);\\n\\n  function firstSeen(address _keeper) external view returns (uint256);\\n\\n  function disputes(address _keeper) external view returns (bool);\\n\\n  function lastJob(address _keeper) external view returns (uint256);\\n\\n  function workCompleted(address _keeper) external view returns (uint256);\\n\\n  function jobs(address _job) external view returns (bool);\\n\\n  function credits(address _job, address _credit) external view returns (uint256);\\n\\n  function liquidityProvided(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function liquidityUnbonding(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function liquidityAmountsUnbonding(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function jobProposalDelay(address _job) external view returns (uint256);\\n\\n  function liquidityApplied(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function liquidityAmount(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external view returns (uint256);\\n\\n  function keepers(address _keeper) external view returns (bool);\\n\\n  function blacklist(address _keeper) external view returns (bool);\\n\\n  function keeperList(uint256 _index) external view returns (address);\\n\\n  function jobList(uint256 _index) external view returns (address);\\n\\n  function governance() external returns (address);\\n\\n  function pendingGovernance() external returns (address);\\n\\n  function liquidityAccepted(address _liquidity) external view returns (bool);\\n\\n  function liquidityPairs(uint256 _index) external view returns (address);\\n\\n  // Methods\\n  function getCurrentVotes(address _account) external view returns (uint256);\\n\\n  function addCreditETH(address _job) external payable;\\n\\n  function addCredit(\\n    address _credit,\\n    address _job,\\n    uint256 _amount\\n  ) external;\\n\\n  function addVotes(address _voter, uint256 _amount) external;\\n\\n  function removeVotes(address _voter, uint256 _amount) external;\\n\\n  function addKPRCredit(address _job, uint256 _amount) external;\\n\\n  function approveLiquidity(address _liquidity) external;\\n\\n  function revokeLiquidity(address _liquidity) external;\\n\\n  function pairs() external view returns (address[] memory);\\n\\n  function addLiquidityToJob(\\n    address _liquidity,\\n    address _job,\\n    uint256 _amount\\n  ) external;\\n\\n  function applyCreditToJob(\\n    address _provider,\\n    address _liquidity,\\n    address _job\\n  ) external;\\n\\n  function unbondLiquidityFromJob(\\n    address _liquidity,\\n    address _job,\\n    uint256 _amount\\n  ) external;\\n\\n  function removeLiquidityFromJob(address _liquidity, address _job) external;\\n\\n  function mint(uint256 _amount) external;\\n\\n  function burn(uint256 _amount) external;\\n\\n  function worked(address _keeper) external;\\n\\n  function receipt(\\n    address _credit,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n\\n  function receiptETH(address _keeper, uint256 _amount) external;\\n\\n  function addJob(address _job) external;\\n\\n  function getJobs() external view returns (address[] memory);\\n\\n  function removeJob(address _job) external;\\n\\n  function setKeep3rHelper(address _keep3rHelper) external;\\n\\n  function setGovernance(address _governance) external;\\n\\n  function acceptGovernance() external;\\n\\n  function isKeeper(address _keeper) external returns (bool);\\n\\n  function isMinKeeper(\\n    address _keeper,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) external returns (bool);\\n\\n  function isBondedKeeper(\\n    address _keeper,\\n    address _bond,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) external returns (bool);\\n\\n  function bond(address _bonding, uint256 _amount) external;\\n\\n  function getKeepers() external view returns (address[] memory);\\n\\n  function activate(address _bonding) external;\\n\\n  function unbond(address _bonding, uint256 _amount) external;\\n\\n  function slash(\\n    address _bonded,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n\\n  function withdraw(address _bonding) external;\\n\\n  function dispute(address _keeper) external;\\n\\n  function revoke(address _keeper) external;\\n\\n  function resolve(address _keeper) external;\\n\\n  function permit(\\n    address _owner,\\n    address _spender,\\n    uint256 _amount,\\n    uint256 _deadline,\\n    uint8 _v,\\n    bytes32 _r,\\n    bytes32 _s\\n  ) external;\\n}\\n\",\"keccak256\":\"0xa9806cd6666ab1b7375ef72446964a72397fd4cefc7cc8c5b37caa7c50df0246\",\"license\":\"MIT\"},\"solidity/interfaces/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 _token The token that will be transferred\\n  /// @param _amount The amount of the token that will be transferred\\n  /// @param _to The address which will receive the funds\\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 amount 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\":\"0x38dce228111f2a3c6b26ac09c5652c3f1f184c4cfe50d11ff0958ef6a50683bb\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IGovernable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Governable contract\\n/// @notice Manages the governance role\\ninterface IGovernable {\\n  // Events\\n\\n  /// @notice Emitted when pendingGovernance accepts to be governance\\n  /// @param _governance Address of the new governance\\n  event GovernanceSet(address _governance);\\n\\n  /// @notice Emitted when a new governance is proposed\\n  /// @param _pendingGovernance Address that is proposed to be the new governance\\n  event GovernanceProposal(address _pendingGovernance);\\n\\n  // Errors\\n\\n  /// @notice Throws if the caller of the function is not governance\\n  error OnlyGovernance();\\n\\n  /// @notice Throws if the caller of the function is not pendingGovernance\\n  error OnlyPendingGovernance();\\n\\n  /// @notice Throws if trying to set governance to zero address\\n  error NoGovernanceZeroAddress();\\n\\n  // Variables\\n\\n  /// @notice Stores the governance address\\n  /// @return _governance The governance addresss\\n  function governance() external view returns (address _governance);\\n\\n  /// @notice Stores the pendingGovernance address\\n  /// @return _pendingGovernance The pendingGovernance addresss\\n  function pendingGovernance() external view returns (address _pendingGovernance);\\n\\n  // Methods\\n\\n  /// @notice Proposes a new address to be governance\\n  /// @param _governance The address being proposed as the new governance\\n  function setGovernance(address _governance) external;\\n\\n  /// @notice Changes the governance from the current governance to the previously proposed address\\n  function acceptGovernance() external;\\n}\\n\",\"keccak256\":\"0x3284624b2479bbf97c821f37c93a096dcb869b30bbf9b20d30d1800f9535452c\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rAccountance.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rDisputable contract\\n/// @notice Disputes keepers, or if they're already disputed, it can resolve the case\\n/// @dev Argument `bonding` can be the address of either a token or a liquidity\\ninterface IKeep3rAccountance {\\n  // Events\\n\\n  /// @notice Emitted when the bonding process of a new keeper begins\\n  /// @param _keeper The caller of Keep3rKeeperFundable#bond function\\n  /// @param _bonding The asset the keeper has bonded\\n  /// @param _amount The amount the keeper has bonded\\n  event Bonding(address indexed _keeper, address indexed _bonding, uint256 _amount);\\n\\n  /// @notice Emitted when a keeper or job begins the unbonding process to withdraw the funds\\n  /// @param _keeperOrJob The keeper or job that began the unbonding process\\n  /// @param _unbonding The liquidity pair or asset being unbonded\\n  /// @param _amount The amount being unbonded\\n  event Unbonding(address indexed _keeperOrJob, address indexed _unbonding, uint256 _amount);\\n\\n  // Variables\\n\\n  /// @notice Tracks the total KP3R earnings of a keeper since it started working\\n  /// @param _keeper The address of the keeper\\n  /// @return _workCompleted Total KP3R earnings of a keeper since it started working\\n  function workCompleted(address _keeper) external view returns (uint256 _workCompleted);\\n\\n  /// @notice Tracks when a keeper was first registered\\n  /// @param _keeper The address of the keeper\\n  /// @return timestamp The time at which the keeper was first registered\\n  function firstSeen(address _keeper) external view returns (uint256 timestamp);\\n\\n  /// @notice Tracks if a keeper or job has a pending dispute\\n  /// @param _keeperOrJob The address of the keeper or job\\n  /// @return _disputed Whether a keeper or job has a pending dispute\\n  function disputes(address _keeperOrJob) external view returns (bool _disputed);\\n\\n  /// @notice Tracks how much a keeper has bonded of a certain token\\n  /// @param _keeper The address of the keeper\\n  /// @param _bond The address of the token being bonded\\n  /// @return _bonds Amount of a certain token that a keeper has bonded\\n  function bonds(address _keeper, address _bond) external view returns (uint256 _bonds);\\n\\n  /// @notice The current token credits available for a job\\n  /// @param _job The address of the job\\n  /// @param _token The address of the token bonded\\n  /// @return _amount The amount of token credits available for a job\\n  function jobTokenCredits(address _job, address _token) external view returns (uint256 _amount);\\n\\n  /// @notice Tracks the amount of assets deposited in pending bonds\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being bonded\\n  /// @return _pendingBonds Amount of a certain asset a keeper has unbonding\\n  function pendingBonds(address _keeper, address _bonding) external view returns (uint256 _pendingBonds);\\n\\n  /// @notice Tracks when a bonding for a keeper can be activated\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being bonded\\n  /// @return _timestamp Time at which the bonding for a keeper can be activated\\n  function canActivateAfter(address _keeper, address _bonding) external view returns (uint256 _timestamp);\\n\\n  /// @notice Tracks when keeper bonds are ready to be withdrawn\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being unbonded\\n  /// @return _timestamp Time at which the keeper bonds are ready to be withdrawn\\n  function canWithdrawAfter(address _keeper, address _bonding) external view returns (uint256 _timestamp);\\n\\n  /// @notice Tracks how much keeper bonds are to be withdrawn\\n  /// @param _keeper The address of the keeper\\n  /// @param _bonding The address of the token being unbonded\\n  /// @return _pendingUnbonds The amount of keeper bonds that are to be withdrawn\\n  function pendingUnbonds(address _keeper, address _bonding) external view returns (uint256 _pendingUnbonds);\\n\\n  /// @notice Checks whether the address has ever bonded an asset\\n  /// @param _keeper The address of the keeper\\n  /// @return _hasBonded Whether the address has ever bonded an asset\\n  function hasBonded(address _keeper) external view returns (bool _hasBonded);\\n\\n  // Methods\\n\\n  /// @notice Lists all jobs\\n  /// @return _jobList Array with all the jobs in _jobs\\n  function jobs() external view returns (address[] memory _jobList);\\n\\n  /// @notice Lists all keepers\\n  /// @return _keeperList Array with all the keepers in _keepers\\n  function keepers() external view returns (address[] memory _keeperList);\\n\\n  // Errors\\n\\n  /// @notice Throws when an address is passed as a job, but that address is not a job\\n  error JobUnavailable();\\n\\n  /// @notice Throws when an action that requires an undisputed job is applied on a disputed job\\n  error JobDisputed();\\n}\\n\",\"keccak256\":\"0x18e34e422f1e401d294581d84eab674af602383a73bd8ecd77c61de5f899f881\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/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\\n  /// @param _job The address of the job credited\\n  /// @param _token The address of the token credited\\n  /// @return _timestamp The last block where tokens were added to the job\\n  function jobTokenCreditsAddedAt(address _job, address _token) external view returns (uint256 _timestamp);\\n\\n  // Methods\\n\\n  /// @notice Add credit to a job to be paid out for work\\n  /// @param _job The address of the job being credited\\n  /// @param _token The address of the token being credited\\n  /// @param _amount The amount of credit being added\\n  function addTokenCreditsToJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Withdraw credit from a job\\n  /// @param _job The address of the job from which the credits are withdrawn\\n  /// @param _token The address of the token being withdrawn\\n  /// @param _amount The amount of token to be withdrawn\\n  /// @param _receiver The user that will receive tokens\\n  function withdrawTokenCreditsFromJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount,\\n    address _receiver\\n  ) external;\\n}\\n\\n/// @title  Keep3rJobFundableLiquidity contract\\n/// @notice Handles the funding of jobs through specific liquidity pairs\\ninterface IKeep3rJobFundableLiquidity {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#approveLiquidity function is called\\n  /// @param _liquidity The address of the liquidity pair being approved\\n  event LiquidityApproval(address _liquidity);\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#revokeLiquidity function is called\\n  /// @param _liquidity The address of the liquidity pair being revoked\\n  event LiquidityRevocation(address _liquidity);\\n\\n  /// @notice Emitted when IKeep3rJobFundableLiquidity#addLiquidityToJob function is called\\n  /// @param _job The address of the job to which liquidity will be added\\n  /// @param _liquidity The address of the liquidity being added\\n  /// @param _provider The user that calls the function\\n  /// @param _amount The amount of liquidity being added\\n  event LiquidityAddition(address indexed _job, address indexed _liquidity, address indexed _provider, uint256 _amount);\\n\\n  /// @notice Emitted when IKeep3rJobFundableLiquidity#withdrawLiquidityFromJob function is called\\n  /// @param _job The address of the job of which liquidity will be withdrawn from\\n  /// @param _liquidity The address of the liquidity being withdrawn\\n  /// @param _receiver The receiver of the liquidity tokens\\n  /// @param _amount The amount of liquidity being withdrawn from the job\\n  event LiquidityWithdrawal(address indexed _job, address indexed _liquidity, address indexed _receiver, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#addLiquidityToJob function is called\\n  /// @param _job The address of the job whose credits will be updated\\n  /// @param _rewardedAt The time at which the job was last rewarded\\n  /// @param _currentCredits The current credits of the job\\n  /// @param _periodCredits The credits of the job for the current period\\n  event LiquidityCreditsReward(address indexed _job, uint256 _rewardedAt, uint256 _currentCredits, uint256 _periodCredits);\\n\\n  /// @notice Emitted when Keep3rJobFundableLiquidity#forceLiquidityCreditsToJob function is called\\n  /// @param _job The address of the job whose credits will be updated\\n  /// @param _rewardedAt The time at which the job was last rewarded\\n  /// @param _currentCredits The current credits of the job\\n  event LiquidityCreditsForced(address indexed _job, uint256 _rewardedAt, uint256 _currentCredits);\\n\\n  // Errors\\n\\n  /// @notice Throws when the liquidity being approved has already been approved\\n  error LiquidityPairApproved();\\n\\n  /// @notice Throws when the liquidity being removed has not been approved\\n  error LiquidityPairUnexistent();\\n\\n  /// @notice Throws when trying to add liquidity to an unapproved pool\\n  error LiquidityPairUnapproved();\\n\\n  /// @notice Throws when the job doesn't have the requested liquidity\\n  error JobLiquidityUnexistent();\\n\\n  /// @notice Throws when trying to remove more liquidity than the job has\\n  error JobLiquidityInsufficient();\\n\\n  /// @notice Throws when trying to add less liquidity than the minimum liquidity required\\n  error JobLiquidityLessThanMin();\\n\\n  // Structs\\n\\n  /// @notice Stores the tick information of the different liquidity pairs\\n  struct TickCache {\\n    int56 current; // Tracks the current tick\\n    int56 difference; // Stores the difference between the current tick and the last tick\\n    uint256 period; // Stores the period at which the last observation was made\\n  }\\n\\n  // Variables\\n\\n  /// @notice Lists liquidity pairs\\n  /// @return _list An array of addresses with all the approved liquidity pairs\\n  function approvedLiquidities() external view returns (address[] memory _list);\\n\\n  /// @notice Amount of liquidity in a specified job\\n  /// @param _job The address of the job being checked\\n  /// @param _liquidity The address of the liquidity we are checking\\n  /// @return _amount Amount of liquidity in the specified job\\n  function liquidityAmount(address _job, address _liquidity) external view returns (uint256 _amount);\\n\\n  /// @notice Last time the job was rewarded liquidity credits\\n  /// @param _job The address of the job being checked\\n  /// @return _timestamp Timestamp of the last time the job was rewarded liquidity credits\\n  function rewardedAt(address _job) external view returns (uint256 _timestamp);\\n\\n  /// @notice Last time the job was worked\\n  /// @param _job The address of the job being checked\\n  /// @return _timestamp Timestamp of the last time the job was worked\\n  function workedAt(address _job) external view returns (uint256 _timestamp);\\n\\n  // Methods\\n\\n  /// @notice Returns the liquidity credits of a given job\\n  /// @param _job The address of the job of which we want to know the liquidity credits\\n  /// @return _amount The liquidity credits of a given job\\n  function jobLiquidityCredits(address _job) external view returns (uint256 _amount);\\n\\n  /// @notice Returns the credits of a given job for the current period\\n  /// @param _job The address of the job of which we want to know the period credits\\n  /// @return _amount The credits the given job has at the current period\\n  function jobPeriodCredits(address _job) external view returns (uint256 _amount);\\n\\n  /// @notice Calculates the total credits of a given job\\n  /// @param _job The address of the job of which we want to know the total credits\\n  /// @return _amount The total credits of the given job\\n  function totalJobCredits(address _job) external view returns (uint256 _amount);\\n\\n  /// @notice Calculates how many credits should be rewarded periodically for a given liquidity amount\\n  /// @dev _periodCredits = underlying KP3Rs for given liquidity amount * rewardPeriod / inflationPeriod\\n  /// @param _liquidity The address of the liquidity to provide\\n  /// @param _amount The amount of liquidity to provide\\n  /// @return _periodCredits The amount of KP3R periodically minted for the given liquidity\\n  function quoteLiquidity(address _liquidity, uint256 _amount) external view returns (uint256 _periodCredits);\\n\\n  /// @notice Observes the current state of the liquidity pair being observed and updates TickCache with the information\\n  /// @param _liquidity The address of the liquidity pair being observed\\n  /// @return _tickCache The updated TickCache\\n  function observeLiquidity(address _liquidity) external view returns (TickCache memory _tickCache);\\n\\n  /// @notice Gifts liquidity credits to the specified job\\n  /// @param _job The address of the job being credited\\n  /// @param _amount The amount of liquidity credits to gift\\n  function forceLiquidityCreditsToJob(address _job, uint256 _amount) external;\\n\\n  /// @notice Approve a liquidity pair for being accepted in future\\n  /// @param _liquidity The address of the liquidity accepted\\n  function approveLiquidity(address _liquidity) external;\\n\\n  /// @notice Revoke a liquidity pair from being accepted in future\\n  /// @param _liquidity The liquidity no longer accepted\\n  function revokeLiquidity(address _liquidity) external;\\n\\n  /// @notice Allows anyone to fund a job with liquidity\\n  /// @param _job The address of the job to assign liquidity to\\n  /// @param _liquidity The liquidity being added\\n  /// @param _amount The amount of liquidity tokens to add\\n  function addLiquidityToJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Unbond liquidity for a job\\n  /// @dev Can only be called by the job's owner\\n  /// @param _job The address of the job being unbonded from\\n  /// @param _liquidity The liquidity being unbonded\\n  /// @param _amount The amount of liquidity being removed\\n  function unbondLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Withdraw liquidity from a job\\n  /// @param _job The address of the job being withdrawn from\\n  /// @param _liquidity The liquidity being withdrawn\\n  /// @param _receiver The address that will receive the withdrawn liquidity\\n  function withdrawLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    address _receiver\\n  ) external;\\n}\\n\\n/// @title Keep3rJobManager contract\\n/// @notice Handles the addition and withdrawal of credits from a job\\ninterface IKeep3rJobManager {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobManager#addJob is called\\n  /// @param _job The address of the job to add\\n  /// @param _jobOwner The job's owner\\n  event JobAddition(address indexed _job, address indexed _jobOwner);\\n\\n  // Errors\\n\\n  /// @notice Throws when trying to add a job that has already been added\\n  error JobAlreadyAdded();\\n\\n  /// @notice Throws when the address that is trying to register as a keeper is already a keeper\\n  error AlreadyAKeeper();\\n\\n  // Methods\\n\\n  /// @notice Allows any caller to add a new job\\n  /// @param _job Address of the contract for which work should be performed\\n  function addJob(address _job) external;\\n}\\n\\n/// @title Keep3rJobWorkable contract\\n/// @notice Handles the mechanisms jobs can pay keepers with along with the restrictions jobs can put on keepers before they can work on jobs\\ninterface IKeep3rJobWorkable {\\n  // Events\\n\\n  /// @notice Emitted when a keeper is validated before a job\\n  /// @param _gasLeft The amount of gas that the transaction has left at the moment of keeper validation\\n  event KeeperValidation(uint256 _gasLeft);\\n\\n  /// @notice Emitted when a keeper works a job\\n  /// @param _credit The address of the asset in which the keeper is paid\\n  /// @param _job The address of the job the keeper has worked\\n  /// @param _keeper The address of the keeper that has worked the job\\n  /// @param _payment The amount that has been paid out to the keeper in exchange for working the job\\n  /// @param _gasLeft The amount of gas that the transaction has left at the moment of payment\\n  event KeeperWork(address indexed _credit, address indexed _job, address indexed _keeper, uint256 _payment, uint256 _gasLeft);\\n\\n  // Errors\\n\\n  /// @notice Throws if the address claiming to be a job is not in the list of approved jobs\\n  error JobUnapproved();\\n\\n  /// @notice Throws if the amount of funds in the job is less than the payment that must be paid to the keeper that works that job\\n  error InsufficientFunds();\\n\\n  // Methods\\n\\n  /// @notice Confirms if the current keeper is registered\\n  /// @dev Can be used for general (non critical) functions\\n  /// @param _keeper The keeper being investigated\\n  /// @return _isKeeper Whether the address passed as a parameter is a keeper or not\\n  function isKeeper(address _keeper) external returns (bool _isKeeper);\\n\\n  /// @notice Confirms if the current keeper is registered and has a minimum bond of any asset.\\n  /// @dev Should be used for protected functions\\n  /// @param _keeper The keeper to check\\n  /// @param _bond The bond token being evaluated\\n  /// @param _minBond The minimum amount of bonded tokens\\n  /// @param _earned The minimum funds earned in the keepers lifetime\\n  /// @param _age The minimum keeper age required\\n  /// @return _isBondedKeeper Whether the `_keeper` meets the given requirements\\n  function isBondedKeeper(\\n    address _keeper,\\n    address _bond,\\n    uint256 _minBond,\\n    uint256 _earned,\\n    uint256 _age\\n  ) external returns (bool _isBondedKeeper);\\n\\n  /// @notice Implemented by jobs to show that a keeper performed work\\n  /// @dev Automatically calculates the payment for the keeper and pays the keeper with bonded KP3R\\n  /// @param _keeper Address of the keeper that performed the work\\n  function worked(address _keeper) external;\\n\\n  /// @notice Implemented by jobs to show that a keeper performed work\\n  /// @dev Pays the keeper that performs the work with KP3R\\n  /// @param _keeper Address of the keeper that performed the work\\n  /// @param _payment The reward that should be allocated for the job\\n  function bondedPayment(address _keeper, uint256 _payment) external;\\n\\n  /// @notice Implemented by jobs to show that a keeper performed work\\n  /// @dev Pays the keeper that performs the work with a specific token\\n  /// @param _token The asset being awarded to the keeper\\n  /// @param _keeper Address of the keeper that performed the work\\n  /// @param _amount The reward that should be allocated\\n  function directTokenPayment(\\n    address _token,\\n    address _keeper,\\n    uint256 _amount\\n  ) external;\\n}\\n\\n/// @title Keep3rJobOwnership contract\\n/// @notice Handles the ownership of the jobs\\ninterface IKeep3rJobOwnership {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobOwnership#changeJobOwnership is called\\n  /// @param _job The address of the job proposed to have a change of owner\\n  /// @param _owner The current owner of the job\\n  /// @param _pendingOwner The new address proposed to be the owner of the job\\n  event JobOwnershipChange(address indexed _job, address indexed _owner, address indexed _pendingOwner);\\n\\n  /// @notice Emitted when Keep3rJobOwnership#JobOwnershipAssent is called\\n  /// @param _job The address of the job which the proposed owner will now own\\n  /// @param _previousOwner The previous owner of the job\\n  /// @param _newOwner The new owner of the job\\n  event JobOwnershipAssent(address indexed _job, address indexed _previousOwner, address indexed _newOwner);\\n\\n  // Errors\\n\\n  /// @notice Throws when the caller of the function is not the job owner\\n  error OnlyJobOwner();\\n\\n  /// @notice Throws when the caller of the function is not the pending job owner\\n  error OnlyPendingJobOwner();\\n\\n  // Variables\\n\\n  /// @notice Maps the job to the owner of the job\\n  /// @param _job The address of the job\\n  /// @return _owner The address of the owner of the job\\n  function jobOwner(address _job) external view returns (address _owner);\\n\\n  /// @notice Maps the job to its pending owner\\n  /// @param _job The address of the job\\n  /// @return _pendingOwner The address of the pending owner of the job\\n  function jobPendingOwner(address _job) external view returns (address _pendingOwner);\\n\\n  // Methods\\n\\n  /// @notice Proposes a new address to be the owner of the job\\n  /// @param _job The address of the job\\n  /// @param _newOwner The address of the proposed new owner\\n  function changeJobOwnership(address _job, address _newOwner) external;\\n\\n  /// @notice The proposed address accepts to be the owner of the job\\n  /// @param _job The address of the job\\n  function acceptJobOwnership(address _job) external;\\n}\\n\\n/// @title Keep3rJobMigration contract\\n/// @notice Handles the migration process of jobs to different addresses\\ninterface IKeep3rJobMigration {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobMigration#migrateJob function is called\\n  /// @param _fromJob The address of the job that requests to migrate\\n  /// @param _toJob The address at which the job requests to migrate\\n  event JobMigrationRequested(address indexed _fromJob, address _toJob);\\n\\n  /// @notice Emitted when Keep3rJobMigration#acceptJobMigration function is called\\n  /// @param _fromJob The address of the job that requested to migrate\\n  /// @param _toJob The address at which the job had requested to migrate\\n  event JobMigrationSuccessful(address _fromJob, address indexed _toJob);\\n\\n  // Errors\\n\\n  /// @notice Throws when the address of the job that requests to migrate wants to migrate to its same address\\n  error JobMigrationImpossible();\\n\\n  /// @notice Throws when the _toJob address differs from the address being tracked in the pendingJobMigrations mapping\\n  error JobMigrationUnavailable();\\n\\n  /// @notice Throws when cooldown between migrations has not yet passed\\n  error JobMigrationLocked();\\n\\n  // Variables\\n\\n  /// @notice Maps the jobs that have requested a migration to the address they have requested to migrate to\\n  /// @return _toJob The address to which the job has requested to migrate to\\n  function pendingJobMigrations(address _fromJob) external view returns (address _toJob);\\n\\n  // Methods\\n\\n  /// @notice Initializes the migration process for a job by adding the request to the pendingJobMigrations mapping\\n  /// @param _fromJob The address of the job that is requesting to migrate\\n  /// @param _toJob The address at which the job is requesting to migrate\\n  function migrateJob(address _fromJob, address _toJob) external;\\n\\n  /// @notice Completes the migration process for a job\\n  /// @dev Unbond/withdraw process doesn't get migrated\\n  /// @param _fromJob The address of the job that requested to migrate\\n  /// @param _toJob The address to which the job wants to migrate to\\n  function acceptJobMigration(address _fromJob, address _toJob) external;\\n}\\n\\n/// @title Keep3rJobDisputable contract\\n/// @notice Handles the actions that can be taken on a disputed job\\ninterface IKeep3rJobDisputable is IKeep3rJobFundableCredits, IKeep3rJobFundableLiquidity {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rJobDisputable#slashTokenFromJob is called\\n  /// @param _job The address of the job from which the token will be slashed\\n  /// @param _token The address of the token being slashed\\n  /// @param _slasher The user that slashes the token\\n  /// @param _amount The amount of the token being slashed\\n  event JobSlashToken(address indexed _job, address _token, address indexed _slasher, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rJobDisputable#slashLiquidityFromJob is called\\n  /// @param _job The address of the job from which the liquidity will be slashed\\n  /// @param _liquidity The address of the liquidity being slashed\\n  /// @param _slasher The user that slashes the liquidity\\n  /// @param _amount The amount of the liquidity being slashed\\n  event JobSlashLiquidity(address indexed _job, address _liquidity, address indexed _slasher, uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws when the token trying to be slashed doesn't exist\\n  error JobTokenUnexistent();\\n\\n  /// @notice Throws when someone tries to slash more tokens than the job has\\n  error JobTokenInsufficient();\\n\\n  // Methods\\n\\n  /// @notice Allows governance or slasher to slash a job specific token\\n  /// @param _job The address of the job from which the token will be slashed\\n  /// @param _token The address of the token that will be slashed\\n  /// @param _amount The amount of the token that will be slashed\\n  function slashTokenFromJob(\\n    address _job,\\n    address _token,\\n    uint256 _amount\\n  ) external;\\n\\n  /// @notice Allows governance or a slasher to slash liquidity from a job\\n  /// @param _job The address being slashed\\n  /// @param _liquidity The address of the liquidity that will be slashed\\n  /// @param _amount The amount of liquidity that will be slashed\\n  function slashLiquidityFromJob(\\n    address _job,\\n    address _liquidity,\\n    uint256 _amount\\n  ) external;\\n}\\n\\n// solhint-disable-next-line no-empty-blocks\\ninterface IKeep3rJobs is IKeep3rJobOwnership, IKeep3rJobDisputable, IKeep3rJobMigration, IKeep3rJobManager, IKeep3rJobWorkable {\\n\\n}\\n\",\"keccak256\":\"0x272ec0a748dbd227797ca1e0b45d1af2d9d8b735128b07618f1e26143f239d4f\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rKeepers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rKeeperFundable contract\\n/// @notice Handles the actions required to become a keeper\\ninterface IKeep3rKeeperFundable {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rKeeperFundable#activate is called\\n  /// @param _keeper The keeper that has been activated\\n  /// @param _bond The asset the keeper has bonded\\n  /// @param _amount The amount of the asset the keeper has bonded\\n  event Activation(address indexed _keeper, address indexed _bond, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rKeeperFundable#withdraw is called\\n  /// @param _keeper The caller of Keep3rKeeperFundable#withdraw function\\n  /// @param _bond The asset to withdraw from the bonding pool\\n  /// @param _amount The amount of funds withdrawn\\n  event Withdrawal(address indexed _keeper, address indexed _bond, uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws when the address that is trying to register as a job is already a job\\n  error AlreadyAJob();\\n\\n  // Methods\\n\\n  /// @notice Beginning of the bonding process\\n  /// @param _bonding The asset being bonded\\n  /// @param _amount The amount of bonding asset being bonded\\n  function bond(address _bonding, uint256 _amount) external;\\n\\n  /// @notice Beginning of the unbonding process\\n  /// @param _bonding The asset being unbonded\\n  /// @param _amount Allows for partial unbonding\\n  function unbond(address _bonding, uint256 _amount) external;\\n\\n  /// @notice End of the bonding process after bonding time has passed\\n  /// @param _bonding The asset being activated as bond collateral\\n  function activate(address _bonding) external;\\n\\n  /// @notice Withdraw funds after unbonding has finished\\n  /// @param _bonding The asset to withdraw from the bonding pool\\n  function withdraw(address _bonding) external;\\n}\\n\\n/// @title Keep3rKeeperDisputable contract\\n/// @notice Handles the actions that can be taken on a disputed keeper\\ninterface IKeep3rKeeperDisputable {\\n  // Events\\n\\n  /// @notice Emitted when Keep3rKeeperDisputable#slash is called\\n  /// @param _keeper The address of the slashed keeper\\n  /// @param _slasher The user that called Keep3rKeeperDisputable#slash\\n  /// @param _amount The amount of credits slashed from the keeper\\n  event KeeperSlash(address indexed _keeper, address indexed _slasher, uint256 _amount);\\n\\n  /// @notice Emitted when Keep3rKeeperDisputable#revoke is called\\n  /// @param _keeper The address of the revoked keeper\\n  /// @param _slasher The user that called Keep3rKeeperDisputable#revoke\\n  event KeeperRevoke(address indexed _keeper, address indexed _slasher);\\n\\n  // Methods\\n\\n  /// @notice Allows governance to slash a keeper based on a dispute\\n  /// @param _keeper The address being slashed\\n  /// @param _bonded The asset being slashed\\n  /// @param _bondAmount The bonded amount being slashed\\n  /// @param _unbondAmount The pending unbond amount being slashed\\n  function slash(\\n    address _keeper,\\n    address _bonded,\\n    uint256 _bondAmount,\\n    uint256 _unbondAmount\\n  ) external;\\n\\n  /// @notice Blacklists a keeper from participating in the network\\n  /// @param _keeper The address being slashed\\n  function revoke(address _keeper) external;\\n}\\n\\n// solhint-disable-next-line no-empty-blocks\\n\\n/// @title Keep3rKeepers contract\\ninterface IKeep3rKeepers is IKeep3rKeeperDisputable {\\n\\n}\\n\",\"keccak256\":\"0x01dfc90aeb6759cf0a18e05a4c7256b59e9ce863c102196ec38ec65c9b08be72\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rParameters.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\nimport './IBaseErrors.sol';\\n\\n/// @title Keep3rParameters contract\\n/// @notice Handles and sets all the required parameters for Keep3r\\n\\ninterface IKeep3rParameters is IBaseErrors {\\n  // Events\\n\\n  /// @notice Emitted when the Keep3rHelper address is changed\\n  /// @param _keep3rHelper The address of Keep3rHelper's contract\\n  event Keep3rHelperChange(address _keep3rHelper);\\n\\n  /// @notice Emitted when the Keep3rV1 address is changed\\n  /// @param _keep3rV1 The address of Keep3rV1's contract\\n  event Keep3rV1Change(address _keep3rV1);\\n\\n  /// @notice Emitted when the Keep3rV1Proxy address is changed\\n  /// @param _keep3rV1Proxy The address of Keep3rV1Proxy's contract\\n  event Keep3rV1ProxyChange(address _keep3rV1Proxy);\\n\\n  /// @notice Emitted when the KP3R-WETH pool address is changed\\n  /// @param _kp3rWethPool The address of the KP3R-WETH pool\\n  event Kp3rWethPoolChange(address _kp3rWethPool);\\n\\n  /// @notice Emitted when bondTime is changed\\n  /// @param _bondTime The new bondTime\\n  event BondTimeChange(uint256 _bondTime);\\n\\n  /// @notice Emitted when _liquidityMinimum is changed\\n  /// @param _liquidityMinimum The new _liquidityMinimum\\n  event LiquidityMinimumChange(uint256 _liquidityMinimum);\\n\\n  /// @notice Emitted when _unbondTime is changed\\n  /// @param _unbondTime The new _unbondTime\\n  event UnbondTimeChange(uint256 _unbondTime);\\n\\n  /// @notice Emitted when _rewardPeriodTime is changed\\n  /// @param _rewardPeriodTime The new _rewardPeriodTime\\n  event RewardPeriodTimeChange(uint256 _rewardPeriodTime);\\n\\n  /// @notice Emitted when the inflationPeriod is changed\\n  /// @param _inflationPeriod The new inflationPeriod\\n  event InflationPeriodChange(uint256 _inflationPeriod);\\n\\n  /// @notice Emitted when the fee is changed\\n  /// @param _fee The new token credits fee\\n  event FeeChange(uint256 _fee);\\n\\n  // Variables\\n\\n  /// @notice Address of Keep3rHelper's contract\\n  /// @return _keep3rHelper The address of Keep3rHelper's contract\\n  function keep3rHelper() external view returns (address _keep3rHelper);\\n\\n  /// @notice Address of Keep3rV1's contract\\n  /// @return _keep3rV1 The address of Keep3rV1's contract\\n  function keep3rV1() external view returns (address _keep3rV1);\\n\\n  /// @notice Address of Keep3rV1Proxy's contract\\n  /// @return _keep3rV1Proxy The address of Keep3rV1Proxy's contract\\n  function keep3rV1Proxy() external view returns (address _keep3rV1Proxy);\\n\\n  /// @notice Address of the KP3R-WETH pool\\n  /// @return _kp3rWethPool The address of KP3R-WETH pool\\n  function kp3rWethPool() external view returns (address _kp3rWethPool);\\n\\n  /// @notice The amount of time required to pass after a keeper has bonded assets for it to be able to activate\\n  /// @return _days The required bondTime in days\\n  function bondTime() external view returns (uint256 _days);\\n\\n  /// @notice The amount of time required to pass before a keeper can unbond what he has bonded\\n  /// @return _days The required unbondTime in days\\n  function unbondTime() external view returns (uint256 _days);\\n\\n  /// @notice The minimum amount of liquidity required to fund a job per liquidity\\n  /// @return _amount The minimum amount of liquidity in KP3R\\n  function liquidityMinimum() external view returns (uint256 _amount);\\n\\n  /// @notice The amount of time between each scheduled credits reward given to a job\\n  /// @return _days The reward period in days\\n  function rewardPeriodTime() external view returns (uint256 _days);\\n\\n  /// @notice The inflation period is the denominator used to regulate the emission of KP3R\\n  /// @return _period The denominator used to regulate the emission of KP3R\\n  function inflationPeriod() external view returns (uint256 _period);\\n\\n  /// @notice The fee to be sent to governance when a user adds liquidity to a job\\n  /// @return _amount The fee amount to be sent to governance when a user adds liquidity to a job\\n  function fee() external view returns (uint256 _amount);\\n\\n  // Errors\\n\\n  /// @notice Throws if the reward period is less than the minimum reward period time\\n  error MinRewardPeriod();\\n\\n  /// @notice Throws if either a job or a keeper is disputed\\n  error Disputed();\\n\\n  /// @notice Throws if there are no bonded assets\\n  error BondsUnexistent();\\n\\n  /// @notice Throws if the time required to bond an asset has not passed yet\\n  error BondsLocked();\\n\\n  /// @notice Throws if there are no bonds to withdraw\\n  error UnbondsUnexistent();\\n\\n  /// @notice Throws if the time required to withdraw the bonds has not passed yet\\n  error UnbondsLocked();\\n\\n  // Methods\\n\\n  /// @notice Sets the Keep3rHelper address\\n  /// @param _keep3rHelper The Keep3rHelper address\\n  function setKeep3rHelper(address _keep3rHelper) external;\\n\\n  /// @notice Sets the Keep3rV1 address\\n  /// @param _keep3rV1 The Keep3rV1 address\\n  function setKeep3rV1(address _keep3rV1) external;\\n\\n  /// @notice Sets the Keep3rV1Proxy address\\n  /// @param _keep3rV1Proxy The Keep3rV1Proxy address\\n  function setKeep3rV1Proxy(address _keep3rV1Proxy) external;\\n\\n  /// @notice Sets the KP3R-WETH pool address\\n  /// @param _kp3rWethPool The KP3R-WETH pool address\\n  function setKp3rWethPool(address _kp3rWethPool) external;\\n\\n  /// @notice Sets the bond time required to activate as a keeper\\n  /// @param _bond The new bond time\\n  function setBondTime(uint256 _bond) external;\\n\\n  /// @notice Sets the unbond time required unbond what has been bonded\\n  /// @param _unbond The new unbond time\\n  function setUnbondTime(uint256 _unbond) external;\\n\\n  /// @notice Sets the minimum amount of liquidity required to fund a job\\n  /// @param _liquidityMinimum The new minimum amount of liquidity\\n  function setLiquidityMinimum(uint256 _liquidityMinimum) external;\\n\\n  /// @notice Sets the time required to pass between rewards for jobs\\n  /// @param _rewardPeriodTime The new amount of time required to pass between rewards\\n  function setRewardPeriodTime(uint256 _rewardPeriodTime) external;\\n\\n  /// @notice Sets the new inflation period\\n  /// @param _inflationPeriod The new inflation period\\n  function setInflationPeriod(uint256 _inflationPeriod) external;\\n\\n  /// @notice Sets the new fee\\n  /// @param _fee The new fee\\n  function setFee(uint256 _fee) external;\\n}\\n\",\"keccak256\":\"0x45111162f19d1cd3d1c708a4f0f80a7e85da91e396e74b9720a5ce8525d9a1bf\",\"license\":\"MIT\"},\"solidity/interfaces/peripherals/IKeep3rRoles.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4 <0.9.0;\\n\\n/// @title Keep3rRoles contract\\n/// @notice Manages the Keep3r specific roles\\ninterface IKeep3rRoles {\\n  // Events\\n\\n  /// @notice Emitted when a slasher is added\\n  /// @param _slasher Address of the added slasher\\n  event SlasherAdded(address _slasher);\\n\\n  /// @notice Emitted when a slasher is removed\\n  /// @param _slasher Address of the removed slasher\\n  event SlasherRemoved(address _slasher);\\n\\n  /// @notice Emitted when a disputer is added\\n  /// @param _disputer Address of the added disputer\\n  event DisputerAdded(address _disputer);\\n\\n  /// @notice Emitted when a disputer is removed\\n  /// @param _disputer Address of the removed disputer\\n  event DisputerRemoved(address _disputer);\\n\\n  // Variables\\n\\n  /// @notice Tracks whether the address is a slasher or not\\n  /// @param _slasher Address being checked as a slasher\\n  /// @return _isSlasher Whether the address is a slasher or not\\n  function slashers(address _slasher) external view returns (bool _isSlasher);\\n\\n  /// @notice Tracks whether the address is a disputer or not\\n  /// @param _disputer Address being checked as a disputer\\n  /// @return _isDisputer Whether the address is a disputer or not\\n  function disputers(address _disputer) external view returns (bool _isDisputer);\\n\\n  // Errors\\n\\n  /// @notice Throws if the address is already a registered slasher\\n  error SlasherExistent();\\n\\n  /// @notice Throws if caller is not a registered slasher\\n  error SlasherUnexistent();\\n\\n  /// @notice Throws if the address is already a registered disputer\\n  error DisputerExistent();\\n\\n  /// @notice Throws if caller is not a registered disputer\\n  error DisputerUnexistent();\\n\\n  /// @notice Throws if the msg.sender is not a slasher or is not a part of governance\\n  error OnlySlasher();\\n\\n  /// @notice Throws if the msg.sender is not a disputer or is not a part of governance\\n  error OnlyDisputer();\\n\\n  // Methods\\n\\n  /// @notice Registers a slasher by updating the slashers mapping\\n  function addSlasher(address _slasher) external;\\n\\n  /// @notice Removes a slasher by updating the slashers mapping\\n  function removeSlasher(address _slasher) external;\\n\\n  /// @notice Registers a disputer by updating the disputers mapping\\n  function addDisputer(address _disputer) external;\\n\\n  /// @notice Removes a disputer by updating the disputers mapping\\n  function removeDisputer(address _disputer) external;\\n}\\n\",\"keccak256\":\"0x56fc1c571eecde75d6bc696f3ed46cdcae5d56ec6635abe6680d6c342b0cea14\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60806040526203f480601f55621275006020556729a2241af62c000060215562069780602255622cd300602355601e6024553480156200003e57600080fd5b5060405162006244380380620062448339810160408190526200006191620001ce565b60016000558383838388806001600160a01b038116620000935760405162b293ed60e81b815260040160405180910390fd5b601780546001600160a01b03199081166001600160a01b0393841617909155601d80548216888416178155601b80548316888516179055601c80548316878516179055601e8054831686851690811782556000818152600e602052604090819020805490951690911790935590549054915163696a437b60e01b81529183166004830152909116915063696a437b9060240160206040518083038186803b1580156200013e57600080fd5b505afa15801562000153573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017991906200023e565b6001600160a01b03919091166000908152600f60205260409020805460ff191691151591909117905550620002699650505050505050565b80516001600160a01b0381168114620001c957600080fd5b919050565b600080600080600060a08688031215620001e757600080fd5b620001f286620001b1565b94506200020260208701620001b1565b93506200021260408701620001b1565b92506200022260608701620001b1565b91506200023260808701620001b1565b90509295509295909350565b6000602082840312156200025157600080fd5b815180151581146200026257600080fd5b9392505050565b615fcb80620002796000396000f3fe608060405234801561001057600080fd5b50600436106103ec5760003560e01c806390a4684e1161020d578063c5198abc11610121578063c5198abc146109e1578063c7ae40d0146109f4578063cb4be2bb14610a07578063cb54694d14610a1a578063cd22af1b14610a2d578063d55995fe14610a58578063dd2080d614610a6b578063ddca3f4314610a7e578063e326ac4314610a87578063ebbb619414610aa7578063ec00cdfc14610aba578063ec8ca64314610acd578063f0f346b914610af6578063f11a1d1a14610b09578063f136a09d14610b1c578063f25e311b14610b3c578063f39c38a014610b4f578063f75f9f7b14610b62578063f9d46cf214610b75578063fc253d2b14610b88578063fe75bc4614610b9157600080fd5b806390a4684e146107f4578063951dc22c14610807578063966abd001461080f57806398e90a0f146108225780639d5c33d81461084b578063a21458091461085e578063a39744b514610871578063a515366a1461089c578063a5d059ca146108af578063a676f9ff146108c2578063a7d2e784146108e2578063aac6aa9c146108eb578063ab033ea9146108fe578063af320e8114610911578063b0103b1a14610924578063b239223314610947578063b440027f1461095a578063b600702a14610985578063b7e7734014610998578063b87fcbff146109ab578063c20297f0146109ce57600080fd5b806359a2255e1161030457806359a2255e146106505780635aa6e675146106635780635ebe23f0146106765780635feeb7941461067f578063633fb68f1461069257806364bb43ee1461069b57806368a9f19c146106ae578063694798e6146106c157806369fe0e2d146106ec5780636ba42aaa146106ff5780636cf262bc146107125780636e2a9ca61461072557806372da828a1461073857806374a8f1031461074b578063768b5d901461075e5780637b40c913146107675780637c8fce231461077a578063878c723e146107825780638bb6dfa8146107ab5780638cb22b76146107be5780638fe204dd146107e157600080fd5b8063034d4c61146103f157806307b435c2146104175780630c620bce146104425780630d6a1f87146104575780631101eb411461046a57806311466d721461047f57806315006b8214610492578063160e1e31146104bd578063165e62e7146104d0578063168f92e71461050d5780631b44555e146105385780631c5a9d9c146105585780631ef94b911461056b57806321040b011461058b578063238efcbc146105b6578063274a8db4146105be57806351cff8d9146105f157806352a4de291461060457806355ea6c4714610617578063575288bf1461062a578063594a3a931461063d575b600080fd5b6104046103ff36600461591c565b610ba4565b6040519081526020015b60405180910390f35b610404610425366004615956565b601260209081526000928352604080842090915290825290205481565b61044a610caa565b60405161040e9190615ccb565b610404610465366004615b05565b610cbb565b61047d6104783660046159da565b610dc1565b005b61047d61048d366004615b05565b610f1b565b6104046104a0366004615956565b601060209081526000928352604080842090915290825290205481565b61047d6104cb36600461591c565b6110aa565b6104e36104de36600461591c565b611210565b604080518251600690810b825260208085015190910b90820152918101519082015260600161040e565b61040461051b366004615956565b600960209081526000928352604080842090915290825290205481565b61040461054636600461591c565b60056020526000908152604090205481565b61047d61056636600461591c565b6115d6565b601b5461057e906001600160a01b031681565b60405161040e9190615c42565b610404610599366004615956565b601360209081526000928352604080842090915290825290205481565b61047d61170f565b6105e16105cc36600461591c565b601a6020526000908152604090205460ff1681565b604051901515815260200161040e565b61047d6105ff36600461591c565b61179b565b61047d6106123660046159da565b6119a4565b61047d61062536600461591c565b611bd5565b61047d6106383660046159da565b611c89565b61047d61064b366004615956565b611f4c565b61047d61065e36600461591c565b611ff1565b60175461057e906001600160a01b031681565b610404601f5481565b61047d61068d36600461591c565b6120a3565b61040460215481565b61047d6106a936600461591c565b61230d565b61047d6106bc36600461591c565b61238f565b6104046106cf366004615956565b602860209081526000928352604080842090915290825290205481565b61047d6106fa366004615bc6565b612447565b6105e161070d36600461591c565b6124a7565b61040461072036600461591c565b612507565b61047d6107333660046159da565b61263d565b61047d61074636600461591c565b61278c565b61047d61075936600461591c565b612829565b61040460225481565b601e5461057e906001600160a01b031681565b61044a612924565b61057e61079036600461591c565b6001602052600090815260409020546001600160a01b031681565b6104046107b936600461591c565b612930565b6105e16107cc36600461591c565b60146020526000908152604090205460ff1681565b61047d6107ef366004615bc6565b6129d3565b61047d610802366004615956565b612a31565b61044a612b1f565b61047d61081d366004615b31565b612b2b565b61057e61083036600461591c565b6002602052600090815260409020546001600160a01b031681565b61047d61085936600461591c565b612c41565b61047d61086c36600461598f565b612cf9565b61040461087f366004615956565b600860209081526000928352604080842090915290825290205481565b61047d6108aa366004615b05565b612ec9565b61047d6108bd366004615b05565b61312a565b6104046108d036600461591c565b60296020526000908152604090205481565b61040460205481565b61047d6108f936600461591c565b6131fd565b61047d61090c36600461591c565b6132b1565b61047d61091f366004615956565b613327565b6105e161093236600461591c565b60076020526000908152604090205460ff1681565b61047d610955366004615bc6565b6137a6565b610404610968366004615956565b602560209081526000928352604080842090915290825290205481565b61047d61099336600461591c565b613806565b61047d6109a6366004615bc6565b613a2b565b6105e16109b936600461591c565b60196020526000908152604090205460ff1681565b61047d6109dc366004615a6e565b613a8b565b61047d6109ef36600461591c565b613b4d565b601c5461057e906001600160a01b031681565b61047d610a1536600461591c565b613c12565b61047d610a28366004615bc6565b613caf565b610404610a3b366004615956565b601160209081526000928352604080842090915290825290205481565b61047d610a66366004615a1b565b613d33565b61047d610a793660046159da565b613f6a565b61040460245481565b610404610a9536600461591c565b60066020526000908152604090205481565b61047d610ab5366004615bc6565b6140e7565b61047d610ac836600461591c565b614147565b61057e610adb36600461591c565b602c602052600090815260409020546001600160a01b031681565b61047d610b0436600461591c565b6141e4565b601d5461057e906001600160a01b031681565b610404610b2a36600461591c565b602a6020526000908152604090205481565b61047d610b4a3660046159da565b614298565b60185461057e906001600160a01b031681565b61047d610b7036600461591c565b6144dd565b6105e1610b83366004615ab4565b614595565b61040460235481565b61047d610b9f366004615b05565b61467e565b600080610bb083612507565b6022549091504290610bcb90610bc69083615e4c565b61476e565b6001600160a01b0385166000908152602960205260409020541115610c6f576022546001600160a01b038516600090815260296020526040902054610c109042615e4c565b10610c4c576022546001600160a01b038516600090815260296020526040902054610c3b9190615db1565b610c459082615e4c565b9050610c85565b6001600160a01b038416600090815260296020526040902054610c459082615e4c565b610c784261476e565b610c829082615e4c565b90505b610c8f8183614788565b610c9885612930565b610ca29190615db1565b949350505050565b6060610cb660266147b2565b905090565b6000610cc86026846147c6565b15610dbb576000610cd884611210565b90508060400151600014610db9576001600160a01b0384166000908152600f602052604081205460ff16610d19578160200151610d1490615ebe565b610d1f565b81602001515b601d5460225460405163a0d2710760e01b8152929350610db0926001600160a01b039092169163a0d2710791610d5b9189918791600401615d82565b60206040518083038186803b158015610d7357600080fd5b505afa158015610d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dab9190615bdf565b6147e8565b92505050610dbb565b505b92915050565b6001600160a01b038381166000908152600160205260409020548491163314610dfd57604051636efb4f4160e11b815260040160405180910390fd5b602054610e0a9042615db1565b6001600160a01b03808616600081815260126020908152604080832094891680845294825280832095909555918152601382528381209281529190529081208054849290610e59908490615db1565b90915550610e6a90508484846147f9565b6001600160a01b038085166000908152602860209081526040808320938716835292905220548015801590610ea95750602154610ea78286614a07565b105b15610ec757604051636f447fcd60e11b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03167f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de85604051610f0c91815260200190565b60405180910390a35050505050565b3360008181526007602052604090205460ff1615610f4c5760405163ad2fdf3b60e01b815260040160405180910390fd5b610f576015826147c6565b610f735760405162941a5760e11b815260040160405180910390fd5b610f7c81614b25565b15610fd7576001600160a01b038116600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f7683398151915293610fce9390929091615d9b565b60405180910390a25b6001600160a01b0381166000908152600a60205260409020548211156110565761100081614cfb565b6001600160a01b038116600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f768339815191529361104d9390929091615d9b565b60405180910390a25b611061818484614d89565b601b546001600160a01b03808516918382169116600080516020615f568339815191528561108d614e6d565b6040805192835260208301919091520160405180910390a4505050565b6017546001600160a01b031633146110d5576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166110fc5760405163d92e233d60e01b815260040160405180910390fd5b601e80546001600160a01b038084166001600160a01b031992831681179093556000838152600e6020526040908190208054909316909317909155601d54915163696a437b60e01b815291169063696a437b9061115d908490600401615c42565b60206040518083038186803b15801561117557600080fd5b505afa158015611189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ad9190615b68565b6001600160a01b0382166000908152600f602052604090819020805460ff191692151592909217909155517f9bb1515b0fc2645a3f011162460a22fdd512e0bca265e7dc9ba6bceae8930afa90611205908390615c42565b60405180910390a150565b60408051606081018252600080825260208201819052918101919091526112364261476e565b6001600160a01b0383166000908152602b602052604090206001015414156112ac57506001600160a01b03166000908152602b602090815260409182902082516060810184528154600681810b810b810b8352600160381b909104810b810b900b92810192909252600101549181019190915290565b6000806112c060225442610bc69190615e4c565b6001600160a01b0385166000908152602b602052604090206001015490915081141561142457604080516001808252818301909252600091602080830190803683375050506001600160a01b0386166000908152602b602052604090205490915060060b61132d4261476e565b6113379042615e4c565b8260008151811061134a5761134a615f27565b63ffffffff909216602092830291909101820152601d546001600160a01b038881166000908152600e90935260409283902054925163dc686d9160e01b81529181169263dc686d91926113a69291909116908690600401615c56565b60606040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f69190615b83565b600692830b90920b80885291955061141091839150615dfc565b600690810b900b6020860152506115ad9050565b6001600160a01b0384166000908152602b60205260409020600101548111156115ad576040805160028082526060820183526000926020830190803683370190505090506114714261476e565b61147b9042615e4c565b8160008151811061148e5761148e615f27565b602002602001019063ffffffff16908163ffffffff16815250506022546114b44261476e565b6114be9042615e4c565b6114c89190615db1565b816001815181106114db576114db615f27565b63ffffffff909216602092830291909101820152601d546001600160a01b038781166000908152600e909352604080842054905163dc686d9160e01b81529282169263dc686d91926115339216908690600401615c56565b60606040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190615b83565b600692830b90920b808852919550915061159e908290615dfc565b600690810b900b602086015250505b81156115c6576115bc4261476e565b60408401526115ce565b600060408401525b50505b919050565b3360009081526007602052604090205460ff1615611607576040516362e6201d60e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b038516845290915290205461164857604051636258f48160e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b0385168452909152902054421161168b57604051630fd0eeef60e11b815260040160405180910390fd5b3360008181526011602090815260408083206001600160a01b03861684529091528120819055906116bc9083614e87565b9050816001600160a01b0316336001600160a01b03167f3673530133b6da67e9854f605b0cfa7bb9798cd33c18036dfc10d8da7c4d4a758360405161170391815260200190565b60405180910390a35050565b6018546001600160a01b0316331461173a57604051637ef5703160e11b815260040160405180910390fd5b60188054601780546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b69161179191615c42565b60405180910390a1565b600260005414156117c75760405162461bcd60e51b81526004016117be90615d4b565b60405180910390fd5b600260009081553381526013602090815260408083206001600160a01b038516845290915290205461180c5760405163184c088160e21b815260040160405180910390fd5b3360009081526012602090815260408083206001600160a01b0385168452909152902054421161184f576040516327cfdcb760e01b815260040160405180910390fd5b3360009081526007602052604090205460ff1615611880576040516362e6201d60e01b815260040160405180910390fd5b3360009081526013602090815260408083206001600160a01b0385811680865291909352922054601b5490929116141561191357601c5460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401600060405180830381600087803b1580156118fa57600080fd5b505af115801561190e573d6000803e3d6000fd5b505050505b3360008181526013602090815260408083206001600160a01b0387168085529083528184208490558484526012835281842081855290925282209190915561195b9183614f9e565b6040518181526001600160a01b0383169033907f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63989060200160405180910390a350506001600055565b600260005414156119c75760405162461bcd60e51b81526004016117be90615d4b565b60026000556119d76026836147c6565b6119f45760405163e0b6aead60e01b815260040160405180910390fd5b6119ff6015846147c6565b611a1c57604051636211d34960e01b815260040160405180910390fd5b6001600160a01b0383166000908152600d60205260409020611a3e9083614ff9565b50611a488361500e565b6021546001600160a01b03808516600090815260286020908152604080832093871683529290522054611a8690611a80908490615db1565b84614a07565b1015611aa557604051636f447fcd60e11b815260040160405180910390fd5b6001600160a01b038316600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f7683398151915293611af29390929091615d9b565b60405180910390a2611b0f6001600160a01b03831633308461506c565b6001600160a01b03808416600090815260286020908152604080832093861683529290529081208054839290611b46908490615db1565b90915550611b599050610dab8284614a07565b6001600160a01b0384166000908152600b602052604081208054909190611b81908490615db1565b909155505060405181815233906001600160a01b0384811691908616907f4e186bc75a2220191b826baff3ee63c3e970e94e58a9007ff94c9a7b8e6ebb3f9060200160405180910390a45050600160005550565b336000908152601a602052604090205460ff16611c0557604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16611c3e576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19169055513392917fe02b2375d8fb4aef3e5bc5d53bffcf70b6f185c5c93e69dcbe8b6cfc58e837e291a350565b60026000541415611cac5760405162461bcd60e51b81526004016117be90615d4b565b6002600055611cbc6015846147c6565b611cd957604051636211d34960e01b815260040160405180910390fd5b601b546001600160a01b0383811691161415611d075760405162822d9760e71b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b038416906370a0823190611d36903090600401615c42565b60206040518083038186803b158015611d4e57600080fd5b505afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190615bdf565b9050611d9d6001600160a01b03841633308561506c565b600081846001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611dcc9190615c42565b60206040518083038186803b158015611de457600080fd5b505afa158015611df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1c9190615bdf565b611e269190615e4c565b9050600061271060245483611e3b9190615ddd565b611e459190615dc9565b9050611e518183615e4c565b6001600160a01b038088166000908152600960209081526040808320938a1683529290529081208054909190611e88908490615db1565b90915550506001600160a01b0380871660009081526025602090815260408083208985168085529252909120429055601754611ec5921683614f9e565b6001600160a01b0386166000908152600c60205260409020611ee79086614ff9565b50336001600160a01b0316856001600160a01b0316876001600160a01b03167fec1a37d4a331a5059081e0fb5da1735e7890900cd215a4fb1e9f2779fd7b83eb85604051611f3791815260200190565b60405180910390a45050600160005550505050565b6001600160a01b038281166000908152600160205260409020548391163314611f8857604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03838116600081815260026020908152604080832080546001600160a01b031916888716908117909155600190925280832054905191941692917fa8bad3f0b781e1d954af9945167d5f80bfe5e57930f17c93843187c77557a6b891a4505050565b6001600160a01b03818116600090815260026020526040902054829116331461202d5760405163cfe9663360e01b815260040160405180910390fd5b6001600160a01b03828116600081815260016020908152604080832080546002909352818420805487166001600160a01b031980861691909117909255805490911690555193169283929133917fcf30c54296d5eee76168b564c59c50578d49c271733a470f32707c8cfbc88a8b9190a4505050565b3360008181526007602052604090205460ff16156120d45760405163ad2fdf3b60e01b815260040160405180910390fd5b6120df6015826147c6565b6120fb5760405162941a5760e11b815260040160405180910390fd5b61210481614b25565b1561215f576001600160a01b038116600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f76833981519152936121569390929091615d9b565b60405180910390a25b601d546001600160a01b038381166000908152600860209081526040808320601b548516845290915280822054905163435b21c160e01b8152600481019190915290928392839291169063435b21c19060240160606040518083038186803b1580156121ca57600080fd5b505afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190615bf8565b9250925092506000612212614e6d565b90506000612222828486886150aa565b6001600160a01b0387166000908152600a60205260409020549091508111156122bc5761224e86614cfb565b6001600160a01b038616600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f768339815191529361229b9390929091615d9b565b60405180910390a26122ab614e6d565b91506122b9828486886150aa565b90505b6122c7868883614d89565b601b5460408051838152602081018590526001600160a01b038a8116938a821693911691600080516020615f56833981519152910160405180910390a450505050505050565b6017546001600160a01b03163314612338576040516354348f0360e01b815260040160405180910390fd5b612343602682615107565b61236057604051630a8d08b160e01b815260040160405180910390fd5b7f51199d699bdfd516fa88dd0d2f8487c40c147b4867acaa23adc8d4df6b098e56816040516112059190615c42565b6017546001600160a01b031633146123ba576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16156123f45760405163546da66560e11b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090819020805460ff19166001179055517f049ccb28ab796d3225573a065712f6e7754487ced56056cda8889c337511807b90611205908390615c42565b6017546001600160a01b03163314612472576040516354348f0360e01b815260040160405180910390fd5b60248190556040518181527f4c10ca068ff7002cf5da78f2f697d1e91f6f0ac27f7344b28e8ef25263f87e5d90602001611205565b60006124b1614e6d565b602e556124bf6003836147c6565b156115d1577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb602e546040516124f791815260200190565b60405180910390a1506001919050565b6000805b6001600160a01b0383166000908152600d6020526040902061252c9061511c565b811015612637576001600160a01b0383166000908152600d602052604081206125559083615126565b90506125626026826147c6565b1561262457600061257282611210565b90508060400151600014612622576001600160a01b0382166000908152600f602052604081205460ff166125b35781602001516125ae90615ebe565b6125b9565b81602001515b601d546001600160a01b03888116600090815260286020908152604080832089851684529091529081902054602254915163a0d2710760e01b815294955061261494929093169263a0d2710792610d5b928791600401615d82565b61261e9086615db1565b9450505b505b508061262f81615e8f565b91505061250b565b50919050565b3360009081526019602052604090205460ff1661266d57604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff166126a6576040516310cec38560e21b815260040160405180910390fd5b6126b18383836147f9565b60175460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb926126e592909116908590600401615cb2565b602060405180830381600087803b1580156126ff57600080fd5b505af192505050801561272f575060408051601f3d908101601f1916820190925261272c91810190615b68565b60015b6127385761273a565b505b336001600160a01b0316836001600160a01b03167f6e10247c3c094d220ee99436c164b7f38d63b335a20ed817cbefaee4bb02d20e848460405161277f929190615cb2565b60405180910390a3505050565b6017546001600160a01b031633146127b7576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166127de5760405163d92e233d60e01b815260040160405180910390fd5b601d80546001600160a01b0319166001600160a01b0383161790556040517f71973fd672e51deb8f739b1f7e1eab991936645acd6f83e2bde6eeeaff5490b090611205908390615c42565b3360009081526019602052604090205460ff1661285957604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16612892576040516310cec38560e21b815260040160405180910390fd5b61289d600382615107565b50601b546001600160a01b038083166000818152600860209081526040808320949095168083529381528482205492825260138152848220848352905292909220546128eb92849291615132565b60405133906001600160a01b038316907f038a17b9b553c0c3fc2ed14b957a5d8420a1666fd2efe5c1b3fe5f23eea61bb390600090a350565b6060610cb660156147b2565b60008061293c83612507565b6022546001600160a01b038516600090815260296020526040902054919250906129669042615e4c565b1015610dbb5760008111612992576001600160a01b0383166000908152600a60205260409020546129cc565b6001600160a01b0383166000908152600b6020908152604080832054600a909252909120546129c2908390615ddd565b6129cc9190615dc9565b9150612637565b6017546001600160a01b031633146129fe576040516354348f0360e01b815260040160405180910390fd5b60208181556040518281527fc8d443472c9783cc36f8f5f5091f08ce9f37fc2f9e6d79cf1d9aaf40a433fee29101611205565b6001600160a01b038281166000908152600160205260409020548391163314612a6d57604051636efb4f4160e11b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03161415612aa05760405163afe7ad4960e01b815260040160405180910390fd5b6001600160a01b038381166000818152602c6020908152604080832080546001600160a01b0319169588169586179055602d825280832094835293905282902042905590517fff0456758201108de53c0ff04c69988d4678ff455b2ce6f733328cf85722c04c90612b12908590615c42565b60405180910390a2505050565b6060610cb660036147b2565b6017546001600160a01b03163314612b56576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116612b7d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612bde576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612bd8573d6000803e3d6000fd5b50612bf2565b612bf26001600160a01b0384168284614f9e565b604080516001600160a01b0385811682526020820185905283168183015290517f9a3055ded8c8b5f21bbf4946c5afab6e1fa8b3f057922658e5e1ade125fb0b1e9181900360600190a1505050565b6017546001600160a01b03163314612c6c576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1615612ca65760405163274e25dd60e11b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090819020805460ff19166001179055517f8addc69f897ecca0e41d70ed4ff9d75a9148a615a0fbda8597e53aea2684302f90611205908390615c42565b6001600160a01b038381166000908152600160205260409020548491163314612d3557604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b038216612d5c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516600090815260136020908152604080832093871683529290522054612d9f5760405163184c088160e21b815260040160405180910390fd5b6001600160a01b038085166000908152601260209081526040808320938716835292905220544211612de4576040516327cfdcb760e01b815260040160405180910390fd5b6001600160a01b03841660009081526007602052604090205460ff1615612e1e576040516362e6201d60e01b815260040160405180910390fd5b6001600160a01b0380851660008181526013602090815260408083209488168084529482528083208054908490559383526012825280832085845290915281205590612e6b908483614f9e565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffdb7893bf11f50c621e59cc7f1cf540e94295cb27ca869ec7ed7618ca792886284604051612eba91815260200190565b60405180910390a45050505050565b60026000541415612eec5760405162461bcd60e51b81526004016117be90615d4b565b600260009081553381526007602052604090205460ff1615612f21576040516362e6201d60e01b815260040160405180910390fd5b612f2c6015336147c6565b15612f4a5760405163d7229c4360e01b815260040160405180910390fd5b601f54612f579042615db1565b3360009081526011602090815260408083206001600160a01b03871680855292528083209390935591516370a0823160e01b81529091906370a0823190612fa2903090600401615c42565b60206040518083038186803b158015612fba57600080fd5b505afa158015612fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff29190615bdf565b90506130096001600160a01b03841633308561506c565b6040516370a0823160e01b815281906001600160a01b038516906370a0823190613037903090600401615c42565b60206040518083038186803b15801561304f57600080fd5b505afa158015613063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130879190615bdf565b6130919190615e4c565b336000908152601460209081526040808320805460ff19166001179055601082528083206001600160a01b03881684529091528120805492945084929091906130db908490615db1565b90915550506040518281526001600160a01b0384169033907fa7e66869262026842e8d81f5e6806cdc8d846e27c824e2e22f4fe51442771b349060200160405180910390a35050600160005550565b6020546131379042615db1565b3360008181526012602090815260408083206001600160a01b03881680855290835281842095909555928252600881528282209382529290925281208054839290613183908490615e4c565b90915550503360009081526013602090815260408083206001600160a01b0386168452909152812080548392906131bb908490615db1565b90915550506040518181526001600160a01b0383169033907f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de90602001611703565b6017546001600160a01b03163314613228576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16613261576040516336fe17e760e21b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090819020805460ff19169055517f3ed8cbce8cab40e59282f1743e2b607effa08b5cbe0111bb4721134f2f80d02590611205908390615c42565b6017546001600160a01b031633146132dc576040516354348f0360e01b815260040160405180910390fd5b601880546001600160a01b0319166001600160a01b0383161790556040517fe987aaedf9d279143bdf1eee16cf1d0feb47742867d81083df8d6cd0a5ac857f90611205908390615c42565b6001600160a01b03818116600090815260016020526040902054829116331461336357604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff16806133a257506001600160a01b03821660009081526007602052604090205460ff165b156133c05760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b038381166000908152602c60205260409020548116908316146133fd57604051630ced616b60e21b815260040160405180910390fd5b6001600160a01b038084166000908152602d602090815260408083209386168352929052205461342f90603c90615db1565b42101561344f576040516356248e9760e01b815260040160405180910390fd5b6134588361500e565b6134618261500e565b6001600160a01b0383166000908152600c602052604081206134829061511c565b1115613564576001600160a01b0383166000908152600c602052604081206134aa9082615126565b6001600160a01b03808616600090815260096020818152604080842085871680865290835281852054958a1685529282528084209284529190528120805493945091926134f8908490615db1565b90915550506001600160a01b0380851660008181526009602090815260408083209486168352938152838220829055918152600c9091522061353a9082615107565b506001600160a01b0383166000908152600c6020526040902061355d9082614ff9565b5050613461565b6001600160a01b0383166000908152600d602052604081206135859061511c565b1115613667576001600160a01b0383166000908152600d602052604081206135ad9082615126565b6001600160a01b03808616600090815260286020818152604080842085871680865290835281852054958a1685529282528084209284529190528120805493945091926135fb908490615db1565b90915550506001600160a01b038085166000908152602860209081526040808320858516845282528083208390559286168252600d90522061363d9082614ff9565b506001600160a01b0384166000908152600d602052604090206136609082615107565b5050613564565b6001600160a01b038084166000908152600b602052604080822054928516825281208054909190613699908490615db1565b90915550506001600160a01b038084166000908152600b60209081526040808320839055600a909152808220549285168252812080549091906136dd908490615db1565b90915550506001600160a01b0383166000908152600a602090815260408083208390556029909152812055613713601584615107565b506001600160a01b03808416600081815260016020908152604080832080546001600160a01b031990811690915560028352818420805482169055602d8352818420958816808552958352818420849055938352602c909152908190208054909216909155517f9b712b63e3fb1325fa042d3c238ce8144937875065900528ea1e4f3b00f379f290612b12908690615c42565b6017546001600160a01b031633146137d1576040516354348f0360e01b815260040160405180910390fd5b60238190556040518181527fbdcfd7b8482f31cff6a87c362d9e2e3887f4cdc2018c7c485d8e78a7b2fadb6990602001611205565b6017546001600160a01b03163314613831576040516354348f0360e01b815260040160405180910390fd5b61383c602682614ff9565b6138595760405163f25e6b9f60e01b815260040160405180910390fd5b806001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561389257600080fd5b505afa1580156138a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ca9190615939565b6001600160a01b038281166000908152600e60205260409081902080546001600160a01b0319169383169384179055601d54905163696a437b60e01b815291169163696a437b9161391e9190600401615c42565b60206040518083038186803b15801561393657600080fd5b505afa15801561394a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396e9190615b68565b6001600160a01b0382166000908152600f60205260409020805460ff191691151591909117905561399e81611210565b6001600160a01b0382166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b161791909117815591810151600190920191909155517fabfa8db4d238fa78bf4e15fcc91328dd35f3978f200e2857a56bb719732b7b0b90611205908390615c42565b6017546001600160a01b03163314613a56576040516354348f0360e01b815260040160405180910390fd5b601f8190556040518181527fd319ef78d2b690bb773fcccc2d096306bac7c9222dd0bb6b300f461e4a376b4390602001611205565b3360009081526019602052604090205460ff16613abb57604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03841660009081526007602052604090205460ff16613af4576040516310cec38560e21b815260040160405180910390fd5b613b0084848484615132565b336001600160a01b0385167f10a73de7ab6e9023aa6e2bc23f7abf4dcef591487e7e55f44c00e34fe60d56db613b368486615db1565b60405190815260200160405180910390a350505050565b613b586015826147c6565b15613b7657604051630809740d60e01b815260040160405180910390fd5b6001600160a01b03811660009081526014602052604090205460ff1615613bb057604051632f3d320560e01b815260040160405180910390fd5b613bbb601582614ff9565b506001600160a01b03811660008181526001602052604080822080546001600160a01b03191633908117909155905190917fed3faef50715743626cd57de74281a2b17cdbfc11c0486feda541fb911e0293d91a350565b6017546001600160a01b03163314613c3d576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116613c645760405163d92e233d60e01b815260040160405180910390fd5b601c80546001600160a01b0319166001600160a01b0383161790556040517feb931b4b5a98d20a6b1e6693a7c59d8e337a06e2f1473bb776e19251db7ae25090611205908390615c42565b6017546001600160a01b03163314613cda576040516354348f0360e01b815260040160405180910390fd5b62015180811015613cfe57604051633f384aad60e21b815260040160405180910390fd5b60228190556040518181527f54aafa56429e22230b52f1495588ffc632277d74f3a85ec755e13ac50c1584d990602001611205565b60026000541415613d565760405162461bcd60e51b81526004016117be90615d4b565b600260009081556001600160a01b03858116825260016020526040909120548591163314613d9757604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03808616600090815260256020908152604080832093881683529290522054613dc990603c90615db1565b4211613de857604051631e0b407560e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290522054831115613e2e5760405163024ae82d60e61b815260040160405180910390fd5b6001600160a01b03851660009081526007602052604090205460ff1615613e685760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290529081208054859290613e9f908490615e4c565b90915550613eb990506001600160a01b0385168385614f9e565b6001600160a01b03808616600090815260096020908152604080832093881683529290522054613f07576001600160a01b0385166000908152600c60205260409020613f059085615107565b505b816001600160a01b0316846001600160a01b0316866001600160a01b03167f53e982dd9ec088d634c74c98fbbc161f808b4b6469a26c657120b9a31cb34bfe86604051613f5691815260200190565b60405180910390a450506001600055505050565b3360008181526007602052604090205460ff1615613f9b5760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1615613fd5576040516362e6201d60e01b815260040160405180910390fd5b613fe06015826147c6565b613ffc5760405162941a5760e11b815260040160405180910390fd5b6001600160a01b038082166000908152600960209081526040808320938816835292905220548211156140425760405163356680b760e01b815260040160405180910390fd5b6001600160a01b03808216600090815260096020908152604080832093881683529290529081208054849290614079908490615e4c565b9091555061409390506001600160a01b0385168484614f9e565b826001600160a01b0316816001600160a01b0316856001600160a01b0316600080516020615f56833981519152856140c9614e6d565b6040805192835260208301919091520160405180910390a450505050565b6017546001600160a01b03163314614112576040516354348f0360e01b815260040160405180910390fd5b60218190556040518181527f24d51b415694a791b1c77df7817c075ac82b83ce611bcd8627d2e66cf37aa3e790602001611205565b6017546001600160a01b03163314614172576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166141995760405163d92e233d60e01b815260040160405180910390fd5b601b80546001600160a01b0319166001600160a01b0383161790556040517f1d1a3e7caf0717056e48dc8aefa54d806c7af86324fece4e5d49f8e1f01f84bf90611205908390615c42565b6017546001600160a01b0316331461420f576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1661424857604051633ca0d42760e11b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090819020805460ff19169055517f5e8bd21d0a98cb2caf33706e56139ff40ffbdca7ec5d9d412a0a2292496dc70e90611205908390615c42565b3360009081526019602052604090205460ff166142c857604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff16614301576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b0383166000908152600c6020526040902061432390836147c6565b61434057604051632eda7a1160e01b815260040160405180910390fd5b6001600160a01b038084166000908152600960209081526040808320938616835292905220548111156143855760405162919bed60e01b815260040160405180910390fd5b60175460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb926143b992909116908590600401615cb2565b602060405180830381600087803b1580156143d357600080fd5b505af1925050508015614403575060408051601f3d908101601f1916820190925261440091810190615b68565b60015b61440c5761440e565b505b6001600160a01b03808416600090815260096020908152604080832093861683529290529081208054839290614445908490615e4c565b90915550506001600160a01b03808416600090815260096020908152604080832093861683529290522054614498576001600160a01b0383166000908152600c602052604090206144969083615107565b505b336001600160a01b0316836001600160a01b03167f20262b97130b5cb8f80624eed2733df2b05db4a0789b4a3d0157e1d318333104848460405161277f929190615cb2565b336000908152601a602052604090205460ff1661450d57604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff1615614547576040516304ee891b60e11b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055513392917f070125a1c0f5202217aae14ec399abfaaa13c2fd98a91d43bd3a897dd4751e8091a350565b600061459f614e6d565b602e556145ad6003876147c6565b80156145de57506001600160a01b038087166000908152600860209081526040808320938916835292905220548411155b801561460257506001600160a01b0386166000908152600560205260409020548311155b801561463157506001600160a01b038616600090815260066020526040902054829061462e9042615e4c565b10155b15614675577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb602e5460405161466991815260200190565b60405180910390a15060015b95945050505050565b6017546001600160a01b031633146146a9576040516354348f0360e01b815260040160405180910390fd5b6146b46015836147c6565b6146d157604051636211d34960e01b815260040160405180910390fd5b6146da8261500e565b6001600160a01b0382166000908152600a602052604081208054839290614702908490615db1565b90915550506001600160a01b038216600081815260296020908152604080832054600a909252918290205491517f5abcf5031fdbd3badb9d1e09094208de329aee72730e87650f346584205d23d192614762928252602082015260400190565b60405180910390a25050565b60006022548261477e9190615eaa565b610dbb9083615e4c565b6000602254831015612637576022546147a18385615ddd565b6147ab9190615dc9565b9050610dbb565b606060006147bf83615288565b9392505050565b6001600160a01b038116600090815260018301602052604081205415156147bf565b6000610dbb826022546023546152e4565b6002600054141561481c5760405162461bcd60e51b81526004016117be90615d4b565b600260009081556001600160a01b0384168152600d6020526040902061484290836147c6565b61485e576040516241cfa560e21b815260040160405180910390fd5b6001600160a01b038084166000908152602860209081526040808320938616835292905220548111156148a45760405163435b562560e01b815260040160405180910390fd5b6148ad83615392565b60006148bc610dab8385614a07565b6001600160a01b0385166000908152600b602052604090205490915015614972576001600160a01b0384166000908152600b6020908152604080832054600a9092529091205461490d908390615ddd565b6149179190615dc9565b6001600160a01b0385166000908152600a60205260408120805490919061493f908490615e4c565b90915550506001600160a01b0384166000908152600b60205260408120805483929061496c908490615e4c565b90915550505b6001600160a01b038085166000908152602860209081526040808320938716835292905290812080548492906149a9908490615e4c565b90915550506001600160a01b038085166000908152602860209081526040808320938716835292905220546149fc576001600160a01b0384166000908152600d602052604090206149fa9084615107565b505b505060016000555050565b6001600160a01b0381166000908152602b602052604081206001015415610dbb576001600160a01b0382166000908152600f602052604081205460ff16614a79576001600160a01b0383166000908152602b6020526040902054614a7490600160381b900460060b615ebe565b614a9d565b6001600160a01b0383166000908152602b6020526040902054600160381b900460060b5b601d5460225460405163a0d2710760e01b81529293506001600160a01b039091169163a0d2710791614ad59188918691600401615d82565b60206040518083038186803b158015614aed57600080fd5b505afa158015614b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190615bdf565b6000614b304261476e565b6001600160a01b03831660009081526029602052604090205410156115d157614b6060225442610bc69190615e4c565b6001600160a01b03831660009081526029602052604090205411614bd657614b8782615392565b6001600160a01b0382166000908152600b6020908152604080832054600a90925290912055614bb54261476e565b6001600160a01b038316600090815260296020526040902055506001919050565b6022546001600160a01b038316600090815260296020526040902054614bfc9042615e4c565b10614c5857614c0a82615392565b6001600160a01b0382166000908152600b6020908152604080832054600a83528184205560225460299092528220805491929091614c49908490615db1565b90915550600191506115d19050565b614c614261476e565b6001600160a01b0383166000908152602a602052604090205410156115d1576001600160a01b0382166000908152600b6020526040902054614ca283615392565b6001600160a01b0383166000908152600b6020908152604080832054600a909252909120548291614cd291615ddd565b614cdc9190615dc9565b6001600160a01b0384166000908152600a602052604090205550919050565b6001600160a01b038116600090815260296020526040902054614d4090614d229042615e4c565b6001600160a01b0383166000908152600b6020526040902054614788565b6001600160a01b0382166000908152600a602052604081208054909190614d68908490615db1565b90915550506001600160a01b03166000908152602960205260409020429055565b6001600160a01b0383166000908152600a6020526040902054811115614dc25760405163356680b760e01b815260040160405180910390fd5b6001600160a01b0383166000908152602a60209081526040808320429055600a90915281208054839290614df7908490615e4c565b90915550506001600160a01b038083166000908152600860209081526040808320601b5490941683529290529081208054839290614e36908490615db1565b90915550506001600160a01b03821660009081526005602052604081208054839290614e63908490615db1565b9091555050505050565b6000603f5a614e7d906040615ddd565b610cb69190615dc9565b6001600160a01b038216600090815260066020526040812054614ec0576001600160a01b03831660009081526006602052604090204290555b614ecb600384614ff9565b50506001600160a01b03808316600081815260106020908152604080832094861680845294825280832080549084905593835260088252808320948352939052918220805491928392614f1f908490615db1565b9091555050601b546001600160a01b0383811691161415610dbb57601b54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b158015614f8057600080fd5b505af1158015614f94573d6000803e3d6000fd5b5050505092915050565b614ff48363a9059cbb60e01b8484604051602401614fbd929190615cb2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526153b7565b505050565b60006147bf836001600160a01b038416615489565b61501781614b25565b5061502181614cfb565b6001600160a01b0381166000908152600a6020908152604080832054600b9092529091205461505091906154d8565b6001600160a01b039091166000908152600a6020526040902055565b6040516001600160a01b03808516602483015283166044820152606481018290526150a49085906323b872dd60e01b90608401614fbd565b50505050565b6000808486602e546150bc9190615e4c565b6150c69190615db1565b9050670de0b6b3a7640000846127106150df8685615ddd565b6150e99190615dc9565b6150f39190615ddd565b6150fd9190615dc9565b9695505050505050565b60006147bf836001600160a01b0384166154ee565b6000610dbb825490565b60006147bf83836155e1565b601b546001600160a01b0384811691161461520a576017546001600160a01b038085169163a9059cbb91166151678486615db1565b6040518363ffffffff1660e01b8152600401615184929190615cb2565b602060405180830381600087803b15801561519e57600080fd5b505af19250505080156151ce575060408051601f3d908101601f191682019092526151cb91810190615b68565b60015b615208573d8080156151fc576040519150601f19603f3d011682016040523d82523d6000602084013e615201565b606091505b505061520a565b505b6001600160a01b03808516600090815260086020908152604080832093871683529290529081208054849290615241908490615e4c565b90915550506001600160a01b0380851660009081526013602090815260408083209387168352929052908120805483929061527d908490615e4c565b909155505050505050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156152d857602002820191906000526020600020905b8154815260200190600101908083116152c4575b50505050509050919050565b60008080600019858709858702925082811083820303915050806000141561531e576000841161531357600080fd5b5082900490506147bf565b80841161532a57600080fd5b600084868809600260036001881981018916988990049182028318808302840302808302840302808302840302808302840302808302840302918202909203026000889003889004909101858311909403939093029303949094049190911702949350505050565b61539b8161560b565b6001600160a01b039091166000908152600b6020526040902055565b600061540c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166157ef9092919063ffffffff16565b805190915015614ff4578080602001905181019061542a9190615b68565b614ff45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016117be565b60008181526001830160205260408120546154d057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610dbb565b506000610dbb565b60008183106154e757816147bf565b5090919050565b600081815260018301602052604081205480156155d7576000615512600183615e4c565b855490915060009061552690600190615e4c565b905081811461558b57600086600001828154811061554657615546615f27565b906000526020600020015490508087600001848154811061556957615569615f27565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061559c5761559c615f11565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610dbb565b6000915050610dbb565b60008260000182815481106155f8576155f8615f27565b9060005260206000200154905092915050565b60006156164261476e565b601e546001600160a01b03166000908152602b6020526040902060010154146156ad57601e5461564e906001600160a01b0316611210565b601e546001600160a01b03166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b1617919091178155910151600191909101555b60005b6001600160a01b0383166000908152600d602052604090206156d19061511c565b811015612637576001600160a01b0383166000908152600d602052604081206156fa9083615126565b90506157076026826147c6565b156157dc576157154261476e565b6001600160a01b0382166000908152602b60205260409020600101541461579b5761573f81611210565b6001600160a01b0382166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b16179190911781559101516001909101555b6001600160a01b038085166000908152602860209081526040808320938516835292905220546157cf90610dab9083614a07565b6157d99084615db1565b92505b50806157e781615e8f565b9150506156b0565b6060610ca2848460008585843b6158485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117be565b600080866001600160a01b031685876040516158649190615c26565b60006040518083038185875af1925050503d80600081146158a1576040519150601f19603f3d011682016040523d82523d6000602084013e6158a6565b606091505b50915091506158b68282866158c1565b979650505050505050565b606083156158d05750816147bf565b8251156158e05782518084602001fd5b8160405162461bcd60e51b81526004016117be9190615d18565b805180151581146115d157600080fd5b8051600681900b81146115d157600080fd5b60006020828403121561592e57600080fd5b81356147bf81615f3d565b60006020828403121561594b57600080fd5b81516147bf81615f3d565b6000806040838503121561596957600080fd5b823561597481615f3d565b9150602083013561598481615f3d565b809150509250929050565b6000806000606084860312156159a457600080fd5b83356159af81615f3d565b925060208401356159bf81615f3d565b915060408401356159cf81615f3d565b809150509250925092565b6000806000606084860312156159ef57600080fd5b83356159fa81615f3d565b92506020840135615a0a81615f3d565b929592945050506040919091013590565b60008060008060808587031215615a3157600080fd5b8435615a3c81615f3d565b93506020850135615a4c81615f3d565b9250604085013591506060850135615a6381615f3d565b939692955090935050565b60008060008060808587031215615a8457600080fd5b8435615a8f81615f3d565b93506020850135615a9f81615f3d565b93969395505050506040820135916060013590565b600080600080600060a08688031215615acc57600080fd5b8535615ad781615f3d565b94506020860135615ae781615f3d565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215615b1857600080fd5b8235615b2381615f3d565b946020939093013593505050565b600080600060608486031215615b4657600080fd5b8335615b5181615f3d565b92506020840135915060408401356159cf81615f3d565b600060208284031215615b7a57600080fd5b6147bf826158fa565b600080600060608486031215615b9857600080fd5b615ba18461590a565b9250615baf6020850161590a565b9150615bbd604085016158fa565b90509250925092565b600060208284031215615bd857600080fd5b5035919050565b600060208284031215615bf157600080fd5b5051919050565b600080600060608486031215615c0d57600080fd5b8351925060208401519150604084015190509250925092565b60008251615c38818460208701615e63565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015615ca557845163ffffffff1683529383019391830191600101615c83565b5090979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015615d0c5783516001600160a01b031683529284019291840191600101615ce7565b50909695505050505050565b6020815260008251806020840152615d37816040850160208701615e63565b601f01601f19169190910160400192915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b92835260069190910b6020830152604082015260600190565b9283526020830191909152604082015260600190565b60008219821115615dc457615dc4615ee5565b500190565b600082615dd857615dd8615efb565b500490565b6000816000190483118215151615615df757615df7615ee5565b500290565b60008160060b8360060b6000811281667fffffffffffff1901831281151615615e2757615e27615ee5565b81667fffffffffffff018313811615615e4257615e42615ee5565b5090039392505050565b600082821015615e5e57615e5e615ee5565b500390565b60005b83811015615e7e578181015183820152602001615e66565b838111156150a45750506000910152565b6000600019821415615ea357615ea3615ee5565b5060010190565b600082615eb957615eb9615efb565b500690565b60008160060b667fffffffffffff19811415615edc57615edc615ee5565b60000392915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114615f5257600080fd5b5056fe46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfaee3f0daba9837d1ab0597acf34328550e4832d02e24e467825e7c2dd318c3820a2646970667358221220a652922e4d7790b0f864618e6193f295e00a8e3132caf1f7755731c5f43e8adb64736f6c63430008070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106103ec5760003560e01c806390a4684e1161020d578063c5198abc11610121578063c5198abc146109e1578063c7ae40d0146109f4578063cb4be2bb14610a07578063cb54694d14610a1a578063cd22af1b14610a2d578063d55995fe14610a58578063dd2080d614610a6b578063ddca3f4314610a7e578063e326ac4314610a87578063ebbb619414610aa7578063ec00cdfc14610aba578063ec8ca64314610acd578063f0f346b914610af6578063f11a1d1a14610b09578063f136a09d14610b1c578063f25e311b14610b3c578063f39c38a014610b4f578063f75f9f7b14610b62578063f9d46cf214610b75578063fc253d2b14610b88578063fe75bc4614610b9157600080fd5b806390a4684e146107f4578063951dc22c14610807578063966abd001461080f57806398e90a0f146108225780639d5c33d81461084b578063a21458091461085e578063a39744b514610871578063a515366a1461089c578063a5d059ca146108af578063a676f9ff146108c2578063a7d2e784146108e2578063aac6aa9c146108eb578063ab033ea9146108fe578063af320e8114610911578063b0103b1a14610924578063b239223314610947578063b440027f1461095a578063b600702a14610985578063b7e7734014610998578063b87fcbff146109ab578063c20297f0146109ce57600080fd5b806359a2255e1161030457806359a2255e146106505780635aa6e675146106635780635ebe23f0146106765780635feeb7941461067f578063633fb68f1461069257806364bb43ee1461069b57806368a9f19c146106ae578063694798e6146106c157806369fe0e2d146106ec5780636ba42aaa146106ff5780636cf262bc146107125780636e2a9ca61461072557806372da828a1461073857806374a8f1031461074b578063768b5d901461075e5780637b40c913146107675780637c8fce231461077a578063878c723e146107825780638bb6dfa8146107ab5780638cb22b76146107be5780638fe204dd146107e157600080fd5b8063034d4c61146103f157806307b435c2146104175780630c620bce146104425780630d6a1f87146104575780631101eb411461046a57806311466d721461047f57806315006b8214610492578063160e1e31146104bd578063165e62e7146104d0578063168f92e71461050d5780631b44555e146105385780631c5a9d9c146105585780631ef94b911461056b57806321040b011461058b578063238efcbc146105b6578063274a8db4146105be57806351cff8d9146105f157806352a4de291461060457806355ea6c4714610617578063575288bf1461062a578063594a3a931461063d575b600080fd5b6104046103ff36600461591c565b610ba4565b6040519081526020015b60405180910390f35b610404610425366004615956565b601260209081526000928352604080842090915290825290205481565b61044a610caa565b60405161040e9190615ccb565b610404610465366004615b05565b610cbb565b61047d6104783660046159da565b610dc1565b005b61047d61048d366004615b05565b610f1b565b6104046104a0366004615956565b601060209081526000928352604080842090915290825290205481565b61047d6104cb36600461591c565b6110aa565b6104e36104de36600461591c565b611210565b604080518251600690810b825260208085015190910b90820152918101519082015260600161040e565b61040461051b366004615956565b600960209081526000928352604080842090915290825290205481565b61040461054636600461591c565b60056020526000908152604090205481565b61047d61056636600461591c565b6115d6565b601b5461057e906001600160a01b031681565b60405161040e9190615c42565b610404610599366004615956565b601360209081526000928352604080842090915290825290205481565b61047d61170f565b6105e16105cc36600461591c565b601a6020526000908152604090205460ff1681565b604051901515815260200161040e565b61047d6105ff36600461591c565b61179b565b61047d6106123660046159da565b6119a4565b61047d61062536600461591c565b611bd5565b61047d6106383660046159da565b611c89565b61047d61064b366004615956565b611f4c565b61047d61065e36600461591c565b611ff1565b60175461057e906001600160a01b031681565b610404601f5481565b61047d61068d36600461591c565b6120a3565b61040460215481565b61047d6106a936600461591c565b61230d565b61047d6106bc36600461591c565b61238f565b6104046106cf366004615956565b602860209081526000928352604080842090915290825290205481565b61047d6106fa366004615bc6565b612447565b6105e161070d36600461591c565b6124a7565b61040461072036600461591c565b612507565b61047d6107333660046159da565b61263d565b61047d61074636600461591c565b61278c565b61047d61075936600461591c565b612829565b61040460225481565b601e5461057e906001600160a01b031681565b61044a612924565b61057e61079036600461591c565b6001602052600090815260409020546001600160a01b031681565b6104046107b936600461591c565b612930565b6105e16107cc36600461591c565b60146020526000908152604090205460ff1681565b61047d6107ef366004615bc6565b6129d3565b61047d610802366004615956565b612a31565b61044a612b1f565b61047d61081d366004615b31565b612b2b565b61057e61083036600461591c565b6002602052600090815260409020546001600160a01b031681565b61047d61085936600461591c565b612c41565b61047d61086c36600461598f565b612cf9565b61040461087f366004615956565b600860209081526000928352604080842090915290825290205481565b61047d6108aa366004615b05565b612ec9565b61047d6108bd366004615b05565b61312a565b6104046108d036600461591c565b60296020526000908152604090205481565b61040460205481565b61047d6108f936600461591c565b6131fd565b61047d61090c36600461591c565b6132b1565b61047d61091f366004615956565b613327565b6105e161093236600461591c565b60076020526000908152604090205460ff1681565b61047d610955366004615bc6565b6137a6565b610404610968366004615956565b602560209081526000928352604080842090915290825290205481565b61047d61099336600461591c565b613806565b61047d6109a6366004615bc6565b613a2b565b6105e16109b936600461591c565b60196020526000908152604090205460ff1681565b61047d6109dc366004615a6e565b613a8b565b61047d6109ef36600461591c565b613b4d565b601c5461057e906001600160a01b031681565b61047d610a1536600461591c565b613c12565b61047d610a28366004615bc6565b613caf565b610404610a3b366004615956565b601160209081526000928352604080842090915290825290205481565b61047d610a66366004615a1b565b613d33565b61047d610a793660046159da565b613f6a565b61040460245481565b610404610a9536600461591c565b60066020526000908152604090205481565b61047d610ab5366004615bc6565b6140e7565b61047d610ac836600461591c565b614147565b61057e610adb36600461591c565b602c602052600090815260409020546001600160a01b031681565b61047d610b0436600461591c565b6141e4565b601d5461057e906001600160a01b031681565b610404610b2a36600461591c565b602a6020526000908152604090205481565b61047d610b4a3660046159da565b614298565b60185461057e906001600160a01b031681565b61047d610b7036600461591c565b6144dd565b6105e1610b83366004615ab4565b614595565b61040460235481565b61047d610b9f366004615b05565b61467e565b600080610bb083612507565b6022549091504290610bcb90610bc69083615e4c565b61476e565b6001600160a01b0385166000908152602960205260409020541115610c6f576022546001600160a01b038516600090815260296020526040902054610c109042615e4c565b10610c4c576022546001600160a01b038516600090815260296020526040902054610c3b9190615db1565b610c459082615e4c565b9050610c85565b6001600160a01b038416600090815260296020526040902054610c459082615e4c565b610c784261476e565b610c829082615e4c565b90505b610c8f8183614788565b610c9885612930565b610ca29190615db1565b949350505050565b6060610cb660266147b2565b905090565b6000610cc86026846147c6565b15610dbb576000610cd884611210565b90508060400151600014610db9576001600160a01b0384166000908152600f602052604081205460ff16610d19578160200151610d1490615ebe565b610d1f565b81602001515b601d5460225460405163a0d2710760e01b8152929350610db0926001600160a01b039092169163a0d2710791610d5b9189918791600401615d82565b60206040518083038186803b158015610d7357600080fd5b505afa158015610d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dab9190615bdf565b6147e8565b92505050610dbb565b505b92915050565b6001600160a01b038381166000908152600160205260409020548491163314610dfd57604051636efb4f4160e11b815260040160405180910390fd5b602054610e0a9042615db1565b6001600160a01b03808616600081815260126020908152604080832094891680845294825280832095909555918152601382528381209281529190529081208054849290610e59908490615db1565b90915550610e6a90508484846147f9565b6001600160a01b038085166000908152602860209081526040808320938716835292905220548015801590610ea95750602154610ea78286614a07565b105b15610ec757604051636f447fcd60e11b815260040160405180910390fd5b836001600160a01b0316856001600160a01b03167f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de85604051610f0c91815260200190565b60405180910390a35050505050565b3360008181526007602052604090205460ff1615610f4c5760405163ad2fdf3b60e01b815260040160405180910390fd5b610f576015826147c6565b610f735760405162941a5760e11b815260040160405180910390fd5b610f7c81614b25565b15610fd7576001600160a01b038116600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f7683398151915293610fce9390929091615d9b565b60405180910390a25b6001600160a01b0381166000908152600a60205260409020548211156110565761100081614cfb565b6001600160a01b038116600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f768339815191529361104d9390929091615d9b565b60405180910390a25b611061818484614d89565b601b546001600160a01b03808516918382169116600080516020615f568339815191528561108d614e6d565b6040805192835260208301919091520160405180910390a4505050565b6017546001600160a01b031633146110d5576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166110fc5760405163d92e233d60e01b815260040160405180910390fd5b601e80546001600160a01b038084166001600160a01b031992831681179093556000838152600e6020526040908190208054909316909317909155601d54915163696a437b60e01b815291169063696a437b9061115d908490600401615c42565b60206040518083038186803b15801561117557600080fd5b505afa158015611189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ad9190615b68565b6001600160a01b0382166000908152600f602052604090819020805460ff191692151592909217909155517f9bb1515b0fc2645a3f011162460a22fdd512e0bca265e7dc9ba6bceae8930afa90611205908390615c42565b60405180910390a150565b60408051606081018252600080825260208201819052918101919091526112364261476e565b6001600160a01b0383166000908152602b602052604090206001015414156112ac57506001600160a01b03166000908152602b602090815260409182902082516060810184528154600681810b810b810b8352600160381b909104810b810b900b92810192909252600101549181019190915290565b6000806112c060225442610bc69190615e4c565b6001600160a01b0385166000908152602b602052604090206001015490915081141561142457604080516001808252818301909252600091602080830190803683375050506001600160a01b0386166000908152602b602052604090205490915060060b61132d4261476e565b6113379042615e4c565b8260008151811061134a5761134a615f27565b63ffffffff909216602092830291909101820152601d546001600160a01b038881166000908152600e90935260409283902054925163dc686d9160e01b81529181169263dc686d91926113a69291909116908690600401615c56565b60606040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f69190615b83565b600692830b90920b80885291955061141091839150615dfc565b600690810b900b6020860152506115ad9050565b6001600160a01b0384166000908152602b60205260409020600101548111156115ad576040805160028082526060820183526000926020830190803683370190505090506114714261476e565b61147b9042615e4c565b8160008151811061148e5761148e615f27565b602002602001019063ffffffff16908163ffffffff16815250506022546114b44261476e565b6114be9042615e4c565b6114c89190615db1565b816001815181106114db576114db615f27565b63ffffffff909216602092830291909101820152601d546001600160a01b038781166000908152600e909352604080842054905163dc686d9160e01b81529282169263dc686d91926115339216908690600401615c56565b60606040518083038186803b15801561154b57600080fd5b505afa15801561155f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115839190615b83565b600692830b90920b808852919550915061159e908290615dfc565b600690810b900b602086015250505b81156115c6576115bc4261476e565b60408401526115ce565b600060408401525b50505b919050565b3360009081526007602052604090205460ff1615611607576040516362e6201d60e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b038516845290915290205461164857604051636258f48160e01b815260040160405180910390fd5b3360009081526011602090815260408083206001600160a01b0385168452909152902054421161168b57604051630fd0eeef60e11b815260040160405180910390fd5b3360008181526011602090815260408083206001600160a01b03861684529091528120819055906116bc9083614e87565b9050816001600160a01b0316336001600160a01b03167f3673530133b6da67e9854f605b0cfa7bb9798cd33c18036dfc10d8da7c4d4a758360405161170391815260200190565b60405180910390a35050565b6018546001600160a01b0316331461173a57604051637ef5703160e11b815260040160405180910390fd5b60188054601780546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fc73be659241aade67e9a059bcf21494955018b213dbd1179054ccf928b13f3b69161179191615c42565b60405180910390a1565b600260005414156117c75760405162461bcd60e51b81526004016117be90615d4b565b60405180910390fd5b600260009081553381526013602090815260408083206001600160a01b038516845290915290205461180c5760405163184c088160e21b815260040160405180910390fd5b3360009081526012602090815260408083206001600160a01b0385168452909152902054421161184f576040516327cfdcb760e01b815260040160405180910390fd5b3360009081526007602052604090205460ff1615611880576040516362e6201d60e01b815260040160405180910390fd5b3360009081526013602090815260408083206001600160a01b0385811680865291909352922054601b5490929116141561191357601c5460405163140e25ad60e31b8152600481018390526001600160a01b039091169063a0712d6890602401600060405180830381600087803b1580156118fa57600080fd5b505af115801561190e573d6000803e3d6000fd5b505050505b3360008181526013602090815260408083206001600160a01b0387168085529083528184208490558484526012835281842081855290925282209190915561195b9183614f9e565b6040518181526001600160a01b0383169033907f2717ead6b9200dd235aad468c9809ea400fe33ac69b5bfaa6d3e90fc922b63989060200160405180910390a350506001600055565b600260005414156119c75760405162461bcd60e51b81526004016117be90615d4b565b60026000556119d76026836147c6565b6119f45760405163e0b6aead60e01b815260040160405180910390fd5b6119ff6015846147c6565b611a1c57604051636211d34960e01b815260040160405180910390fd5b6001600160a01b0383166000908152600d60205260409020611a3e9083614ff9565b50611a488361500e565b6021546001600160a01b03808516600090815260286020908152604080832093871683529290522054611a8690611a80908490615db1565b84614a07565b1015611aa557604051636f447fcd60e11b815260040160405180910390fd5b6001600160a01b038316600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f7683398151915293611af29390929091615d9b565b60405180910390a2611b0f6001600160a01b03831633308461506c565b6001600160a01b03808416600090815260286020908152604080832093861683529290529081208054839290611b46908490615db1565b90915550611b599050610dab8284614a07565b6001600160a01b0384166000908152600b602052604081208054909190611b81908490615db1565b909155505060405181815233906001600160a01b0384811691908616907f4e186bc75a2220191b826baff3ee63c3e970e94e58a9007ff94c9a7b8e6ebb3f9060200160405180910390a45050600160005550565b336000908152601a602052604090205460ff16611c0557604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16611c3e576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19169055513392917fe02b2375d8fb4aef3e5bc5d53bffcf70b6f185c5c93e69dcbe8b6cfc58e837e291a350565b60026000541415611cac5760405162461bcd60e51b81526004016117be90615d4b565b6002600055611cbc6015846147c6565b611cd957604051636211d34960e01b815260040160405180910390fd5b601b546001600160a01b0383811691161415611d075760405162822d9760e71b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b038416906370a0823190611d36903090600401615c42565b60206040518083038186803b158015611d4e57600080fd5b505afa158015611d62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d869190615bdf565b9050611d9d6001600160a01b03841633308561506c565b600081846001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611dcc9190615c42565b60206040518083038186803b158015611de457600080fd5b505afa158015611df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1c9190615bdf565b611e269190615e4c565b9050600061271060245483611e3b9190615ddd565b611e459190615dc9565b9050611e518183615e4c565b6001600160a01b038088166000908152600960209081526040808320938a1683529290529081208054909190611e88908490615db1565b90915550506001600160a01b0380871660009081526025602090815260408083208985168085529252909120429055601754611ec5921683614f9e565b6001600160a01b0386166000908152600c60205260409020611ee79086614ff9565b50336001600160a01b0316856001600160a01b0316876001600160a01b03167fec1a37d4a331a5059081e0fb5da1735e7890900cd215a4fb1e9f2779fd7b83eb85604051611f3791815260200190565b60405180910390a45050600160005550505050565b6001600160a01b038281166000908152600160205260409020548391163314611f8857604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03838116600081815260026020908152604080832080546001600160a01b031916888716908117909155600190925280832054905191941692917fa8bad3f0b781e1d954af9945167d5f80bfe5e57930f17c93843187c77557a6b891a4505050565b6001600160a01b03818116600090815260026020526040902054829116331461202d5760405163cfe9663360e01b815260040160405180910390fd5b6001600160a01b03828116600081815260016020908152604080832080546002909352818420805487166001600160a01b031980861691909117909255805490911690555193169283929133917fcf30c54296d5eee76168b564c59c50578d49c271733a470f32707c8cfbc88a8b9190a4505050565b3360008181526007602052604090205460ff16156120d45760405163ad2fdf3b60e01b815260040160405180910390fd5b6120df6015826147c6565b6120fb5760405162941a5760e11b815260040160405180910390fd5b61210481614b25565b1561215f576001600160a01b038116600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f76833981519152936121569390929091615d9b565b60405180910390a25b601d546001600160a01b038381166000908152600860209081526040808320601b548516845290915280822054905163435b21c160e01b8152600481019190915290928392839291169063435b21c19060240160606040518083038186803b1580156121ca57600080fd5b505afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122029190615bf8565b9250925092506000612212614e6d565b90506000612222828486886150aa565b6001600160a01b0387166000908152600a60205260409020549091508111156122bc5761224e86614cfb565b6001600160a01b038616600081815260296020908152604080832054600a835281842054600b90935292819020549051600080516020615f768339815191529361229b9390929091615d9b565b60405180910390a26122ab614e6d565b91506122b9828486886150aa565b90505b6122c7868883614d89565b601b5460408051838152602081018590526001600160a01b038a8116938a821693911691600080516020615f56833981519152910160405180910390a450505050505050565b6017546001600160a01b03163314612338576040516354348f0360e01b815260040160405180910390fd5b612343602682615107565b61236057604051630a8d08b160e01b815260040160405180910390fd5b7f51199d699bdfd516fa88dd0d2f8487c40c147b4867acaa23adc8d4df6b098e56816040516112059190615c42565b6017546001600160a01b031633146123ba576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16156123f45760405163546da66560e11b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090819020805460ff19166001179055517f049ccb28ab796d3225573a065712f6e7754487ced56056cda8889c337511807b90611205908390615c42565b6017546001600160a01b03163314612472576040516354348f0360e01b815260040160405180910390fd5b60248190556040518181527f4c10ca068ff7002cf5da78f2f697d1e91f6f0ac27f7344b28e8ef25263f87e5d90602001611205565b60006124b1614e6d565b602e556124bf6003836147c6565b156115d1577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb602e546040516124f791815260200190565b60405180910390a1506001919050565b6000805b6001600160a01b0383166000908152600d6020526040902061252c9061511c565b811015612637576001600160a01b0383166000908152600d602052604081206125559083615126565b90506125626026826147c6565b1561262457600061257282611210565b90508060400151600014612622576001600160a01b0382166000908152600f602052604081205460ff166125b35781602001516125ae90615ebe565b6125b9565b81602001515b601d546001600160a01b03888116600090815260286020908152604080832089851684529091529081902054602254915163a0d2710760e01b815294955061261494929093169263a0d2710792610d5b928791600401615d82565b61261e9086615db1565b9450505b505b508061262f81615e8f565b91505061250b565b50919050565b3360009081526019602052604090205460ff1661266d57604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff166126a6576040516310cec38560e21b815260040160405180910390fd5b6126b18383836147f9565b60175460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb926126e592909116908590600401615cb2565b602060405180830381600087803b1580156126ff57600080fd5b505af192505050801561272f575060408051601f3d908101601f1916820190925261272c91810190615b68565b60015b6127385761273a565b505b336001600160a01b0316836001600160a01b03167f6e10247c3c094d220ee99436c164b7f38d63b335a20ed817cbefaee4bb02d20e848460405161277f929190615cb2565b60405180910390a3505050565b6017546001600160a01b031633146127b7576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166127de5760405163d92e233d60e01b815260040160405180910390fd5b601d80546001600160a01b0319166001600160a01b0383161790556040517f71973fd672e51deb8f739b1f7e1eab991936645acd6f83e2bde6eeeaff5490b090611205908390615c42565b3360009081526019602052604090205460ff1661285957604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff16612892576040516310cec38560e21b815260040160405180910390fd5b61289d600382615107565b50601b546001600160a01b038083166000818152600860209081526040808320949095168083529381528482205492825260138152848220848352905292909220546128eb92849291615132565b60405133906001600160a01b038316907f038a17b9b553c0c3fc2ed14b957a5d8420a1666fd2efe5c1b3fe5f23eea61bb390600090a350565b6060610cb660156147b2565b60008061293c83612507565b6022546001600160a01b038516600090815260296020526040902054919250906129669042615e4c565b1015610dbb5760008111612992576001600160a01b0383166000908152600a60205260409020546129cc565b6001600160a01b0383166000908152600b6020908152604080832054600a909252909120546129c2908390615ddd565b6129cc9190615dc9565b9150612637565b6017546001600160a01b031633146129fe576040516354348f0360e01b815260040160405180910390fd5b60208181556040518281527fc8d443472c9783cc36f8f5f5091f08ce9f37fc2f9e6d79cf1d9aaf40a433fee29101611205565b6001600160a01b038281166000908152600160205260409020548391163314612a6d57604051636efb4f4160e11b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03161415612aa05760405163afe7ad4960e01b815260040160405180910390fd5b6001600160a01b038381166000818152602c6020908152604080832080546001600160a01b0319169588169586179055602d825280832094835293905282902042905590517fff0456758201108de53c0ff04c69988d4678ff455b2ce6f733328cf85722c04c90612b12908590615c42565b60405180910390a2505050565b6060610cb660036147b2565b6017546001600160a01b03163314612b56576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116612b7d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612bde576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015612bd8573d6000803e3d6000fd5b50612bf2565b612bf26001600160a01b0384168284614f9e565b604080516001600160a01b0385811682526020820185905283168183015290517f9a3055ded8c8b5f21bbf4946c5afab6e1fa8b3f057922658e5e1ade125fb0b1e9181900360600190a1505050565b6017546001600160a01b03163314612c6c576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1615612ca65760405163274e25dd60e11b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090819020805460ff19166001179055517f8addc69f897ecca0e41d70ed4ff9d75a9148a615a0fbda8597e53aea2684302f90611205908390615c42565b6001600160a01b038381166000908152600160205260409020548491163314612d3557604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b038216612d5c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808516600090815260136020908152604080832093871683529290522054612d9f5760405163184c088160e21b815260040160405180910390fd5b6001600160a01b038085166000908152601260209081526040808320938716835292905220544211612de4576040516327cfdcb760e01b815260040160405180910390fd5b6001600160a01b03841660009081526007602052604090205460ff1615612e1e576040516362e6201d60e01b815260040160405180910390fd5b6001600160a01b0380851660008181526013602090815260408083209488168084529482528083208054908490559383526012825280832085845290915281205590612e6b908483614f9e565b826001600160a01b0316846001600160a01b0316866001600160a01b03167ffdb7893bf11f50c621e59cc7f1cf540e94295cb27ca869ec7ed7618ca792886284604051612eba91815260200190565b60405180910390a45050505050565b60026000541415612eec5760405162461bcd60e51b81526004016117be90615d4b565b600260009081553381526007602052604090205460ff1615612f21576040516362e6201d60e01b815260040160405180910390fd5b612f2c6015336147c6565b15612f4a5760405163d7229c4360e01b815260040160405180910390fd5b601f54612f579042615db1565b3360009081526011602090815260408083206001600160a01b03871680855292528083209390935591516370a0823160e01b81529091906370a0823190612fa2903090600401615c42565b60206040518083038186803b158015612fba57600080fd5b505afa158015612fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff29190615bdf565b90506130096001600160a01b03841633308561506c565b6040516370a0823160e01b815281906001600160a01b038516906370a0823190613037903090600401615c42565b60206040518083038186803b15801561304f57600080fd5b505afa158015613063573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130879190615bdf565b6130919190615e4c565b336000908152601460209081526040808320805460ff19166001179055601082528083206001600160a01b03881684529091528120805492945084929091906130db908490615db1565b90915550506040518281526001600160a01b0384169033907fa7e66869262026842e8d81f5e6806cdc8d846e27c824e2e22f4fe51442771b349060200160405180910390a35050600160005550565b6020546131379042615db1565b3360008181526012602090815260408083206001600160a01b03881680855290835281842095909555928252600881528282209382529290925281208054839290613183908490615e4c565b90915550503360009081526013602090815260408083206001600160a01b0386168452909152812080548392906131bb908490615db1565b90915550506040518181526001600160a01b0383169033907f9aaab310d247ad45aef26bbdefc4ebf20c728fdb84c92b95b2b05d21826940de90602001611703565b6017546001600160a01b03163314613228576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090205460ff16613261576040516336fe17e760e21b815260040160405180910390fd5b6001600160a01b03811660009081526019602052604090819020805460ff19169055517f3ed8cbce8cab40e59282f1743e2b607effa08b5cbe0111bb4721134f2f80d02590611205908390615c42565b6017546001600160a01b031633146132dc576040516354348f0360e01b815260040160405180910390fd5b601880546001600160a01b0319166001600160a01b0383161790556040517fe987aaedf9d279143bdf1eee16cf1d0feb47742867d81083df8d6cd0a5ac857f90611205908390615c42565b6001600160a01b03818116600090815260016020526040902054829116331461336357604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff16806133a257506001600160a01b03821660009081526007602052604090205460ff165b156133c05760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b038381166000908152602c60205260409020548116908316146133fd57604051630ced616b60e21b815260040160405180910390fd5b6001600160a01b038084166000908152602d602090815260408083209386168352929052205461342f90603c90615db1565b42101561344f576040516356248e9760e01b815260040160405180910390fd5b6134588361500e565b6134618261500e565b6001600160a01b0383166000908152600c602052604081206134829061511c565b1115613564576001600160a01b0383166000908152600c602052604081206134aa9082615126565b6001600160a01b03808616600090815260096020818152604080842085871680865290835281852054958a1685529282528084209284529190528120805493945091926134f8908490615db1565b90915550506001600160a01b0380851660008181526009602090815260408083209486168352938152838220829055918152600c9091522061353a9082615107565b506001600160a01b0383166000908152600c6020526040902061355d9082614ff9565b5050613461565b6001600160a01b0383166000908152600d602052604081206135859061511c565b1115613667576001600160a01b0383166000908152600d602052604081206135ad9082615126565b6001600160a01b03808616600090815260286020818152604080842085871680865290835281852054958a1685529282528084209284529190528120805493945091926135fb908490615db1565b90915550506001600160a01b038085166000908152602860209081526040808320858516845282528083208390559286168252600d90522061363d9082614ff9565b506001600160a01b0384166000908152600d602052604090206136609082615107565b5050613564565b6001600160a01b038084166000908152600b602052604080822054928516825281208054909190613699908490615db1565b90915550506001600160a01b038084166000908152600b60209081526040808320839055600a909152808220549285168252812080549091906136dd908490615db1565b90915550506001600160a01b0383166000908152600a602090815260408083208390556029909152812055613713601584615107565b506001600160a01b03808416600081815260016020908152604080832080546001600160a01b031990811690915560028352818420805482169055602d8352818420958816808552958352818420849055938352602c909152908190208054909216909155517f9b712b63e3fb1325fa042d3c238ce8144937875065900528ea1e4f3b00f379f290612b12908690615c42565b6017546001600160a01b031633146137d1576040516354348f0360e01b815260040160405180910390fd5b60238190556040518181527fbdcfd7b8482f31cff6a87c362d9e2e3887f4cdc2018c7c485d8e78a7b2fadb6990602001611205565b6017546001600160a01b03163314613831576040516354348f0360e01b815260040160405180910390fd5b61383c602682614ff9565b6138595760405163f25e6b9f60e01b815260040160405180910390fd5b806001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561389257600080fd5b505afa1580156138a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ca9190615939565b6001600160a01b038281166000908152600e60205260409081902080546001600160a01b0319169383169384179055601d54905163696a437b60e01b815291169163696a437b9161391e9190600401615c42565b60206040518083038186803b15801561393657600080fd5b505afa15801561394a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396e9190615b68565b6001600160a01b0382166000908152600f60205260409020805460ff191691151591909117905561399e81611210565b6001600160a01b0382166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b161791909117815591810151600190920191909155517fabfa8db4d238fa78bf4e15fcc91328dd35f3978f200e2857a56bb719732b7b0b90611205908390615c42565b6017546001600160a01b03163314613a56576040516354348f0360e01b815260040160405180910390fd5b601f8190556040518181527fd319ef78d2b690bb773fcccc2d096306bac7c9222dd0bb6b300f461e4a376b4390602001611205565b3360009081526019602052604090205460ff16613abb57604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03841660009081526007602052604090205460ff16613af4576040516310cec38560e21b815260040160405180910390fd5b613b0084848484615132565b336001600160a01b0385167f10a73de7ab6e9023aa6e2bc23f7abf4dcef591487e7e55f44c00e34fe60d56db613b368486615db1565b60405190815260200160405180910390a350505050565b613b586015826147c6565b15613b7657604051630809740d60e01b815260040160405180910390fd5b6001600160a01b03811660009081526014602052604090205460ff1615613bb057604051632f3d320560e01b815260040160405180910390fd5b613bbb601582614ff9565b506001600160a01b03811660008181526001602052604080822080546001600160a01b03191633908117909155905190917fed3faef50715743626cd57de74281a2b17cdbfc11c0486feda541fb911e0293d91a350565b6017546001600160a01b03163314613c3d576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b038116613c645760405163d92e233d60e01b815260040160405180910390fd5b601c80546001600160a01b0319166001600160a01b0383161790556040517feb931b4b5a98d20a6b1e6693a7c59d8e337a06e2f1473bb776e19251db7ae25090611205908390615c42565b6017546001600160a01b03163314613cda576040516354348f0360e01b815260040160405180910390fd5b62015180811015613cfe57604051633f384aad60e21b815260040160405180910390fd5b60228190556040518181527f54aafa56429e22230b52f1495588ffc632277d74f3a85ec755e13ac50c1584d990602001611205565b60026000541415613d565760405162461bcd60e51b81526004016117be90615d4b565b600260009081556001600160a01b03858116825260016020526040909120548591163314613d9757604051636efb4f4160e11b815260040160405180910390fd5b6001600160a01b03808616600090815260256020908152604080832093881683529290522054613dc990603c90615db1565b4211613de857604051631e0b407560e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290522054831115613e2e5760405163024ae82d60e61b815260040160405180910390fd5b6001600160a01b03851660009081526007602052604090205460ff1615613e685760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03808616600090815260096020908152604080832093881683529290529081208054859290613e9f908490615e4c565b90915550613eb990506001600160a01b0385168385614f9e565b6001600160a01b03808616600090815260096020908152604080832093881683529290522054613f07576001600160a01b0385166000908152600c60205260409020613f059085615107565b505b816001600160a01b0316846001600160a01b0316866001600160a01b03167f53e982dd9ec088d634c74c98fbbc161f808b4b6469a26c657120b9a31cb34bfe86604051613f5691815260200190565b60405180910390a450506001600055505050565b3360008181526007602052604090205460ff1615613f9b5760405163ad2fdf3b60e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff1615613fd5576040516362e6201d60e01b815260040160405180910390fd5b613fe06015826147c6565b613ffc5760405162941a5760e11b815260040160405180910390fd5b6001600160a01b038082166000908152600960209081526040808320938816835292905220548211156140425760405163356680b760e01b815260040160405180910390fd5b6001600160a01b03808216600090815260096020908152604080832093881683529290529081208054849290614079908490615e4c565b9091555061409390506001600160a01b0385168484614f9e565b826001600160a01b0316816001600160a01b0316856001600160a01b0316600080516020615f56833981519152856140c9614e6d565b6040805192835260208301919091520160405180910390a450505050565b6017546001600160a01b03163314614112576040516354348f0360e01b815260040160405180910390fd5b60218190556040518181527f24d51b415694a791b1c77df7817c075ac82b83ce611bcd8627d2e66cf37aa3e790602001611205565b6017546001600160a01b03163314614172576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166141995760405163d92e233d60e01b815260040160405180910390fd5b601b80546001600160a01b0319166001600160a01b0383161790556040517f1d1a3e7caf0717056e48dc8aefa54d806c7af86324fece4e5d49f8e1f01f84bf90611205908390615c42565b6017546001600160a01b0316331461420f576040516354348f0360e01b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090205460ff1661424857604051633ca0d42760e11b815260040160405180910390fd5b6001600160a01b0381166000908152601a602052604090819020805460ff19169055517f5e8bd21d0a98cb2caf33706e56139ff40ffbdca7ec5d9d412a0a2292496dc70e90611205908390615c42565b3360009081526019602052604090205460ff166142c857604051637e57b1e160e01b815260040160405180910390fd5b6001600160a01b03831660009081526007602052604090205460ff16614301576040516310cec38560e21b815260040160405180910390fd5b6001600160a01b0383166000908152600c6020526040902061432390836147c6565b61434057604051632eda7a1160e01b815260040160405180910390fd5b6001600160a01b038084166000908152600960209081526040808320938616835292905220548111156143855760405162919bed60e01b815260040160405180910390fd5b60175460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb926143b992909116908590600401615cb2565b602060405180830381600087803b1580156143d357600080fd5b505af1925050508015614403575060408051601f3d908101601f1916820190925261440091810190615b68565b60015b61440c5761440e565b505b6001600160a01b03808416600090815260096020908152604080832093861683529290529081208054839290614445908490615e4c565b90915550506001600160a01b03808416600090815260096020908152604080832093861683529290522054614498576001600160a01b0383166000908152600c602052604090206144969083615107565b505b336001600160a01b0316836001600160a01b03167f20262b97130b5cb8f80624eed2733df2b05db4a0789b4a3d0157e1d318333104848460405161277f929190615cb2565b336000908152601a602052604090205460ff1661450d57604051630942721960e31b815260040160405180910390fd5b6001600160a01b03811660009081526007602052604090205460ff1615614547576040516304ee891b60e11b815260040160405180910390fd5b6001600160a01b038116600081815260076020526040808220805460ff19166001179055513392917f070125a1c0f5202217aae14ec399abfaaa13c2fd98a91d43bd3a897dd4751e8091a350565b600061459f614e6d565b602e556145ad6003876147c6565b80156145de57506001600160a01b038087166000908152600860209081526040808320938916835292905220548411155b801561460257506001600160a01b0386166000908152600560205260409020548311155b801561463157506001600160a01b038616600090815260066020526040902054829061462e9042615e4c565b10155b15614675577f4851cad52e624c8f7a1d44c28a80db05988ba2451fc0db6b0ec338d8eca95afb602e5460405161466991815260200190565b60405180910390a15060015b95945050505050565b6017546001600160a01b031633146146a9576040516354348f0360e01b815260040160405180910390fd5b6146b46015836147c6565b6146d157604051636211d34960e01b815260040160405180910390fd5b6146da8261500e565b6001600160a01b0382166000908152600a602052604081208054839290614702908490615db1565b90915550506001600160a01b038216600081815260296020908152604080832054600a909252918290205491517f5abcf5031fdbd3badb9d1e09094208de329aee72730e87650f346584205d23d192614762928252602082015260400190565b60405180910390a25050565b60006022548261477e9190615eaa565b610dbb9083615e4c565b6000602254831015612637576022546147a18385615ddd565b6147ab9190615dc9565b9050610dbb565b606060006147bf83615288565b9392505050565b6001600160a01b038116600090815260018301602052604081205415156147bf565b6000610dbb826022546023546152e4565b6002600054141561481c5760405162461bcd60e51b81526004016117be90615d4b565b600260009081556001600160a01b0384168152600d6020526040902061484290836147c6565b61485e576040516241cfa560e21b815260040160405180910390fd5b6001600160a01b038084166000908152602860209081526040808320938616835292905220548111156148a45760405163435b562560e01b815260040160405180910390fd5b6148ad83615392565b60006148bc610dab8385614a07565b6001600160a01b0385166000908152600b602052604090205490915015614972576001600160a01b0384166000908152600b6020908152604080832054600a9092529091205461490d908390615ddd565b6149179190615dc9565b6001600160a01b0385166000908152600a60205260408120805490919061493f908490615e4c565b90915550506001600160a01b0384166000908152600b60205260408120805483929061496c908490615e4c565b90915550505b6001600160a01b038085166000908152602860209081526040808320938716835292905290812080548492906149a9908490615e4c565b90915550506001600160a01b038085166000908152602860209081526040808320938716835292905220546149fc576001600160a01b0384166000908152600d602052604090206149fa9084615107565b505b505060016000555050565b6001600160a01b0381166000908152602b602052604081206001015415610dbb576001600160a01b0382166000908152600f602052604081205460ff16614a79576001600160a01b0383166000908152602b6020526040902054614a7490600160381b900460060b615ebe565b614a9d565b6001600160a01b0383166000908152602b6020526040902054600160381b900460060b5b601d5460225460405163a0d2710760e01b81529293506001600160a01b039091169163a0d2710791614ad59188918691600401615d82565b60206040518083038186803b158015614aed57600080fd5b505afa158015614b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca29190615bdf565b6000614b304261476e565b6001600160a01b03831660009081526029602052604090205410156115d157614b6060225442610bc69190615e4c565b6001600160a01b03831660009081526029602052604090205411614bd657614b8782615392565b6001600160a01b0382166000908152600b6020908152604080832054600a90925290912055614bb54261476e565b6001600160a01b038316600090815260296020526040902055506001919050565b6022546001600160a01b038316600090815260296020526040902054614bfc9042615e4c565b10614c5857614c0a82615392565b6001600160a01b0382166000908152600b6020908152604080832054600a83528184205560225460299092528220805491929091614c49908490615db1565b90915550600191506115d19050565b614c614261476e565b6001600160a01b0383166000908152602a602052604090205410156115d1576001600160a01b0382166000908152600b6020526040902054614ca283615392565b6001600160a01b0383166000908152600b6020908152604080832054600a909252909120548291614cd291615ddd565b614cdc9190615dc9565b6001600160a01b0384166000908152600a602052604090205550919050565b6001600160a01b038116600090815260296020526040902054614d4090614d229042615e4c565b6001600160a01b0383166000908152600b6020526040902054614788565b6001600160a01b0382166000908152600a602052604081208054909190614d68908490615db1565b90915550506001600160a01b03166000908152602960205260409020429055565b6001600160a01b0383166000908152600a6020526040902054811115614dc25760405163356680b760e01b815260040160405180910390fd5b6001600160a01b0383166000908152602a60209081526040808320429055600a90915281208054839290614df7908490615e4c565b90915550506001600160a01b038083166000908152600860209081526040808320601b5490941683529290529081208054839290614e36908490615db1565b90915550506001600160a01b03821660009081526005602052604081208054839290614e63908490615db1565b9091555050505050565b6000603f5a614e7d906040615ddd565b610cb69190615dc9565b6001600160a01b038216600090815260066020526040812054614ec0576001600160a01b03831660009081526006602052604090204290555b614ecb600384614ff9565b50506001600160a01b03808316600081815260106020908152604080832094861680845294825280832080549084905593835260088252808320948352939052918220805491928392614f1f908490615db1565b9091555050601b546001600160a01b0383811691161415610dbb57601b54604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b158015614f8057600080fd5b505af1158015614f94573d6000803e3d6000fd5b5050505092915050565b614ff48363a9059cbb60e01b8484604051602401614fbd929190615cb2565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526153b7565b505050565b60006147bf836001600160a01b038416615489565b61501781614b25565b5061502181614cfb565b6001600160a01b0381166000908152600a6020908152604080832054600b9092529091205461505091906154d8565b6001600160a01b039091166000908152600a6020526040902055565b6040516001600160a01b03808516602483015283166044820152606481018290526150a49085906323b872dd60e01b90608401614fbd565b50505050565b6000808486602e546150bc9190615e4c565b6150c69190615db1565b9050670de0b6b3a7640000846127106150df8685615ddd565b6150e99190615dc9565b6150f39190615ddd565b6150fd9190615dc9565b9695505050505050565b60006147bf836001600160a01b0384166154ee565b6000610dbb825490565b60006147bf83836155e1565b601b546001600160a01b0384811691161461520a576017546001600160a01b038085169163a9059cbb91166151678486615db1565b6040518363ffffffff1660e01b8152600401615184929190615cb2565b602060405180830381600087803b15801561519e57600080fd5b505af19250505080156151ce575060408051601f3d908101601f191682019092526151cb91810190615b68565b60015b615208573d8080156151fc576040519150601f19603f3d011682016040523d82523d6000602084013e615201565b606091505b505061520a565b505b6001600160a01b03808516600090815260086020908152604080832093871683529290529081208054849290615241908490615e4c565b90915550506001600160a01b0380851660009081526013602090815260408083209387168352929052908120805483929061527d908490615e4c565b909155505050505050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156152d857602002820191906000526020600020905b8154815260200190600101908083116152c4575b50505050509050919050565b60008080600019858709858702925082811083820303915050806000141561531e576000841161531357600080fd5b5082900490506147bf565b80841161532a57600080fd5b600084868809600260036001881981018916988990049182028318808302840302808302840302808302840302808302840302808302840302918202909203026000889003889004909101858311909403939093029303949094049190911702949350505050565b61539b8161560b565b6001600160a01b039091166000908152600b6020526040902055565b600061540c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166157ef9092919063ffffffff16565b805190915015614ff4578080602001905181019061542a9190615b68565b614ff45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016117be565b60008181526001830160205260408120546154d057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610dbb565b506000610dbb565b60008183106154e757816147bf565b5090919050565b600081815260018301602052604081205480156155d7576000615512600183615e4c565b855490915060009061552690600190615e4c565b905081811461558b57600086600001828154811061554657615546615f27565b906000526020600020015490508087600001848154811061556957615569615f27565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061559c5761559c615f11565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610dbb565b6000915050610dbb565b60008260000182815481106155f8576155f8615f27565b9060005260206000200154905092915050565b60006156164261476e565b601e546001600160a01b03166000908152602b6020526040902060010154146156ad57601e5461564e906001600160a01b0316611210565b601e546001600160a01b03166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b1617919091178155910151600191909101555b60005b6001600160a01b0383166000908152600d602052604090206156d19061511c565b811015612637576001600160a01b0383166000908152600d602052604081206156fa9083615126565b90506157076026826147c6565b156157dc576157154261476e565b6001600160a01b0382166000908152602b60205260409020600101541461579b5761573f81611210565b6001600160a01b0382166000908152602b60209081526040918290208351815492850151600690810b66ffffffffffffff908116600160381b026001600160701b03199095169290910b16179190911781559101516001909101555b6001600160a01b038085166000908152602860209081526040808320938516835292905220546157cf90610dab9083614a07565b6157d99084615db1565b92505b50806157e781615e8f565b9150506156b0565b6060610ca2848460008585843b6158485760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016117be565b600080866001600160a01b031685876040516158649190615c26565b60006040518083038185875af1925050503d80600081146158a1576040519150601f19603f3d011682016040523d82523d6000602084013e6158a6565b606091505b50915091506158b68282866158c1565b979650505050505050565b606083156158d05750816147bf565b8251156158e05782518084602001fd5b8160405162461bcd60e51b81526004016117be9190615d18565b805180151581146115d157600080fd5b8051600681900b81146115d157600080fd5b60006020828403121561592e57600080fd5b81356147bf81615f3d565b60006020828403121561594b57600080fd5b81516147bf81615f3d565b6000806040838503121561596957600080fd5b823561597481615f3d565b9150602083013561598481615f3d565b809150509250929050565b6000806000606084860312156159a457600080fd5b83356159af81615f3d565b925060208401356159bf81615f3d565b915060408401356159cf81615f3d565b809150509250925092565b6000806000606084860312156159ef57600080fd5b83356159fa81615f3d565b92506020840135615a0a81615f3d565b929592945050506040919091013590565b60008060008060808587031215615a3157600080fd5b8435615a3c81615f3d565b93506020850135615a4c81615f3d565b9250604085013591506060850135615a6381615f3d565b939692955090935050565b60008060008060808587031215615a8457600080fd5b8435615a8f81615f3d565b93506020850135615a9f81615f3d565b93969395505050506040820135916060013590565b600080600080600060a08688031215615acc57600080fd5b8535615ad781615f3d565b94506020860135615ae781615f3d565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215615b1857600080fd5b8235615b2381615f3d565b946020939093013593505050565b600080600060608486031215615b4657600080fd5b8335615b5181615f3d565b92506020840135915060408401356159cf81615f3d565b600060208284031215615b7a57600080fd5b6147bf826158fa565b600080600060608486031215615b9857600080fd5b615ba18461590a565b9250615baf6020850161590a565b9150615bbd604085016158fa565b90509250925092565b600060208284031215615bd857600080fd5b5035919050565b600060208284031215615bf157600080fd5b5051919050565b600080600060608486031215615c0d57600080fd5b8351925060208401519150604084015190509250925092565b60008251615c38818460208701615e63565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015615ca557845163ffffffff1683529383019391830191600101615c83565b5090979650505050505050565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015615d0c5783516001600160a01b031683529284019291840191600101615ce7565b50909695505050505050565b6020815260008251806020840152615d37816040850160208701615e63565b601f01601f19169190910160400192915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b92835260069190910b6020830152604082015260600190565b9283526020830191909152604082015260600190565b60008219821115615dc457615dc4615ee5565b500190565b600082615dd857615dd8615efb565b500490565b6000816000190483118215151615615df757615df7615ee5565b500290565b60008160060b8360060b6000811281667fffffffffffff1901831281151615615e2757615e27615ee5565b81667fffffffffffff018313811615615e4257615e42615ee5565b5090039392505050565b600082821015615e5e57615e5e615ee5565b500390565b60005b83811015615e7e578181015183820152602001615e66565b838111156150a45750506000910152565b6000600019821415615ea357615ea3615ee5565b5060010190565b600082615eb957615eb9615efb565b500690565b60008160060b667fffffffffffff19811415615edc57615edc615ee5565b60000392915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114615f5257600080fd5b5056fe46f2180879a7123a197cc3828c28955d70d661c70acbdc02450daf5f9a9c1cfaee3f0daba9837d1ab0597acf34328550e4832d02e24e467825e7c2dd318c3820a2646970667358221220a652922e4d7790b0f864618e6193f295e00a8e3132caf1f7755731c5f43e8adb64736f6c63430008070033",
  "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"
        }
      },
      "acceptJobOwnership(address)": {
        "params": {
          "_job": "The address of the job"
        }
      },
      "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 bonded",
          "_bonding": "The asset being bonded"
        }
      },
      "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"
        }
      },
      "changeJobOwnership(address,address)": {
        "params": {
          "_job": "The address of the job",
          "_newOwner": "The address of the proposed new owner"
        }
      },
      "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)": {
        "details": "Should be used for protected functions",
        "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)": {
        "details": "Can be used for general (non critical) functions",
        "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 keepers 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 address of 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 address of 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 amount 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 being proposed as 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,uint256)": {
        "params": {
          "_bondAmount": "The bonded amount being slashed",
          "_bonded": "The asset being slashed",
          "_keeper": "The address being slashed",
          "_unbondAmount": "The pending unbond amount 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 unbonded"
        }
      },
      "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 unbonded from",
          "_liquidity": "The liquidity being unbonded"
        }
      },
      "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 and pays the keeper with bonded KP3R",
        "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": {
      "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": "Tracks 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."
      },
      "isKeeper(address)": {
        "notice": "Confirms if the current keeper is registered"
      },
      "jobLiquidityCredits(address)": {
        "notice": "Returns the liquidity credits of a given job"
      },
      "jobOwner(address)": {
        "notice": "Maps the job to the owner of the job"
      },
      "jobPendingOwner(address)": {
        "notice": "Maps the job to its pending owner"
      },
      "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"
      },
      "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,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": "Tracks 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": 8303,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobOwner",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 8309,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobPendingOwner",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 5368,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_keepers",
        "offset": 0,
        "slot": "3",
        "type": "t_struct(AddressSet)1631_storage"
      },
      {
        "astId": 5374,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "workCompleted",
        "offset": 0,
        "slot": "5",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5380,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "firstSeen",
        "offset": 0,
        "slot": "6",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5386,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "disputes",
        "offset": 0,
        "slot": "7",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5394,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "bonds",
        "offset": 0,
        "slot": "8",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5402,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobTokenCredits",
        "offset": 0,
        "slot": "9",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5407,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobLiquidityCredits",
        "offset": 0,
        "slot": "10",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5412,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobPeriodCredits",
        "offset": 0,
        "slot": "11",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 5418,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobTokens",
        "offset": 0,
        "slot": "12",
        "type": "t_mapping(t_address,t_struct(AddressSet)1631_storage)"
      },
      {
        "astId": 5424,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobLiquidities",
        "offset": 0,
        "slot": "13",
        "type": "t_mapping(t_address,t_struct(AddressSet)1631_storage)"
      },
      {
        "astId": 5429,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_liquidityPool",
        "offset": 0,
        "slot": "14",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 5434,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_isKP3RToken0",
        "offset": 0,
        "slot": "15",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5442,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingBonds",
        "offset": 0,
        "slot": "16",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5450,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "canActivateAfter",
        "offset": 0,
        "slot": "17",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5458,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "canWithdrawAfter",
        "offset": 0,
        "slot": "18",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5466,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingUnbonds",
        "offset": 0,
        "slot": "19",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 5472,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "hasBonded",
        "offset": 0,
        "slot": "20",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5476,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_jobs",
        "offset": 0,
        "slot": "21",
        "type": "t_struct(AddressSet)1631_storage"
      },
      {
        "astId": 5266,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "governance",
        "offset": 0,
        "slot": "23",
        "type": "t_address"
      },
      {
        "astId": 5270,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingGovernance",
        "offset": 0,
        "slot": "24",
        "type": "t_address"
      },
      {
        "astId": 5949,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "slashers",
        "offset": 0,
        "slot": "25",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5955,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "disputers",
        "offset": 0,
        "slot": "26",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 5594,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "keep3rV1",
        "offset": 0,
        "slot": "27",
        "type": "t_address"
      },
      {
        "astId": 5598,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "keep3rV1Proxy",
        "offset": 0,
        "slot": "28",
        "type": "t_address"
      },
      {
        "astId": 5602,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "keep3rHelper",
        "offset": 0,
        "slot": "29",
        "type": "t_address"
      },
      {
        "astId": 5606,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "kp3rWethPool",
        "offset": 0,
        "slot": "30",
        "type": "t_address"
      },
      {
        "astId": 5611,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "bondTime",
        "offset": 0,
        "slot": "31",
        "type": "t_uint256"
      },
      {
        "astId": 5616,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "unbondTime",
        "offset": 0,
        "slot": "32",
        "type": "t_uint256"
      },
      {
        "astId": 5621,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "liquidityMinimum",
        "offset": 0,
        "slot": "33",
        "type": "t_uint256"
      },
      {
        "astId": 5626,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "rewardPeriodTime",
        "offset": 0,
        "slot": "34",
        "type": "t_uint256"
      },
      {
        "astId": 5631,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "inflationPeriod",
        "offset": 0,
        "slot": "35",
        "type": "t_uint256"
      },
      {
        "astId": 5636,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "fee",
        "offset": 0,
        "slot": "36",
        "type": "t_uint256"
      },
      {
        "astId": 6297,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "jobTokenCreditsAddedAt",
        "offset": 0,
        "slot": "37",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 6540,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_approvedLiquidities",
        "offset": 0,
        "slot": "38",
        "type": "t_struct(AddressSet)1631_storage"
      },
      {
        "astId": 6548,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "liquidityAmount",
        "offset": 0,
        "slot": "40",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 6554,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "rewardedAt",
        "offset": 0,
        "slot": "41",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 6560,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "workedAt",
        "offset": 0,
        "slot": "42",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 6566,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_tick",
        "offset": 0,
        "slot": "43",
        "type": "t_mapping(t_address,t_struct(TickCache)13178_storage)"
      },
      {
        "astId": 8024,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "pendingJobMigrations",
        "offset": 0,
        "slot": "44",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 8030,
        "contract": "solidity/contracts/Keep3r.sol:Keep3r",
        "label": "_migrationCreatedAt",
        "offset": 0,
        "slot": "45",
        "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))"
      },
      {
        "astId": 8427,
        "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)13178_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct IKeep3rJobFundableLiquidity.TickCache)",
        "numberOfBytes": "32",
        "value": "t_struct(TickCache)13178_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)13178_storage": {
        "encoding": "inplace",
        "label": "struct IKeep3rJobFundableLiquidity.TickCache",
        "members": [
          {
            "astId": 13173,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "current",
            "offset": 0,
            "slot": "0",
            "type": "t_int56"
          },
          {
            "astId": 13175,
            "contract": "solidity/contracts/Keep3r.sol:Keep3r",
            "label": "difference",
            "offset": 7,
            "slot": "0",
            "type": "t_int56"
          },
          {
            "astId": 13177,
            "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"
      }
    }
  }
}