{
  "address": "0x9e982B7AE8d7F4Ec08C93e4FE109AF420ECe7462",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IPropelCore",
          "name": "_PropelCore",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_gasPoolAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_PropelUSDAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_borrowerOperationsAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_liquidationManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasCompensation",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_baseRate",
          "type": "uint256"
        }
      ],
      "name": "BaseRateUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "CollateralSent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_interest",
          "type": "uint256"
        }
      ],
      "name": "InsterstPaid",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "debt",
          "type": "uint256"
        }
      ],
      "name": "InterestDebtDistributed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_L_collateral",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_L_debt",
          "type": "uint256"
        }
      ],
      "name": "LTermsUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_lastFeeOpTime",
          "type": "uint256"
        }
      ],
      "name": "LastFeeOpTimeUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_attemptedDebtAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_actualDebtAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_collateralSent",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_InterestDebt",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_collateralFee",
          "type": "uint256"
        }
      ],
      "name": "Redemption",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "claimed",
          "type": "uint256"
        }
      ],
      "name": "RewardClaimed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_totalStakesSnapshot",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_totalCollateralSnapshot",
          "type": "uint256"
        }
      ],
      "name": "SystemSnapshotsUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_newTotalStakes",
          "type": "uint256"
        }
      ],
      "name": "TotalStakesUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_newIndex",
          "type": "uint256"
        }
      ],
      "name": "TroveIndexUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_L_collateral",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_L_debt",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_L_Interest_Debt",
          "type": "uint256"
        }
      ],
      "name": "TroveSnapshotsUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_coll",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_stake",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "enum ITroveManager.TroveManagerOperation",
          "name": "_operation",
          "type": "uint8"
        }
      ],
      "name": "TroveUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "BOOTSTRAP_PERIOD",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "CCR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DEBT_GAS_COMPENSATION",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "DECIMAL_PRECISION",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "L_Interest_Debt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "L_collateral",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "L_debt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "MCR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PERCENT_DIVISOR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PropelCore",
      "outputs": [
        {
          "internalType": "contract IPropelCore",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PropelUSD",
      "outputs": [
        {
          "internalType": "contract IPropelUSD",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SUNSETTING_INTEREST_RATE",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "TroveOwners",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "WETH",
      "outputs": [
        {
          "internalType": "contract IWETH",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "borrower",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "collSurplus",
          "type": "uint256"
        }
      ],
      "name": "addCollateralSurplus",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "applyPendingRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "coll",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "debt",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "baseRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "blast",
      "outputs": [
        {
          "internalType": "contract IBlast",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "borrowerOperationsAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "borrowingFeeFloor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "claimAllGas",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        }
      ],
      "name": "claimAllYield",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "claimCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "closeLastTroveWhenSunsetting",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "collAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "debtAmount",
          "type": "uint256"
        }
      ],
      "name": "closeTrove",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "closeTroveByLiquidation",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "collateralToken",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        }
      ],
      "name": "decayBaseRateAndGetBorrowingFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "debt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "coll",
          "type": "uint256"
        }
      ],
      "name": "decreaseDebtAndSendCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "defaultedCollateral",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "defaultedDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "distributeInterestDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeReceiver",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "fetchPrice",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_liquidator",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_coll",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_collSurplus",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_debtGasComp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_collGasComp",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_interest",
          "type": "uint256"
        }
      ],
      "name": "finalizeLiquidation",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "gasPoolAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        }
      ],
      "name": "getBorrowingFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        }
      ],
      "name": "getBorrowingFeeWithDecay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getBorrowingRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getBorrowingRateWithDecay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getClaimableWETH",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "getCurrentICR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getCurrentOutstandingInterestDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getEntireDebtAndColl",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "debt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "coll",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "pendingDebtReward",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "pendingCollateralReward",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getEntireSystemBalances",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getEntireSystemColl",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getEntireSystemDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getGlobalSystemDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getNominalICR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getOutstandingInterestDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getPendingCollAndDebtRewards",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPendingInterestDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getPendingSystemInterestDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_collateralDrawn",
          "type": "uint256"
        }
      ],
      "name": "getRedemptionFeeWithDecay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "getRedemptionICR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getRedemptionRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getRedemptionRateWithDecay",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getRewardSnapshots",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "collateral",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "debt",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "interest",
              "type": "uint256"
            }
          ],
          "internalType": "struct ITroveManager.RewardSnapshot",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalActiveCollateral",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTotalActiveDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getTrove",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "debt",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "coll",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "stake",
              "type": "uint256"
            },
            {
              "internalType": "enum ITroveManager.Status",
              "name": "status",
              "type": "uint8"
            },
            {
              "internalType": "uint128",
              "name": "arrayIndex",
              "type": "uint128"
            }
          ],
          "internalType": "struct ITroveManager.Trove",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getTroveCollAndDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "coll",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "debt",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_index",
          "type": "uint256"
        }
      ],
      "name": "getTroveFromTroveOwnersArray",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "debt",
          "type": "uint256"
        }
      ],
      "name": "getTroveInterest",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getTroveOwnersCount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getTroveStake",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "getTroveStatus",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "guardian",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "hasPendingRewards",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "interestPayable",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "interestRate",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastCollateralError_Redistribution",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastDebtError_Redistribution",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastFeeOperationTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastInterestDebtError_Redistribution",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "lastInterestDebtUpdateTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "liquidationManager",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxBorrowingFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxRedemptionFee",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxSystemDebt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "minuteDecayFactor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_collateral",
          "type": "uint256"
        }
      ],
      "name": "movePendingTroveRewardsToActiveBalances",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_compositeDebt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "NICR",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_upperHint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_lowerHint",
          "type": "address"
        }
      ],
      "name": "openTrove",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "stake",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "arrayIndex",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "periodFinish",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "priceFeed",
      "outputs": [
        {
          "internalType": "contract IPriceFeed",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debtAmount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_firstRedemptionHint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_upperPartialRedemptionHint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_lowerPartialRedemptionHint",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_partialRedemptionHintNICR",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxIterations",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxFeePercentage",
          "type": "uint256"
        }
      ],
      "name": "redeemCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "redemptionFeeFloor",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        }
      ],
      "name": "repayInterest",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        }
      ],
      "name": "repayInterestDebt",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardIntegral",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rewardRate",
      "outputs": [
        {
          "internalType": "uint128",
          "name": "",
          "type": "uint128"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_priceFeedAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_sortedTrovesAddress",
          "type": "address"
        },
        {
          "internalType": "contract IERC20",
          "name": "_collateralToken",
          "type": "address"
        }
      ],
      "name": "setAddresses",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_interestRate",
          "type": "uint32"
        }
      ],
      "name": "setInterestRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_MCR",
          "type": "uint256"
        }
      ],
      "name": "setMCR",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_maxSystemDebt",
          "type": "uint256"
        }
      ],
      "name": "setMaxSystemDebt",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_minuteDecayFactor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_redemptionFeeFloor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxRedemptionFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_borrowingFeeFloor",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxBorrowingFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxSystemDebt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_MCR",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_interestRate",
          "type": "uint32"
        }
      ],
      "name": "setParameters",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_paused",
          "type": "bool"
        }
      ],
      "name": "setPaused",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_priceFeedAddress",
          "type": "address"
        }
      ],
      "name": "setPriceFeed",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sortedTroves",
      "outputs": [
        {
          "internalType": "contract ISortedTroves",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startSunset",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "startTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sunsetting",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "surplusBalances",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "systemDeploymentTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalCollateralSnapshot",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalStakes",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalStakesSnapshot",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bool",
          "name": "_isDebtIncrease",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "_debtChange",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_netDebtChange",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isCollIncrease",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "_collChange",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_upperHint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_lowerHint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_borrower",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receiver",
          "type": "address"
        }
      ],
      "name": "updateTroveFromAdjustment",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0xa5e8c6b9217402a9e466c5b3254923a3e570fc1d454a440b28b13b669d8ea0b7",
  "receipt": {
    "to": null,
    "from": "0xF1658C608708172655A8e70a1624c29F956Ee63D",
    "contractAddress": "0x9e982B7AE8d7F4Ec08C93e4FE109AF420ECe7462",
    "transactionIndex": 2,
    "gasUsed": "5099708",
    "logsBloom": "0x00000000000000000000000000000000000000000008000000000000002000000000000000000000000000000000000000000000000000000008000000000000000000000000000002080000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000010000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x802ad475e4f26e45d00ca2e470167401d7cb2f119ad0587d02033b49c9a8db3d",
    "transactionHash": "0xa5e8c6b9217402a9e466c5b3254923a3e570fc1d454a440b28b13b669d8ea0b7",
    "logs": [
      {
        "transactionIndex": 2,
        "blockNumber": 2166440,
        "transactionHash": "0xa5e8c6b9217402a9e466c5b3254923a3e570fc1d454a440b28b13b669d8ea0b7",
        "address": "0x4200000000000000000000000000000000000023",
        "topics": [
          "0xcaa97ab28bae75adcb5a02786c64b44d0d3139aa521bf831cdfbe280ef246e36",
          "0x0000000000000000000000009e982b7ae8d7f4ec08c93e4fe109af420ece7462"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000002",
        "logIndex": 1,
        "blockHash": "0x802ad475e4f26e45d00ca2e470167401d7cb2f119ad0587d02033b49c9a8db3d"
      }
    ],
    "blockNumber": 2166440,
    "cumulativeGasUsed": "5194014",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x8E92506660a9e523FE144e21d2A50B43045fdEFd",
    "0x787F4D1833D43fda0Ef47bB9345387a7CB41B346",
    "0x47c6413161E35ab40744453957d95063051a97A0",
    "0xc5ED6Bd52c5Fb9C716Ef6Caf6a35b4f4B858bab5",
    "0xb92fcffb30fb16517439e667e045eef041d5a48f",
    "200000000000000000000"
  ],
  "numDeployments": 1,
  "solcInputHash": "4de37676d1c004b36b5963ce08e9eb57",
  "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IPropelCore\",\"name\":\"_PropelCore\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_gasPoolAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_PropelUSDAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_borrowerOperationsAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_liquidationManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasCompensation\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_baseRate\",\"type\":\"uint256\"}],\"name\":\"BaseRateUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"CollateralSent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"InsterstPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"}],\"name\":\"InterestDebtDistributed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_L_collateral\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_L_debt\",\"type\":\"uint256\"}],\"name\":\"LTermsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_lastFeeOpTime\",\"type\":\"uint256\"}],\"name\":\"LastFeeOpTimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_attemptedDebtAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_actualDebtAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_collateralSent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_InterestDebt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_collateralFee\",\"type\":\"uint256\"}],\"name\":\"Redemption\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"claimed\",\"type\":\"uint256\"}],\"name\":\"RewardClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalStakesSnapshot\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_totalCollateralSnapshot\",\"type\":\"uint256\"}],\"name\":\"SystemSnapshotsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newTotalStakes\",\"type\":\"uint256\"}],\"name\":\"TotalStakesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newIndex\",\"type\":\"uint256\"}],\"name\":\"TroveIndexUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_L_collateral\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_L_debt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_L_Interest_Debt\",\"type\":\"uint256\"}],\"name\":\"TroveSnapshotsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_coll\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_stake\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum ITroveManager.TroveManagerOperation\",\"name\":\"_operation\",\"type\":\"uint8\"}],\"name\":\"TroveUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BOOTSTRAP_PERIOD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CCR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEBT_GAS_COMPENSATION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DECIMAL_PRECISION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L_Interest_Debt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L_collateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"L_debt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MCR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PERCENT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PropelCore\",\"outputs\":[{\"internalType\":\"contract IPropelCore\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PropelUSD\",\"outputs\":[{\"internalType\":\"contract IPropelUSD\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SUNSETTING_INTEREST_RATE\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"TroveOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"borrower\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collSurplus\",\"type\":\"uint256\"}],\"name\":\"addCollateralSurplus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"applyPendingRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blast\",\"outputs\":[{\"internalType\":\"contract IBlast\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"borrowerOperationsAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"borrowingFeeFloor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"claimAllGas\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"claimAllYield\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"claimCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"closeLastTroveWhenSunsetting\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtAmount\",\"type\":\"uint256\"}],\"name\":\"closeTrove\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"closeTroveByLiquidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"collateralToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"}],\"name\":\"decayBaseRateAndGetBorrowingFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"coll\",\"type\":\"uint256\"}],\"name\":\"decreaseDebtAndSendCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"defaultedCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"defaultedDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distributeInterestDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fetchPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_liquidator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_collSurplus\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_debtGasComp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_collGasComp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"finalizeLiquidation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasPoolAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"}],\"name\":\"getBorrowingFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"}],\"name\":\"getBorrowingFeeWithDecay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBorrowingRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBorrowingRateWithDecay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClaimableWETH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"}],\"name\":\"getCurrentICR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentOutstandingInterestDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getEntireDebtAndColl\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pendingDebtReward\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pendingCollateralReward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEntireSystemBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEntireSystemColl\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEntireSystemDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getGlobalSystemDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getNominalICR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOutstandingInterestDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getPendingCollAndDebtRewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingInterestDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPendingSystemInterestDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_collateralDrawn\",\"type\":\"uint256\"}],\"name\":\"getRedemptionFeeWithDecay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"}],\"name\":\"getRedemptionICR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRedemptionRate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRedemptionRateWithDecay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getRewardSnapshots\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"collateral\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"interest\",\"type\":\"uint256\"}],\"internalType\":\"struct ITroveManager.RewardSnapshot\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalActiveCollateral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTotalActiveDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getTrove\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"enum ITroveManager.Status\",\"name\":\"status\",\"type\":\"uint8\"},{\"internalType\":\"uint128\",\"name\":\"arrayIndex\",\"type\":\"uint128\"}],\"internalType\":\"struct ITroveManager.Trove\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getTroveCollAndDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getTroveFromTroveOwnersArray\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"debt\",\"type\":\"uint256\"}],\"name\":\"getTroveInterest\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTroveOwnersCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getTroveStake\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"getTroveStatus\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"guardian\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"hasPendingRewards\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interestPayable\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"interestRate\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCollateralError_Redistribution\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastDebtError_Redistribution\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFeeOperationTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastInterestDebtError_Redistribution\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastInterestDebtUpdateTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"liquidationManager\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxBorrowingFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxRedemptionFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSystemDebt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minuteDecayFactor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_collateral\",\"type\":\"uint256\"}],\"name\":\"movePendingTroveRewardsToActiveBalances\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_compositeDebt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"NICR\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_upperHint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lowerHint\",\"type\":\"address\"}],\"name\":\"openTrove\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"stake\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"arrayIndex\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"periodFinish\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"priceFeed\",\"outputs\":[{\"internalType\":\"contract IPriceFeed\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debtAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_firstRedemptionHint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_upperPartialRedemptionHint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lowerPartialRedemptionHint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_partialRedemptionHintNICR\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxIterations\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxFeePercentage\",\"type\":\"uint256\"}],\"name\":\"redeemCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"redemptionFeeFloor\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"}],\"name\":\"repayInterest\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"}],\"name\":\"repayInterestDebt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardIntegral\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardRate\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_priceFeedAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_sortedTrovesAddress\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"_collateralToken\",\"type\":\"address\"}],\"name\":\"setAddresses\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_interestRate\",\"type\":\"uint32\"}],\"name\":\"setInterestRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_MCR\",\"type\":\"uint256\"}],\"name\":\"setMCR\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxSystemDebt\",\"type\":\"uint256\"}],\"name\":\"setMaxSystemDebt\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_minuteDecayFactor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_redemptionFeeFloor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxRedemptionFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_borrowingFeeFloor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxBorrowingFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxSystemDebt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_MCR\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"_interestRate\",\"type\":\"uint32\"}],\"name\":\"setParameters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_paused\",\"type\":\"bool\"}],\"name\":\"setPaused\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_priceFeedAddress\",\"type\":\"address\"}],\"name\":\"setPriceFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sortedTroves\",\"outputs\":[{\"internalType\":\"contract ISortedTroves\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startSunset\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sunsetting\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"surplusBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"systemDeploymentTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalCollateralSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalStakes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalStakesSnapshot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_isDebtIncrease\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_debtChange\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_netDebtChange\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"_isCollIncrease\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_collChange\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_upperHint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_lowerHint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_borrower\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_receiver\",\"type\":\"address\"}],\"name\":\"updateTroveFromAdjustment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"getEntireDebtAndColl(address)\":{\"details\":\"Used by the liquidation manager\"},\"getTroveCollAndDebt(address)\":{\"details\":\"Also includes pending rewards from redistribution\"},\"setPaused(bool)\":{\"params\":{\"_paused\":\"If true the protocol is paused\"}},\"setPriceFeed(address)\":{\"params\":{\"_priceFeedAddress\":\"Price feed address\"}}},\"title\":\"Propel Trove Manager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"claimCollateral(address)\":{\"notice\":\"Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode\"},\"getEntireDebtAndColl(address)\":{\"notice\":\"Get the total and pending collateral and debt amounts for a trove\"},\"getTroveCollAndDebt(address)\":{\"notice\":\"Get the current total collateral and debt amounts for a trove\"},\"setPaused(bool)\":{\"notice\":\"Sets the pause state for this trove manager         Pausing is used to mitigate risks in exceptional circumstances         Functionalities affected by pausing are:         - New borrowing is not possible         - New collateral deposits are not possible\"},\"setPriceFeed(address)\":{\"notice\":\"Sets a custom price feed for this trove manager\"}},\"notice\":\"Based on Liquity's `TroveManager` https://github.com/liquity/dev/blob/main/packages/contracts/contracts/TroveManager.sol Propel's implementation is modified so that multiple `TroveManager` and `SortedTroves` contracts are deployed in tandem, with each pair managing troves of a single collateral type. Functionality related to liquidations has been moved to `LiquidationManager`. This was necessary to avoid the restriction on deployed bytecode size.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/TroveManager.sol\":\"TroveManager\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":2000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\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 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    /**\\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 `to`.\\n     *\\n     * Returns a boolean value indicating whether the operation succeeded.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transfer(address to, 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 `from` to `to` 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(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\\n *\\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\\n * need to send a transaction, and thus is not required to hold Ether at all.\\n *\\n * ==== Security Considerations\\n *\\n * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature\\n * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be\\n * considered as an intention to spend the allowance in any specific way. The second is that because permits have\\n * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should\\n * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be\\n * generally recommended is:\\n *\\n * ```solidity\\n * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {\\n *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}\\n *     doThing(..., value);\\n * }\\n *\\n * function doThing(..., uint256 value) public {\\n *     token.safeTransferFrom(msg.sender, address(this), value);\\n *     ...\\n * }\\n * ```\\n *\\n * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of\\n * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also\\n * {SafeERC20-safeTransferFrom}).\\n *\\n * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so\\n * contracts should have entry points that don't rely on permit.\\n */\\ninterface IERC20Permit {\\n    /**\\n     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\\n     * given ``owner``'s signed approval.\\n     *\\n     * IMPORTANT: The same issues {IERC20-approve} has related to transaction\\n     * ordering also apply here.\\n     *\\n     * Emits an {Approval} event.\\n     *\\n     * Requirements:\\n     *\\n     * - `spender` cannot be the zero address.\\n     * - `deadline` must be a timestamp in the future.\\n     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\\n     * over the EIP712-formatted function arguments.\\n     * - the signature must use ``owner``'s current nonce (see {nonces}).\\n     *\\n     * For more information on the signature format, see the\\n     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\\n     * section].\\n     *\\n     * CAUTION: See Security Considerations above.\\n     */\\n    function permit(\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) external;\\n\\n    /**\\n     * @dev Returns the current nonce for `owner`. This value must be\\n     * included whenever a signature is generated for {permit}.\\n     *\\n     * Every successful call to {permit} increases ``owner``'s nonce by one. This\\n     * prevents a signature from being used multiple times.\\n     */\\n    function nonces(address owner) external view returns (uint256);\\n\\n    /**\\n     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\\n     */\\n    // solhint-disable-next-line func-name-mixedcase\\n    function DOMAIN_SEPARATOR() external view returns (bytes32);\\n}\\n\",\"keccak256\":\"0xb264c03a3442eb37a68ad620cefd1182766b58bee6cec40343480392d6b14d69\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\nimport \\\"../extensions/IERC20Permit.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    /**\\n     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransfer(IERC20 token, address to, uint256 value) internal {\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\\n    }\\n\\n    /**\\n     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the\\n     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.\\n     */\\n    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) 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(IERC20 token, address spender, uint256 value) 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    /**\\n     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        uint256 oldAllowance = token.allowance(address(this), spender);\\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));\\n    }\\n\\n    /**\\n     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful.\\n     */\\n    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {\\n        unchecked {\\n            uint256 oldAllowance = token.allowance(address(this), spender);\\n            require(oldAllowance >= value, \\\"SafeERC20: decreased allowance below zero\\\");\\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));\\n        }\\n    }\\n\\n    /**\\n     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,\\n     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval\\n     * to be set to zero before setting it to a non-zero value, such as USDT.\\n     */\\n    function forceApprove(IERC20 token, address spender, uint256 value) internal {\\n        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);\\n\\n        if (!_callOptionalReturnBool(token, approvalCall)) {\\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));\\n            _callOptionalReturn(token, approvalCall);\\n        }\\n    }\\n\\n    /**\\n     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.\\n     * Revert on invalid signature.\\n     */\\n    function safePermit(\\n        IERC20Permit token,\\n        address owner,\\n        address spender,\\n        uint256 value,\\n        uint256 deadline,\\n        uint8 v,\\n        bytes32 r,\\n        bytes32 s\\n    ) internal {\\n        uint256 nonceBefore = token.nonces(owner);\\n        token.permit(owner, spender, value, deadline, v, r, s);\\n        uint256 nonceAfter = token.nonces(owner);\\n        require(nonceAfter == nonceBefore + 1, \\\"SafeERC20: permit did not succeed\\\");\\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        require(returndata.length == 0 || abi.decode(returndata, (bool)), \\\"SafeERC20: ERC20 operation did not succeed\\\");\\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     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.\\n     */\\n    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {\\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 cannot use {Address-functionCall} here since this should return false\\n        // and not revert is the subcall reverts.\\n\\n        (bool success, bytes memory returndata) = address(token).call(data);\\n        return\\n            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));\\n    }\\n}\\n\",\"keccak256\":\"0xabefac93435967b4d36a4fabcbdbb918d1f0b7ae3c3d85bc30923b326c927ed1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\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     * Furthermore, `isContract` will also return true if the target contract within\\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n     * which only has an effect at the end of a transaction.\\n     * ====\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n     *\\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n     * constructor.\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize/address.code.length, which returns 0\\n        // for contracts in construction, since the code is only stored at the end\\n        // of the constructor execution.\\n\\n        return account.code.length > 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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, \\\"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(address target, bytes memory data, uint256 value) 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        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResultFromTarget(target, 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        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResultFromTarget(target, 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        (bool success, bytes memory returndata) = target.delegatecall(data);\\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n     *\\n     * _Available since v4.8._\\n     */\\n    function verifyCallResultFromTarget(\\n        address target,\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        if (success) {\\n            if (returndata.length == 0) {\\n                // only check isContract if the call was successful and the return data is empty\\n                // otherwise we already know that it was a contract\\n                require(isContract(target), \\\"Address: call to non-contract\\\");\\n            }\\n            return returndata;\\n        } else {\\n            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    /**\\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason or 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            _revert(returndata, errorMessage);\\n        }\\n    }\\n\\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\\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            /// @solidity memory-safe-assembly\\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\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n    enum Rounding {\\n        Down, // Toward negative infinity\\n        Up, // Toward infinity\\n        Zero // Toward zero\\n    }\\n\\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 == 0 ? 0 : (a - 1) / b + 1;\\n    }\\n\\n    /**\\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n     * with further edits by Uniswap Labs also under MIT license.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n        unchecked {\\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n            // use the Chinese Remainder Theorem to reconstruct 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(x, y, not(0))\\n                prod0 := mul(x, y)\\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                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n                // The surrounding unchecked block does not change this fact.\\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n                return prod0 / denominator;\\n            }\\n\\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n            require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n            ///////////////////////////////////////////////\\n            // 512 by 256 division.\\n            ///////////////////////////////////////////////\\n\\n            // Make division exact by subtracting the remainder from [prod1 prod0].\\n            uint256 remainder;\\n            assembly {\\n                // Compute remainder using mulmod.\\n                remainder := mulmod(x, y, denominator)\\n\\n                // Subtract 256 bit number from 512 bit number.\\n                prod1 := sub(prod1, gt(remainder, prod0))\\n                prod0 := sub(prod0, remainder)\\n            }\\n\\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n            // See https://cs.stackexchange.com/q/138556/92363.\\n\\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\\n            uint256 twos = denominator & (~denominator + 1);\\n            assembly {\\n                // Divide denominator by twos.\\n                denominator := div(denominator, twos)\\n\\n                // Divide [prod1 prod0] by twos.\\n                prod0 := div(prod0, twos)\\n\\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n                twos := add(div(sub(0, twos), twos), 1)\\n            }\\n\\n            // Shift in bits from prod1 into prod0.\\n            prod0 |= prod1 * twos;\\n\\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n            // four bits. That is, denominator * inv = 1 mod 2^4.\\n            uint256 inverse = (3 * denominator) ^ 2;\\n\\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n            // in modular arithmetic, doubling the correct bits in each step.\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n            // is no longer required.\\n            result = prod0 * inverse;\\n            return result;\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n     */\\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n        uint256 result = mulDiv(x, y, denominator);\\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n            result += 1;\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n     *\\n     * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n     */\\n    function sqrt(uint256 a) internal pure returns (uint256) {\\n        if (a == 0) {\\n            return 0;\\n        }\\n\\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n        //\\n        // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n        //\\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n        // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n        // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n        //\\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n        uint256 result = 1 << (log2(a) >> 1);\\n\\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n        // into the expected uint128 result.\\n        unchecked {\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            result = (result + a / result) >> 1;\\n            return min(result, a / result);\\n        }\\n    }\\n\\n    /**\\n     * @notice Calculates sqrt(a), following the selected rounding direction.\\n     */\\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = sqrt(a);\\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 128;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 64;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 32;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 16;\\n            }\\n            if (value >> 8 > 0) {\\n                value >>= 8;\\n                result += 8;\\n            }\\n            if (value >> 4 > 0) {\\n                value >>= 4;\\n                result += 4;\\n            }\\n            if (value >> 2 > 0) {\\n                value >>= 2;\\n                result += 2;\\n            }\\n            if (value >> 1 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log2(value);\\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >= 10 ** 64) {\\n                value /= 10 ** 64;\\n                result += 64;\\n            }\\n            if (value >= 10 ** 32) {\\n                value /= 10 ** 32;\\n                result += 32;\\n            }\\n            if (value >= 10 ** 16) {\\n                value /= 10 ** 16;\\n                result += 16;\\n            }\\n            if (value >= 10 ** 8) {\\n                value /= 10 ** 8;\\n                result += 8;\\n            }\\n            if (value >= 10 ** 4) {\\n                value /= 10 ** 4;\\n                result += 4;\\n            }\\n            if (value >= 10 ** 2) {\\n                value /= 10 ** 2;\\n                result += 2;\\n            }\\n            if (value >= 10 ** 1) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log10(value);\\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n        }\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256, rounded down, of a positive value.\\n     * Returns 0 if given 0.\\n     *\\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n     */\\n    function log256(uint256 value) internal pure returns (uint256) {\\n        uint256 result = 0;\\n        unchecked {\\n            if (value >> 128 > 0) {\\n                value >>= 128;\\n                result += 16;\\n            }\\n            if (value >> 64 > 0) {\\n                value >>= 64;\\n                result += 8;\\n            }\\n            if (value >> 32 > 0) {\\n                value >>= 32;\\n                result += 4;\\n            }\\n            if (value >> 16 > 0) {\\n                value >>= 16;\\n                result += 2;\\n            }\\n            if (value >> 8 > 0) {\\n                result += 1;\\n            }\\n        }\\n        return result;\\n    }\\n\\n    /**\\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n     * Returns 0 if given 0.\\n     */\\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n        unchecked {\\n            uint256 result = log256(value);\\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"contracts/core/InterestDebtPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IPropelUSD.sol\\\";\\nimport \\\"../dependencies/PropelMath.sol\\\";\\nimport \\\"../dependencies/console.sol\\\";\\n\\nabstract contract InterestDebtPool {\\n\\tIPropelUSD public immutable PropelUSD;\\n\\tuint64 internal constant PRECISION = 1e18;\\n\\tuint64 internal constant SECONDS_IN_YEAR = 365 days;\\n\\tuint32 internal constant MAXFP = 1e6;\\n\\tuint32 public interestRate;\\n\\tuint256 internal outstandingInterestDebt;\\n\\tuint256 public L_Interest_Debt;\\n\\tuint256 public lastInterestDebtUpdateTime;\\n\\tuint256 public lastInterestDebtError_Redistribution;\\n\\n\\tconstructor(address _PropelUSD) {\\n\\t\\tPropelUSD = IPropelUSD(_PropelUSD);\\n\\t}\\n\\n\\tevent InterestDebtDistributed(uint256 debt);\\n\\n\\tfunction getOutstandingInterestDebt() public view returns (uint256) {\\n\\t\\treturn outstandingInterestDebt;\\n\\t}\\n\\n\\tfunction getCurrentOutstandingInterestDebt() public view returns (uint256) {\\n\\t\\treturn outstandingInterestDebt + getPendingSystemInterestDebt();\\n\\t}\\n\\n\\tfunction decreaseOutstandingInterestDebt(uint256 amount) internal {\\n\\t\\toutstandingInterestDebt -= amount;\\n\\t}\\n\\n\\tfunction getEntireSystemDebt() public view virtual returns (uint256 entireSystemDebt);\\n\\n\\tfunction _distributeInterestDebt() internal returns (uint256) {\\n\\t\\tif (lastInterestDebtUpdateTime == 0) {\\n\\t\\t\\tlastInterestDebtUpdateTime = block.timestamp;\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\tif (lastInterestDebtUpdateTime == block.timestamp) {\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\tuint256 systemDebt = getEntireSystemDebt();\\n\\t\\tif (systemDebt == 0) {\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\tuint256 feeNumerator = (systemDebt * ((block.timestamp - lastInterestDebtUpdateTime) * interestRate * PRECISION)) / SECONDS_IN_YEAR / MAXFP + lastInterestDebtError_Redistribution;\\n\\t\\tlastInterestDebtUpdateTime = block.timestamp;\\n\\t\\tuint256 feeRewardPerUnitDebt = feeNumerator / systemDebt;\\n\\t\\tlastInterestDebtError_Redistribution = feeNumerator - (feeRewardPerUnitDebt * systemDebt);\\n\\t\\tL_Interest_Debt += feeRewardPerUnitDebt;\\n\\t\\tuint256 interest = (feeRewardPerUnitDebt * systemDebt) / PRECISION;\\n\\t\\toutstandingInterestDebt += interest;\\n\\t\\tPropelUSD.mint(feeReceiver(), interest);\\n\\t\\temit InterestDebtDistributed(interest);\\n\\t\\treturn feeRewardPerUnitDebt;\\n\\t}\\n\\n\\tfunction feeReceiver() public view virtual returns (address);\\n\\n\\tfunction getPendingSystemInterestDebt() public view returns (uint256) {\\n\\t\\tif (lastInterestDebtUpdateTime == 0 || lastInterestDebtUpdateTime == block.timestamp) {\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\tuint256 systemDebt = getEntireSystemDebt();\\n\\t\\tif (systemDebt == 0) {\\n\\t\\t\\treturn 0;\\n\\t\\t}\\n\\t\\tuint256 feeNumerator = (systemDebt * ((block.timestamp - lastInterestDebtUpdateTime) * interestRate * PRECISION)) / SECONDS_IN_YEAR / MAXFP + lastInterestDebtError_Redistribution;\\n\\t\\tuint256 feeRewardPerUnitDebt = feeNumerator / systemDebt;\\n\\t\\treturn (feeRewardPerUnitDebt * systemDebt) / PRECISION;\\n\\t}\\n\\n\\tfunction getPendingInterestDebt() public view returns (uint256) {\\n\\t\\tif (lastInterestDebtUpdateTime == 0 || lastInterestDebtUpdateTime == block.timestamp) {\\n\\t\\t\\treturn L_Interest_Debt;\\n\\t\\t}\\n\\t\\tuint256 systemDebt = getEntireSystemDebt();\\n\\t\\tif (systemDebt == 0) {\\n\\t\\t\\treturn L_Interest_Debt;\\n\\t\\t}\\n\\t\\tuint256 feeNumerator = (systemDebt * (block.timestamp - lastInterestDebtUpdateTime) * interestRate * PRECISION) / SECONDS_IN_YEAR / MAXFP + lastInterestDebtError_Redistribution;\\n\\t\\treturn L_Interest_Debt + feeNumerator / systemDebt;\\n\\t}\\n}\\n\",\"keccak256\":\"0xc00bb0481e8417862440397791dfea5c5d316b3585138d0e372215389a578bb5\",\"license\":\"MIT\"},\"contracts/core/TroveManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/math/Math.sol\\\";\\nimport \\\"../interfaces/IBorrowerOperations.sol\\\";\\nimport \\\"../interfaces/IPropelUSD.sol\\\";\\nimport \\\"../interfaces/ITroveManager.sol\\\";\\nimport \\\"../dependencies/PropelBase.sol\\\";\\nimport \\\"../dependencies/BlastWrapper.sol\\\";\\nimport \\\"../dependencies/SystemStart.sol\\\";\\nimport \\\"../dependencies/PropelMath.sol\\\";\\nimport \\\"./InterestDebtPool.sol\\\";\\n\\n/**\\n    @title Propel Trove Manager\\n    @notice Based on Liquity's `TroveManager`\\n            https://github.com/liquity/dev/blob/main/packages/contracts/contracts/TroveManager.sol\\n\\n            Propel's implementation is modified so that multiple `TroveManager` and `SortedTroves`\\n            contracts are deployed in tandem, with each pair managing troves of a single collateral\\n            type.\\n\\n            Functionality related to liquidations has been moved to `LiquidationManager`. This was\\n            necessary to avoid the restriction on deployed bytecode size.\\n */\\ncontract TroveManager is ITroveManager, InterestDebtPool, PropelBase, BlastWrapper, SystemStart {\\n\\tusing SafeERC20 for IERC20;\\n\\n\\t// --- Connected contract declarations ---\\n\\taddress public immutable borrowerOperationsAddress;\\n\\taddress public immutable liquidationManager;\\n\\taddress public immutable gasPoolAddress;\\n\\n\\tIPriceFeed public override priceFeed;\\n\\tIERC20 public collateralToken;\\n\\n\\t// A doubly linked list of Troves, sorted by their collateral ratios\\n\\tISortedTroves public override sortedTroves;\\n\\n\\t// Minimum collateral ratio for individual troves\\n\\tuint256 public MCR;\\n\\n\\tuint256 internal constant SECONDS_IN_ONE_MINUTE = 60;\\n\\n\\t// During bootsrap period redemptions are not allowed\\n\\tuint256 public constant BOOTSTRAP_PERIOD = 14 days;\\n\\tuint32 public constant SUNSETTING_INTEREST_RATE = 5e5; //50%\\n\\n\\t/*\\n\\t * BETA: 18 digit decimal. Parameter by which to divide the redeemed fraction, in order to calc the new base rate from a redemption.\\n\\t * Corresponds to (1 / ALPHA) in the white paper.\\n\\t */\\n\\tuint256 internal constant BETA = 2;\\n\\n\\t// commented values are Liquity's fixed settings for each parameter\\n\\tuint256 public minuteDecayFactor; // 999037758833783000  (half-life of 12 hours)\\n\\tuint256 public redemptionFeeFloor; // DECIMAL_PRECISION / 1000 * 5  (0.5%)\\n\\tuint256 public maxRedemptionFee; // DECIMAL_PRECISION  (100%)\\n\\tuint256 public borrowingFeeFloor; // DECIMAL_PRECISION / 1000 * 5  (0.5%)\\n\\tuint256 public maxBorrowingFee; // DECIMAL_PRECISION / 100 * 5  (5%)\\n\\tuint256 public maxSystemDebt;\\n\\n\\tuint256 public systemDeploymentTime;\\n\\tbool public paused;\\n\\tbool public sunsetting;\\n\\n\\tuint256 public baseRate;\\n\\n\\t// The timestamp of the latest fee operation (redemption or new debt issuance)\\n\\tuint256 public lastFeeOperationTime;\\n\\n\\tuint256 public totalStakes;\\n\\n\\t// Snapshot of the value of totalStakes, taken immediately after the latest liquidation\\n\\tuint256 public totalStakesSnapshot;\\n\\n\\t// Snapshot of the total collateral taken immediately after the latest liquidation.\\n\\tuint256 public totalCollateralSnapshot;\\n\\n\\t/*\\n\\t * L_collateral and L_debt track the sums of accumulated liquidation rewards per unit staked. During its lifetime, each stake earns:\\n\\t *\\n\\t * An collateral gain of ( stake * [L_collateral - L_collateral(0)] )\\n\\t * A debt increase  of ( stake * [L_debt - L_debt(0)] )\\n\\t *\\n\\t * Where L_collateral(0) and L_debt(0) are snapshots of L_collateral and L_debt for the active Trove taken at the instant the stake was made\\n\\t */\\n\\tuint256 public L_collateral;\\n\\tuint256 public L_debt;\\n\\n\\t// Error trackers for the trove redistribution calculation\\n\\tuint256 public lastCollateralError_Redistribution;\\n\\tuint256 public lastDebtError_Redistribution;\\n\\n\\tuint256 internal totalActiveCollateral;\\n\\tuint256 internal totalActiveDebt;\\n\\tuint256 public interestPayable;\\n\\n\\tuint256 public defaultedCollateral;\\n\\tuint256 public defaultedDebt;\\n\\n\\tuint256 public rewardIntegral;\\n\\tuint128 public rewardRate;\\n\\tuint32 public periodFinish;\\n\\n\\tmapping(address => Trove) internal Troves;\\n\\n\\tmapping(address => RewardSnapshot) internal rewardSnapshots;\\n\\n\\tmapping(address => uint256) public surplusBalances;\\n\\n\\t// Map addresses with active troves to their RewardSnapshot\\n\\n\\t// Array of all active trove addresses - used to to compute an approximate hint off-chain, for the sorted list insertion\\n\\taddress[] public TroveOwners;\\n\\n\\tmodifier whenNotPaused() {\\n\\t\\trequire(!paused, \\\"Collateral Paused\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\tconstructor(\\n\\t\\tIPropelCore _PropelCore,\\n\\t\\taddress _gasPoolAddress,\\n\\t\\taddress _PropelUSDAddress,\\n\\t\\taddress _borrowerOperationsAddress,\\n\\t\\taddress _liquidationManager,\\n\\t\\tuint256 _gasCompensation\\n\\t) InterestDebtPool(_PropelUSDAddress) BlastWrapper(_PropelCore) PropelBase(_gasCompensation) SystemStart(_PropelCore) {\\n\\t\\tgasPoolAddress = _gasPoolAddress;\\n\\t\\tborrowerOperationsAddress = _borrowerOperationsAddress;\\n\\t\\tliquidationManager = _liquidationManager;\\n\\t}\\n\\n\\tfunction setAddresses(address _priceFeedAddress, address _sortedTrovesAddress, IERC20 _collateralToken) external override {\\n\\t\\tassert(address(sortedTroves) == address(0));\\n\\t\\tpriceFeed = IPriceFeed(_priceFeedAddress);\\n\\t\\tsortedTroves = ISortedTroves(_sortedTrovesAddress);\\n\\t\\tcollateralToken = IERC20(_collateralToken);\\n\\t\\tsunsetting = false;\\n\\n\\t\\tsystemDeploymentTime = block.timestamp;\\n\\t}\\n\\n\\tfunction feeReceiver() public view override returns (address) {\\n\\t\\treturn PropelCore.feeReceiver();\\n\\t}\\n\\n\\tfunction startSunset() external onlyOwner {\\n\\t\\t_distributeInterestDebt();\\n\\t\\tsunsetting = true;\\n\\t\\tinterestRate = SUNSETTING_INTEREST_RATE;\\n\\t\\tredemptionFeeFloor = 0;\\n\\t\\tmaxSystemDebt = 0;\\n\\t}\\n\\n\\t/**\\n\\t * @notice Sets the pause state for this trove manager\\n\\t *         Pausing is used to mitigate risks in exceptional circumstances\\n\\t *         Functionalities affected by pausing are:\\n\\t *         - New borrowing is not possible\\n\\t *         - New collateral deposits are not possible\\n\\t * @param _paused If true the protocol is paused\\n\\t */\\n\\tfunction setPaused(bool _paused) external {\\n\\t\\trequire((_paused && msg.sender == guardian()) || msg.sender == owner(), \\\"Unauthorized\\\");\\n\\t\\tpaused = _paused;\\n\\t}\\n\\n\\t/**\\n\\t * @notice Sets a custom price feed for this trove manager\\n\\t * @param _priceFeedAddress Price feed address\\n\\t */\\n\\tfunction setPriceFeed(address _priceFeedAddress) external onlyOwner {\\n\\t\\tpriceFeed = IPriceFeed(_priceFeedAddress);\\n\\t}\\n\\n\\tfunction setInterestRate(uint32 _interestRate) external onlyOwner {\\n\\t\\tassert(_interestRate <= MAXFP / 10);\\n\\t\\t_distributeInterestDebt();\\n\\t\\tinterestRate = _interestRate;\\n\\t}\\n\\n\\tfunction setMCR(uint256 _MCR) external onlyOwner {\\n\\t\\trequire(_MCR <= CCR && _MCR >= 1100000000000000000, \\\"MCR cannot be > CCR or < 110%\\\");\\n\\t\\tMCR = _MCR;\\n\\t}\\n\\n\\tfunction setMaxSystemDebt(uint256 _maxSystemDebt) external onlyOwner {\\n\\t\\trequire(_maxSystemDebt > getEntireSystemDebt(), \\\"new max system debt must be greater than current system debt\\\");\\n\\t\\tmaxSystemDebt = _maxSystemDebt;\\n\\t}\\n\\n\\t/*\\n        _minuteDecayFactor is calculated as\\n\\n            10**18 * (1/2)**(1/n)\\n\\n        where n = the half-life in minutes\\n     */\\n\\tfunction setParameters(uint256 _minuteDecayFactor, uint256 _redemptionFeeFloor, uint256 _maxRedemptionFee, uint256 _borrowingFeeFloor, uint256 _maxBorrowingFee, uint256 _maxSystemDebt, uint256 _MCR, uint32 _interestRate) public {\\n\\t\\trequire(!sunsetting, \\\"Cannot change after sunset\\\");\\n\\t\\trequire(_MCR <= CCR && _MCR >= 1100000000000000000, \\\"MCR cannot be > CCR or < 110%\\\");\\n\\t\\tif (minuteDecayFactor != 0) {\\n\\t\\t\\trequire(msg.sender == owner(), \\\"Only owner\\\");\\n\\t\\t}\\n\\t\\tassert(\\n\\t\\t\\t_minuteDecayFactor >= 977159968434245000 && // half-life of 30 minutes\\n\\t\\t\\t\\t_minuteDecayFactor <= 999931237762985000 // half-life of 1 week\\n\\t\\t);\\n\\t\\tassert(_redemptionFeeFloor <= _maxRedemptionFee && _maxRedemptionFee <= DECIMAL_PRECISION);\\n\\t\\tassert(_borrowingFeeFloor <= _maxBorrowingFee && _maxBorrowingFee <= DECIMAL_PRECISION);\\n\\t\\tassert(_interestRate <= MAXFP / 10);\\n\\t\\t_distributeInterestDebt();\\n\\t\\t_decayBaseRate();\\n\\n\\t\\tminuteDecayFactor = _minuteDecayFactor;\\n\\t\\tredemptionFeeFloor = _redemptionFeeFloor;\\n\\t\\tmaxRedemptionFee = _maxRedemptionFee;\\n\\t\\tborrowingFeeFloor = _borrowingFeeFloor;\\n\\t\\tmaxBorrowingFee = _maxBorrowingFee;\\n\\t\\tmaxSystemDebt = _maxSystemDebt;\\n\\n\\t\\tMCR = _MCR;\\n\\t\\tinterestRate = _interestRate;\\n\\t}\\n\\n\\tfunction distributeInterestDebt() public returns (uint256) {\\n\\t\\treturn _distributeInterestDebt();\\n\\t}\\n\\n\\t// --- Getters ---\\n\\n\\tfunction fetchPrice() public returns (uint256) {\\n\\t\\tIPriceFeed _priceFeed = priceFeed;\\n\\t\\treturn _priceFeed.fetchPrice(address(collateralToken));\\n\\t}\\n\\n\\tfunction getTrove(address _borrower) external view override returns (Trove memory) {\\n\\t\\treturn Troves[_borrower];\\n\\t}\\n\\n\\tfunction getRewardSnapshots(address _borrower) external view override returns (RewardSnapshot memory) {\\n\\t\\treturn rewardSnapshots[_borrower];\\n\\t}\\n\\n\\tfunction getTroveOwnersCount() external view returns (uint256) {\\n\\t\\treturn TroveOwners.length;\\n\\t}\\n\\n\\tfunction getTroveFromTroveOwnersArray(uint256 _index) external view returns (address) {\\n\\t\\treturn TroveOwners[_index];\\n\\t}\\n\\n\\tfunction getTroveStatus(address _borrower) external view returns (uint256) {\\n\\t\\treturn uint256(Troves[_borrower].status);\\n\\t}\\n\\n\\tfunction getTroveStake(address _borrower) external view returns (uint256) {\\n\\t\\treturn Troves[_borrower].stake;\\n\\t}\\n\\n\\t/**\\n        @notice Get the current total collateral and debt amounts for a trove\\n        @dev Also includes pending rewards from redistribution\\n     */\\n\\tfunction getTroveCollAndDebt(address _borrower) public view returns (uint256 coll, uint256 debt) {\\n\\t\\t(debt, coll, , ) = getEntireDebtAndColl(_borrower);\\n\\t\\treturn (coll, debt);\\n\\t}\\n\\n\\t/**\\n        @notice Get the total and pending collateral and debt amounts for a trove\\n        @dev Used by the liquidation manager\\n     */\\n\\tfunction getEntireDebtAndColl(address _borrower) public view returns (uint256 debt, uint256 coll, uint256 pendingDebtReward, uint256 pendingCollateralReward) {\\n\\t\\tTrove storage t = Troves[_borrower];\\n\\t\\tdebt = t.debt;\\n\\t\\tcoll = t.coll;\\n\\t\\t(pendingCollateralReward, pendingDebtReward) = getPendingCollAndDebtRewards(_borrower);\\n\\t\\tdebt = debt + pendingDebtReward;\\n\\t\\tcoll = coll + pendingCollateralReward;\\n\\t}\\n\\n\\tfunction getEntireSystemColl() public view returns (uint256) {\\n\\t\\treturn totalActiveCollateral + defaultedCollateral;\\n\\t}\\n\\n\\tfunction getEntireSystemDebt() public view override(ITroveManager, InterestDebtPool) returns (uint256) {\\n\\t\\treturn totalActiveDebt + defaultedDebt;\\n\\t}\\n\\n\\tfunction getGlobalSystemDebt() public view returns (uint256) {\\n\\t\\treturn totalActiveDebt + defaultedDebt + outstandingInterestDebt + getPendingSystemInterestDebt();\\n\\t}\\n\\n\\tfunction getEntireSystemBalances() external returns (uint256, uint256, uint256) {\\n\\t\\treturn (getEntireSystemColl(), getGlobalSystemDebt(), fetchPrice());\\n\\t}\\n\\n\\t// --- Helper functions ---\\n\\n\\t// Return the nominal collateral ratio (ICR) of a given Trove, without the price. Takes a trove's pending coll and debt rewards from redistributions into account.\\n\\tfunction getNominalICR(address _borrower) public view returns (uint256) {\\n\\t\\t(uint256 currentCollateral, uint256 currentDebt) = getTroveCollAndDebt(_borrower);\\n\\n\\t\\tuint256 NICR = PropelMath._computeNominalCR(currentCollateral, currentDebt);\\n\\t\\treturn NICR;\\n\\t}\\n\\n\\tfunction getRedemptionICR(address _borrower, uint256 _price) public view returns (uint256) {\\n\\t\\t(uint256 currentCollateral, uint256 currentDebt) = getTroveCollAndDebt(_borrower);\\n\\t\\tuint256 ICR = PropelMath._computeCR(currentCollateral, currentDebt, _price);\\n\\t\\treturn ICR;\\n\\t}\\n\\n\\t// Return the current collateral ratio (ICR) of a given Trove. Takes a trove's pending coll and debt rewards from redistributions into account.\\n\\tfunction getCurrentICR(address _borrower, uint256 _price) public view returns (uint256) {\\n\\t\\t(uint256 currentCollateral, uint256 currentDebt) = getTroveCollAndDebt(_borrower);\\n\\t\\tuint256 ICR = PropelMath._computeCR(currentCollateral, currentDebt + getTroveInterest(_borrower, currentDebt), _price);\\n\\t\\treturn ICR;\\n\\t}\\n\\n\\tfunction getTroveInterest(address _borrower, uint256 debt) public view returns (uint256) {\\n\\t\\treturn (debt * (getPendingInterestDebt() - rewardSnapshots[_borrower].interest)) / DECIMAL_PRECISION;\\n\\t}\\n\\n\\tfunction getTotalActiveCollateral() public view returns (uint256) {\\n\\t\\treturn totalActiveCollateral;\\n\\t}\\n\\n\\tfunction getTotalActiveDebt() public view returns (uint256) {\\n\\t\\treturn totalActiveDebt;\\n\\t}\\n\\n\\t// Get the borrower's pending accumulated collateral and debt rewards, earned by their stake\\n\\tfunction getPendingCollAndDebtRewards(address _borrower) public view returns (uint256, uint256) {\\n\\t\\tRewardSnapshot memory snapshot = rewardSnapshots[_borrower];\\n\\n\\t\\tuint256 coll = L_collateral - snapshot.collateral;\\n\\t\\tuint256 debt = L_debt - snapshot.debt;\\n\\n\\t\\tif (coll + debt == 0 || Troves[_borrower].status != Status.active) return (0, 0);\\n\\n\\t\\tuint256 stake = Troves[_borrower].stake;\\n\\t\\treturn ((stake * coll) / DECIMAL_PRECISION, (stake * debt) / DECIMAL_PRECISION);\\n\\t}\\n\\n\\tfunction hasPendingRewards(address _borrower) public view returns (bool) {\\n\\t\\t/*\\n\\t\\t * A Trove has pending rewards if its snapshot is less than the current rewards per-unit-staked sum:\\n\\t\\t * this indicates that rewards have occured since the snapshot was made, and the user therefore has\\n\\t\\t * pending rewards\\n\\t\\t */\\n\\t\\tif (Troves[_borrower].status != Status.active) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\treturn (rewardSnapshots[_borrower].collateral < L_collateral);\\n\\t}\\n\\n\\t// --- Redemption fee functions ---\\n\\n\\t/*\\n\\t * This function has two impacts on the baseRate state variable:\\n\\t * 1) decays the baseRate based on time passed since last redemption or debt borrowing operation.\\n\\t * then,\\n\\t * 2) increases the baseRate based on the amount redeemed, as a proportion of total supply\\n\\t */\\n\\tfunction _updateBaseRateFromRedemption(uint256 _collateralDrawn, uint256 _price, uint256 _totalDebtSupply) internal returns (uint256) {\\n\\t\\tuint256 decayedBaseRate = _calcDecayedBaseRate();\\n\\n\\t\\t/* Convert the drawn collateral back to debt at face value rate (1 debt:1 USD), in order to get\\n\\t\\t * the fraction of total supply that was redeemed at face value. */\\n\\t\\tuint256 redeemedDebtFraction = (_collateralDrawn * _price) / _totalDebtSupply;\\n\\t\\tuint256 newBaseRate = decayedBaseRate + (redeemedDebtFraction / BETA);\\n\\t\\tnewBaseRate = PropelMath._min(newBaseRate, DECIMAL_PRECISION); // cap baseRate at a maximum of 100%\\n\\n\\t\\t// Update the baseRate state variable\\n\\t\\tbaseRate = newBaseRate;\\n\\t\\temit BaseRateUpdated(newBaseRate);\\n\\n\\t\\t_updateLastFeeOpTime();\\n\\n\\t\\treturn newBaseRate;\\n\\t}\\n\\n\\tfunction getRedemptionRate() public view returns (uint256) {\\n\\t\\treturn _calcRedemptionRate(baseRate);\\n\\t}\\n\\n\\tfunction getRedemptionRateWithDecay() public view returns (uint256) {\\n\\t\\treturn _calcRedemptionRate(_calcDecayedBaseRate());\\n\\t}\\n\\n\\tfunction _calcRedemptionRate(uint256 _baseRate) internal view returns (uint256) {\\n\\t\\treturn\\n\\t\\t\\tPropelMath._min(\\n\\t\\t\\t\\tredemptionFeeFloor + _baseRate,\\n\\t\\t\\t\\tmaxRedemptionFee // cap at a maximum of 100%\\n\\t\\t\\t);\\n\\t}\\n\\n\\tfunction getRedemptionFeeWithDecay(uint256 _collateralDrawn) external view returns (uint256) {\\n\\t\\treturn _calcRedemptionFee(getRedemptionRateWithDecay(), _collateralDrawn);\\n\\t}\\n\\n\\tfunction _calcRedemptionFee(uint256 _redemptionRate, uint256 _collateralDrawn) internal pure returns (uint256) {\\n\\t\\tuint256 redemptionFee = (_redemptionRate * _collateralDrawn) / DECIMAL_PRECISION;\\n\\t\\trequire(redemptionFee < _collateralDrawn, \\\"Fee exceeds returned collateral\\\");\\n\\t\\treturn redemptionFee;\\n\\t}\\n\\n\\t// --- Borrowing fee functions ---\\n\\n\\tfunction getBorrowingRate() public view returns (uint256) {\\n\\t\\treturn _calcBorrowingRate(baseRate);\\n\\t}\\n\\n\\tfunction getBorrowingRateWithDecay() public view returns (uint256) {\\n\\t\\treturn _calcBorrowingRate(_calcDecayedBaseRate());\\n\\t}\\n\\n\\tfunction _calcBorrowingRate(uint256 _baseRate) internal view returns (uint256) {\\n\\t\\treturn PropelMath._min(borrowingFeeFloor + _baseRate, maxBorrowingFee);\\n\\t}\\n\\n\\tfunction getBorrowingFee(uint256 _debt) external view returns (uint256) {\\n\\t\\treturn _calcBorrowingFee(getBorrowingRate(), _debt);\\n\\t}\\n\\n\\tfunction getBorrowingFeeWithDecay(uint256 _debt) external view returns (uint256) {\\n\\t\\treturn _calcBorrowingFee(getBorrowingRateWithDecay(), _debt);\\n\\t}\\n\\n\\tfunction _calcBorrowingFee(uint256 _borrowingRate, uint256 _debt) internal pure returns (uint256) {\\n\\t\\treturn (_borrowingRate * _debt) / DECIMAL_PRECISION;\\n\\t}\\n\\n\\t// --- Internal fee functions ---\\n\\n\\t// Update the last fee operation time only if time passed >= decay interval. This prevents base rate griefing.\\n\\tfunction _updateLastFeeOpTime() internal {\\n\\t\\tuint256 timePassed = block.timestamp - lastFeeOperationTime;\\n\\n\\t\\tif (timePassed >= SECONDS_IN_ONE_MINUTE) {\\n\\t\\t\\tlastFeeOperationTime = block.timestamp;\\n\\t\\t\\temit LastFeeOpTimeUpdated(block.timestamp);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _calcDecayedBaseRate() internal view returns (uint256) {\\n\\t\\tuint256 minutesPassed = (block.timestamp - lastFeeOperationTime) / SECONDS_IN_ONE_MINUTE;\\n\\t\\tuint256 decayFactor = PropelMath._decPow(minuteDecayFactor, minutesPassed);\\n\\n\\t\\treturn (baseRate * decayFactor) / DECIMAL_PRECISION;\\n\\t}\\n\\n\\t// --- Redemption functions ---\\n\\n\\t/* Send _debtAmount debt to the system and redeem the corresponding amount of collateral from as many Troves as are needed to fill the redemption\\n\\t * request.  Applies pending rewards to a Trove before reducing its debt and coll.\\n\\t *\\n\\t * Note that if _amount is very large, this function can run out of gas, specially if traversed troves are small. This can be easily avoided by\\n\\t * splitting the total _amount in appropriate chunks and calling the function multiple times.\\n\\t *\\n\\t * Param `_maxIterations` can also be provided, so the loop through Troves is capped (if it\\u2019s zero, it will be ignored).This makes it easier to\\n\\t * avoid OOG for the frontend, as only knowing approximately the average cost of an iteration is enough, without needing to know the \\u201ctopology\\u201d\\n\\t * of the trove list. It also avoids the need to set the cap in stone in the contract, nor doing gas calculations, as both gas price and opcode\\n\\t * costs can vary.\\n\\t *\\n\\t * All Troves that are redeemed from -- with the likely exception of the last one -- will end up with no debt left, therefore they will be closed.\\n\\t * If the last Trove does have some remaining debt, it has a finite ICR, and the reinsertion could be anywhere in the list, therefore it requires a hint.\\n\\t * A frontend should use getRedemptionHints() to calculate what the ICR of this Trove will be after redemption, and pass a hint for its position\\n\\t * in the sortedTroves list along with the ICR value that the hint was found for.\\n\\t *\\n\\t * If another transaction modifies the list between calling getRedemptionHints() and passing the hints to redeemCollateral(), it\\n\\t * is very likely that the last (partially) redeemed Trove would end up with a different ICR than what the hint is for. In this case the\\n\\t * redemption will stop after the last completely redeemed Trove and the sender will keep the remaining debt amount, which they can attempt\\n\\t * to redeem later.\\n\\t */\\n\\tfunction redeemCollateral(uint256 _debtAmount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint256 _partialRedemptionHintNICR, uint256 _maxIterations, uint256 _maxFeePercentage) external {\\n\\t\\tISortedTroves _sortedTrovesCached = sortedTroves;\\n\\t\\tRedemptionTotals memory totals;\\n\\n\\t\\trequire(_maxFeePercentage >= redemptionFeeFloor && _maxFeePercentage <= maxRedemptionFee, \\\"Max fee 0.5% to 100%\\\");\\n\\t\\trequire(block.timestamp >= systemDeploymentTime + BOOTSTRAP_PERIOD, \\\"BOOTSTRAP_PERIOD\\\");\\n\\t\\t_distributeInterestDebt();\\n\\t\\ttotals.price = fetchPrice();\\n\\t\\tuint256 _MCR = MCR;\\n\\t\\trequire(IBorrowerOperations(borrowerOperationsAddress).getTCR() >= _MCR, \\\"Cannot redeem when TCR < MCR\\\");\\n\\t\\trequire(_debtAmount > 0, \\\"Amount must be greater than zero\\\");\\n\\t\\trequire(PropelUSD.balanceOf(msg.sender) >= _debtAmount, \\\"Insufficient balance\\\");\\n\\t\\ttotals.totalDebtSupplyAtStart = getGlobalSystemDebt();\\n\\n\\t\\ttotals.remainingDebt = _debtAmount;\\n\\t\\taddress currentBorrower;\\n\\n\\t\\tif (_isValidFirstRedemptionHint(_sortedTrovesCached, _firstRedemptionHint, totals.price, _MCR)) {\\n\\t\\t\\tcurrentBorrower = _firstRedemptionHint;\\n\\t\\t} else {\\n\\t\\t\\tcurrentBorrower = _sortedTrovesCached.getLast();\\n\\t\\t\\t// Find the first trove with ICR >= MCR\\n\\t\\t\\twhile (currentBorrower != address(0) && getRedemptionICR(currentBorrower, totals.price) < _MCR) {\\n\\t\\t\\t\\tcurrentBorrower = _sortedTrovesCached.getPrev(currentBorrower);\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\t// Loop through the Troves starting from the one with lowest collateral ratio until _amount of debt is exchanged for collateral\\n\\t\\tif (_maxIterations == 0) {\\n\\t\\t\\t_maxIterations = type(uint256).max;\\n\\t\\t}\\n\\t\\twhile (currentBorrower != address(0) && totals.remainingDebt > 0 && _maxIterations > 0) {\\n\\t\\t\\t_maxIterations--;\\n\\t\\t\\t// Save the address of the Trove preceding the current one, before potentially modifying the list\\n\\t\\t\\taddress nextUserToCheck = _sortedTrovesCached.getPrev(currentBorrower);\\n\\n\\t\\t\\t_applyPendingRewards(currentBorrower);\\n\\t\\t\\tSingleRedemptionValues memory singleRedemption = _redeemCollateralFromTrove(_sortedTrovesCached, currentBorrower, totals.remainingDebt, totals.price, _upperPartialRedemptionHint, _lowerPartialRedemptionHint, _partialRedemptionHintNICR);\\n\\n\\t\\t\\tif (singleRedemption.cancelledPartial) break; // Partial redemption was cancelled (out-of-date hint, or new net debt < minimum), therefore we could not redeem from the last Trove\\n\\n\\t\\t\\ttotals.totalDebtToRedeem = totals.totalDebtToRedeem + singleRedemption.debtLot;\\n\\t\\t\\ttotals.totalCollateralDrawn = totals.totalCollateralDrawn + singleRedemption.collateralLot;\\n\\t\\t\\ttotals.totalInterest = totals.totalInterest + singleRedemption.interestLot;\\n\\n\\t\\t\\ttotals.remainingDebt = totals.remainingDebt - singleRedemption.debtLot;\\n\\t\\t\\tcurrentBorrower = nextUserToCheck;\\n\\t\\t}\\n\\t\\trequire(totals.totalCollateralDrawn > 0, \\\"Unable to redeem any amount\\\");\\n\\n\\t\\t// Decay the baseRate due to time passed, and then increase it according to the size of this redemption.\\n\\t\\t// Use the saved total debt supply value, from before it was reduced by the redemption.\\n\\t\\t_updateBaseRateFromRedemption(totals.totalCollateralDrawn, totals.price, totals.totalDebtSupplyAtStart);\\n\\t\\t// Calculate the collateral fee\\n\\t\\ttotals.collateralFee = sunsetting ? 0 : _calcRedemptionFee(getRedemptionRate(), totals.totalCollateralDrawn);\\n\\t\\t_requireUserAcceptsFee(totals.collateralFee, totals.totalCollateralDrawn, _maxFeePercentage);\\n\\n\\t\\t_sendCollateral(feeReceiver(), totals.collateralFee);\\n\\n\\t\\ttotals.collateralToSendToRedeemer = totals.totalCollateralDrawn - totals.collateralFee;\\n\\n\\t\\temit Redemption(_debtAmount, totals.totalDebtToRedeem, totals.totalCollateralDrawn, totals.totalInterest, totals.collateralFee);\\n\\n\\t\\t// Burn the total debt that is cancelled with debt, and send the redeemed collateral to msg.sender\\n\\t\\tPropelUSD.burn(msg.sender, totals.totalDebtToRedeem);\\n\\t\\t// Update Trove Manager debt, and send collateral to account\\n\\t\\ttotalActiveDebt = totalActiveDebt - totals.totalDebtToRedeem;\\n\\t\\tdecreaseOutstandingInterestDebt(totals.totalInterest);\\n\\t\\t_sendCollateral(msg.sender, totals.collateralToSendToRedeemer);\\n\\t\\t_resetState();\\n\\t}\\n\\n\\t// Redeem as much collateral as possible from _borrower's Trove in exchange for debt up to _maxDebtAmount\\n\\tfunction _redeemCollateralFromTrove(\\n\\t\\tISortedTroves _sortedTrovesCached,\\n\\t\\taddress _borrower,\\n\\t\\tuint256 _maxDebtAmount,\\n\\t\\tuint256 _price,\\n\\t\\taddress _upperPartialRedemptionHint,\\n\\t\\taddress _lowerPartialRedemptionHint,\\n\\t\\tuint256 _partialRedemptionHintNICR\\n\\t) internal returns (SingleRedemptionValues memory singleRedemption) {\\n\\t\\tTrove storage t = Troves[_borrower];\\n\\t\\tuint256 interest = getTroveInterest(_borrower, t.debt);\\n\\t\\tif (_maxDebtAmount < interest) {\\n\\t\\t\\tsingleRedemption.cancelledPartial = true;\\n\\t\\t\\treturn singleRedemption;\\n\\t\\t}\\n\\t\\tsingleRedemption.interestLot = interest;\\n\\t\\t// Determine the remaining amount (lot) to be redeemed, capped by the entire debt of the Trove minus the liquidation reserve\\n\\t\\tsingleRedemption.debtLot = PropelMath._min(_maxDebtAmount - singleRedemption.interestLot, t.debt - DEBT_GAS_COMPENSATION);\\n\\n\\t\\t// Get the CollateralLot of equivalent value in USD\\n\\t\\tsingleRedemption.collateralLot = ((singleRedemption.debtLot + singleRedemption.interestLot) * DECIMAL_PRECISION) / _price;\\n\\t\\t// Decrease the debt and collateral of the current Trove according to the debt lot and corresponding collateral to send\\n\\t\\tuint256 newDebt = (t.debt) - singleRedemption.debtLot;\\n\\t\\tuint256 newColl = (t.coll) - singleRedemption.collateralLot;\\n\\n\\t\\tif (newDebt == DEBT_GAS_COMPENSATION) {\\n\\t\\t\\t// No debt left in the Trove (except for the liquidation reserve), therefore the trove gets closed\\n\\t\\t\\t_removeStake(_borrower);\\n\\t\\t\\t_closeTrove(_borrower, Status.closedByRedemption);\\n\\t\\t\\t_redeemCloseTrove(_borrower, DEBT_GAS_COMPENSATION, newColl);\\n\\t\\t\\temit TroveUpdated(_borrower, 0, 0, 0, TroveManagerOperation.redeemCollateral);\\n\\t\\t} else {\\n\\t\\t\\tuint256 newNICR = PropelMath._computeNominalCR(newColl, newDebt);\\n\\t\\t\\t/*\\n\\t\\t\\t * If the provided hint is out of date, we bail since trying to reinsert without a good hint will almost\\n\\t\\t\\t * certainly result in running out of gas.\\n\\t\\t\\t *\\n\\t\\t\\t * If the resultant net debt of the partial is less than the minimum, net debt we bail.\\n\\t\\t\\t */\\n\\n\\t\\t\\t{\\n\\t\\t\\t\\t// We check if the ICR hint is reasonable up to date, with continuous interest there might be slight differences (<1bps)\\n\\t\\t\\t\\tuint256 icrError = _partialRedemptionHintNICR > newNICR ? _partialRedemptionHintNICR - newNICR : newNICR - _partialRedemptionHintNICR;\\n\\t\\t\\t\\tif (icrError > 5e14 || _getNetDebt(newDebt) < IBorrowerOperations(borrowerOperationsAddress).minNetDebt()) {\\n\\t\\t\\t\\t\\tsingleRedemption.cancelledPartial = true;\\n\\t\\t\\t\\t\\treturn singleRedemption;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\n\\t\\t\\t_sortedTrovesCached.reInsert(_borrower, newNICR, _upperPartialRedemptionHint, _lowerPartialRedemptionHint);\\n\\n\\t\\t\\tt.debt = newDebt;\\n\\t\\t\\tt.coll = newColl;\\n\\t\\t\\t_updateStakeAndTotalStakes(t);\\n\\t\\t\\t_updateTroveRewardSnapshots(_borrower);\\n\\t\\t\\temit TroveUpdated(_borrower, newDebt, newColl, t.stake, TroveManagerOperation.redeemCollateral);\\n\\t\\t}\\n\\n\\t\\treturn singleRedemption;\\n\\t}\\n\\n\\t/*\\n\\t * Called when a full redemption occurs, and closes the trove.\\n\\t * The redeemer swaps (debt - liquidation reserve) debt for (debt - liquidation reserve) worth of collateral, so the debt liquidation reserve left corresponds to the remaining debt.\\n\\t * In order to close the trove, the debt liquidation reserve is burned, and the corresponding debt is removed.\\n\\t * The debt recorded on the trove's struct is zero'd elswhere, in _closeTrove.\\n\\t * Any surplus collateral left in the trove can be later claimed by the borrower.\\n\\t */\\n\\tfunction _redeemCloseTrove(address _borrower, uint256 _debt, uint256 _collateral) internal {\\n\\t\\tPropelUSD.burn(gasPoolAddress, _debt);\\n\\t\\ttotalActiveDebt = totalActiveDebt - _debt;\\n\\n\\t\\tsurplusBalances[_borrower] += _collateral;\\n\\t\\ttotalActiveCollateral -= _collateral;\\n\\t}\\n\\n\\tfunction _isValidFirstRedemptionHint(ISortedTroves _sortedTroves, address _firstRedemptionHint, uint256 _price, uint256 _MCR) internal view returns (bool) {\\n\\t\\tif (_firstRedemptionHint == address(0) || !_sortedTroves.contains(_firstRedemptionHint) || getRedemptionICR(_firstRedemptionHint, _price) < _MCR) {\\n\\t\\t\\treturn false;\\n\\t\\t}\\n\\n\\t\\taddress nextTrove = _sortedTroves.getNext(_firstRedemptionHint);\\n\\t\\treturn nextTrove == address(0) || getRedemptionICR(nextTrove, _price) < _MCR;\\n\\t}\\n\\n\\t/**\\n\\t * Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode\\n\\t */\\n\\tfunction claimCollateral(address _receiver) external {\\n\\t\\tuint256 claimableColl = surplusBalances[msg.sender];\\n\\t\\trequire(claimableColl > 0, \\\"No collateral available to claim\\\");\\n\\n\\t\\tsurplusBalances[msg.sender] = 0;\\n\\n\\t\\tcollateralToken.safeTransfer(_receiver, claimableColl);\\n\\t}\\n\\n\\t// --- Trove Adjustment functions ---\\n\\n\\tfunction openTrove(address _borrower, uint256 _collateralAmount, uint256 _compositeDebt, uint256 NICR, address _upperHint, address _lowerHint) external whenNotPaused returns (uint256 stake, uint256 arrayIndex) {\\n\\t\\t_requireCallerIsBO();\\n\\t\\trequire(!sunsetting, \\\"Cannot open while sunsetting\\\");\\n\\t\\tuint256 supply = totalActiveDebt;\\n\\t\\tTrove storage t = Troves[_borrower];\\n\\t\\trequire(t.status != Status.active, \\\"BorrowerOps: Trove is active\\\");\\n\\t\\tt.status = Status.active;\\n\\t\\tt.coll = _collateralAmount;\\n\\t\\tt.debt = _compositeDebt;\\n\\t\\t_updateTroveRewardSnapshots(_borrower);\\n\\t\\tstake = _updateStakeAndTotalStakes(t);\\n\\t\\tsortedTroves.insert(_borrower, NICR, _upperHint, _lowerHint);\\n\\n\\t\\tTroveOwners.push(_borrower);\\n\\t\\tarrayIndex = TroveOwners.length - 1;\\n\\t\\tt.arrayIndex = uint128(arrayIndex);\\n\\n\\t\\ttotalActiveCollateral = totalActiveCollateral + _collateralAmount;\\n\\t\\tuint256 _newTotalDebt = supply + _compositeDebt;\\n\\t\\trequire(_newTotalDebt + defaultedDebt <= maxSystemDebt, \\\"Collateral debt limit reached\\\");\\n\\t\\ttotalActiveDebt = _newTotalDebt;\\n\\t}\\n\\n\\tfunction updateTroveFromAdjustment(bool _isDebtIncrease, uint256 _debtChange, uint256 _netDebtChange, bool _isCollIncrease, uint256 _collChange, address _upperHint, address _lowerHint, address _borrower, address _receiver) external returns (uint256, uint256, uint256) {\\n\\t\\t_requireCallerIsBO();\\n\\t\\tif (_isCollIncrease || _isDebtIncrease) {\\n\\t\\t\\trequire(!paused, \\\"Collateral Paused\\\");\\n\\t\\t\\trequire(!sunsetting, \\\"Cannot increase while sunsetting\\\");\\n\\t\\t}\\n\\n\\t\\tTrove storage t = Troves[_borrower];\\n\\t\\trequire(t.status == Status.active, \\\"Trove closed or does not exist\\\");\\n\\n\\t\\tuint256 newDebt = t.debt;\\n\\t\\tif (_debtChange > 0) {\\n\\t\\t\\tif (_isDebtIncrease) {\\n\\t\\t\\t\\tnewDebt = newDebt + _netDebtChange;\\n\\t\\t\\t\\t_increaseDebt(_receiver, _netDebtChange, _debtChange);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tnewDebt = newDebt - _netDebtChange;\\n\\t\\t\\t\\t_decreaseDebt(_receiver, _debtChange);\\n\\t\\t\\t}\\n\\t\\t\\tt.debt = newDebt;\\n\\t\\t}\\n\\n\\t\\tuint256 newColl = t.coll;\\n\\t\\tif (_collChange > 0) {\\n\\t\\t\\tif (_isCollIncrease) {\\n\\t\\t\\t\\tnewColl = newColl + _collChange;\\n\\t\\t\\t\\ttotalActiveCollateral = totalActiveCollateral + _collChange;\\n\\t\\t\\t\\t// trust that BorrowerOperations sent the collateral\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tnewColl = newColl - _collChange;\\n\\t\\t\\t\\t_sendCollateral(_receiver, _collChange);\\n\\t\\t\\t}\\n\\t\\t\\tt.coll = newColl;\\n\\t\\t}\\n\\n\\t\\tuint256 newNICR = PropelMath._computeNominalCR(newColl, newDebt);\\n\\t\\tsortedTroves.reInsert(_borrower, newNICR, _upperHint, _lowerHint);\\n\\n\\t\\treturn (newColl, newDebt, _updateStakeAndTotalStakes(t));\\n\\t}\\n\\n\\tfunction closeTrove(address _borrower, address _receiver, uint256 collAmount, uint256 debtAmount) external {\\n\\t\\t_requireCallerIsBO();\\n\\t\\trequire(Troves[_borrower].status == Status.active, \\\"Trove closed or does not exist\\\");\\n\\t\\t_removeStake(_borrower);\\n\\t\\t_closeTrove(_borrower, Status.closedByOwner);\\n\\t\\ttotalActiveDebt = totalActiveDebt - debtAmount;\\n\\t\\t_sendCollateral(_receiver, collAmount);\\n\\t\\t_resetState();\\n\\t}\\n\\n\\t/**\\n        @dev Only called from `closeTrove` because liquidating the final trove is blocked in\\n             `LiquidationManager`. Many liquidation paths involve redistributing debt and\\n             collateral to existing troves. If the collateral is being sunset, the final trove\\n             must be closed by repaying the debt or via a redemption.\\n     */\\n\\tfunction _resetState() private {\\n\\t\\tif (TroveOwners.length == 0) {\\n\\t\\t\\tlastInterestDebtUpdateTime = 0;\\n\\t\\t\\ttotalStakes = 0;\\n\\t\\t\\ttotalStakesSnapshot = 0;\\n\\t\\t\\ttotalCollateralSnapshot = 0;\\n\\t\\t\\tL_collateral = 0;\\n\\t\\t\\tL_debt = 0;\\n\\t\\t\\tL_Interest_Debt = 0;\\n\\t\\t\\tlastInterestDebtError_Redistribution = 0;\\n\\t\\t\\tlastCollateralError_Redistribution = 0;\\n\\t\\t\\tlastDebtError_Redistribution = 0;\\n\\t\\t\\ttotalActiveCollateral = 0;\\n\\t\\t\\ttotalActiveDebt = 0;\\n\\t\\t\\tdefaultedCollateral = 0;\\n\\t\\t\\tdefaultedDebt = 0;\\n\\t\\t\\toutstandingInterestDebt = 0;\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _closeTrove(address _borrower, Status closedStatus) internal {\\n\\t\\tuint256 TroveOwnersArrayLength = TroveOwners.length;\\n\\n\\t\\tTrove storage t = Troves[_borrower];\\n\\t\\tt.status = closedStatus;\\n\\t\\tt.coll = 0;\\n\\t\\tt.debt = 0;\\n\\t\\tISortedTroves sortedTrovesCached = sortedTroves;\\n\\t\\trewardSnapshots[_borrower].collateral = 0;\\n\\t\\trewardSnapshots[_borrower].debt = 0;\\n\\t\\tif (TroveOwnersArrayLength > 1 && sortedTrovesCached.getSize() > 1) {\\n\\t\\t\\t// remove trove owner from the TroveOwners array, not preserving array order\\n\\t\\t\\tuint128 index = t.arrayIndex;\\n\\t\\t\\taddress addressToMove = TroveOwners[TroveOwnersArrayLength - 1];\\n\\t\\t\\tTroveOwners[index] = addressToMove;\\n\\t\\t\\tTroves[addressToMove].arrayIndex = index;\\n\\t\\t\\temit TroveIndexUpdated(addressToMove, index);\\n\\t\\t}\\n\\n\\t\\tTroveOwners.pop();\\n\\n\\t\\tsortedTrovesCached.remove(_borrower);\\n\\t\\tt.arrayIndex = 0;\\n\\t}\\n\\n\\t// Updates the baseRate state variable based on time elapsed since the last redemption or debt borrowing operation.\\n\\tfunction decayBaseRateAndGetBorrowingFee(uint256 _debt) external returns (uint256) {\\n\\t\\t_requireCallerIsBO();\\n\\t\\tuint256 rate = _decayBaseRate();\\n\\n\\t\\treturn _calcBorrowingFee(_calcBorrowingRate(rate), _debt);\\n\\t}\\n\\n\\tfunction _decayBaseRate() internal returns (uint256) {\\n\\t\\tuint256 decayedBaseRate = _calcDecayedBaseRate();\\n\\n\\t\\tbaseRate = decayedBaseRate;\\n\\t\\temit BaseRateUpdated(decayedBaseRate);\\n\\n\\t\\t_updateLastFeeOpTime();\\n\\n\\t\\treturn decayedBaseRate;\\n\\t}\\n\\n\\tfunction applyPendingRewards(address _borrower) external returns (uint256 coll, uint256 debt) {\\n\\t\\t_requireCallerIsBO();\\n\\t\\treturn _applyPendingRewards(_borrower);\\n\\t}\\n\\n\\t// Add the borrowers's coll and debt rewards earned from redistributions, to their Trove\\n\\tfunction _applyPendingRewards(address _borrower) internal returns (uint256, uint256) {\\n\\t\\tTrove storage t = Troves[_borrower];\\n\\t\\tif (t.status == Status.active) {\\n\\t\\t\\t(uint256 pendingCollateralReward, uint256 pendingDebtReward) = getPendingCollAndDebtRewards(_borrower);\\n\\t\\t\\t// Apply pending rewards to trove's state\\n\\t\\t\\tt.coll += pendingCollateralReward;\\n\\t\\t\\tt.debt += pendingDebtReward;\\n\\n\\t\\t\\t_updateTroveRewardSnapshots(_borrower);\\n\\n\\t\\t\\t_movePendingTroveRewardsToActiveBalance(pendingDebtReward, pendingCollateralReward);\\n\\n\\t\\t\\temit TroveUpdated(_borrower, t.debt, t.coll, t.stake, TroveManagerOperation.applyPendingRewards);\\n\\t\\t}\\n\\t\\treturn (t.coll, t.debt);\\n\\t}\\n\\n\\tfunction _updateTroveRewardSnapshots(address _borrower) internal {\\n\\t\\tuint256 L_collateralCached = L_collateral;\\n\\t\\tuint256 L_debtCached = L_debt;\\n\\t\\tuint256 L_InterestDebtCached = L_Interest_Debt;\\n\\t\\trewardSnapshots[_borrower] = RewardSnapshot(L_collateralCached, L_debtCached, L_InterestDebtCached);\\n\\t\\temit TroveSnapshotsUpdated(L_collateralCached, L_debtCached, L_InterestDebtCached);\\n\\t}\\n\\n\\tfunction repayInterestDebt(address _borrower) external {\\n\\t\\t_distributeInterestDebt();\\n\\t\\t_applyPendingRewards(_borrower);\\n\\t\\t(uint256 debt, , , ) = getEntireDebtAndColl(_borrower);\\n\\t\\t_repayInterest(msg.sender, _borrower, debt);\\n\\t}\\n\\n\\tfunction repayInterest(address _account, address _borrower, uint256 _debt) public {\\n\\t\\t_requireCallerIsBO();\\n\\t\\t_repayInterest(_account, _borrower, _debt);\\n\\t}\\n\\n\\tfunction _repayInterest(address _account, address _borrower, uint256 _debt) internal {\\n\\t\\tuint256 interest = getTroveInterest(_borrower, _debt);\\n\\t\\tif (PropelUSD.balanceOf(_account) >= interest) {\\n\\t\\t\\tPropelUSD.burn(_account, interest);\\n\\t\\t} else {\\n\\t\\t\\ttotalActiveDebt += interest;\\n\\t\\t\\tTroves[_borrower].debt += interest;\\n\\t\\t}\\n\\t\\tdecreaseOutstandingInterestDebt(interest);\\n\\t\\t_updateTroveRewardSnapshots(_borrower);\\n\\t\\temit InsterstPaid(_account, _borrower, interest);\\n\\t}\\n\\n\\t// Remove borrower's stake from the totalStakes sum, and set their stake to 0\\n\\tfunction _removeStake(address _borrower) internal {\\n\\t\\tuint256 stake = Troves[_borrower].stake;\\n\\t\\ttotalStakes = totalStakes - stake;\\n\\t\\tTroves[_borrower].stake = 0;\\n\\t}\\n\\n\\t// Update borrower's stake based on their latest collateral value\\n\\tfunction _updateStakeAndTotalStakes(Trove storage t) internal returns (uint256) {\\n\\t\\tuint256 newStake = _computeNewStake(t.coll);\\n\\t\\tuint256 oldStake = t.stake;\\n\\t\\tt.stake = newStake;\\n\\t\\tuint256 newTotalStakes = totalStakes - oldStake + newStake;\\n\\t\\ttotalStakes = newTotalStakes;\\n\\t\\temit TotalStakesUpdated(newTotalStakes);\\n\\n\\t\\treturn newStake;\\n\\t}\\n\\n\\t// Calculate a new stake based on the snapshots of the totalStakes and totalCollateral taken at the last liquidation\\n\\tfunction _computeNewStake(uint256 _coll) internal view returns (uint256) {\\n\\t\\tuint256 stake;\\n\\t\\tuint256 totalCollateralSnapshotCached = totalCollateralSnapshot;\\n\\t\\tif (totalCollateralSnapshotCached == 0) {\\n\\t\\t\\tstake = _coll;\\n\\t\\t} else {\\n\\t\\t\\t/*\\n\\t\\t\\t * The following assert() holds true because:\\n\\t\\t\\t * - The system always contains >= 1 trove\\n\\t\\t\\t * - When we close or liquidate a trove, we redistribute the pending rewards, so if all troves were closed/liquidated,\\n\\t\\t\\t * rewards would\\u2019ve been emptied and totalCollateralSnapshot would be zero too.\\n\\t\\t\\t */\\n\\t\\t\\tuint256 totalStakesSnapshotCached = totalStakesSnapshot;\\n\\t\\t\\tassert(totalStakesSnapshotCached > 0);\\n\\t\\t\\tstake = (_coll * totalStakesSnapshotCached) / totalCollateralSnapshotCached;\\n\\t\\t}\\n\\t\\treturn stake;\\n\\t}\\n\\n\\tfunction closeLastTroveWhenSunsetting() external onlyOwner {\\n\\t\\trequire(sunsetting, \\\"Not in sunsetting\\\");\\n\\t\\trequire(TroveOwners.length == 1, \\\"Can only force to close last trove\\\");\\n\\t\\taddress _borrower = TroveOwners[0];\\n\\t\\tuint256 ICR = getCurrentICR(_borrower, fetchPrice());\\n\\t\\tuint256 TCR = IBorrowerOperations(borrowerOperationsAddress).getTCR();\\n\\t\\trequire(ICR < 1e18 || TCR < MCR, \\\"Can only force close bad borrower\\\");\\n\\t\\t(uint256 coll, uint256 debt) = getTroveCollAndDebt(_borrower);\\n\\t\\tuint256 interest = getTroveInterest(_borrower, debt);\\n\\t\\ttotalActiveDebt = totalActiveDebt - debt;\\n\\t\\ttotalActiveCollateral = totalActiveCollateral - coll;\\n\\t\\tPropelUSD.burn(msg.sender, debt + interest);\\n\\t\\t_sendCollateral(msg.sender, coll);\\n\\t\\t_removeStake(_borrower);\\n\\t\\t_closeTrove(_borrower, Status.closedByOwner);\\n\\t\\t_resetState();\\n\\t}\\n\\n\\t// --- Liquidation Functions ---\\n\\n\\tfunction closeTroveByLiquidation(address _borrower) external {\\n\\t\\t_requireCallerIsLM();\\n\\t\\t_removeStake(_borrower);\\n\\t\\t_closeTrove(_borrower, Status.closedByLiquidation);\\n\\t}\\n\\n\\tfunction movePendingTroveRewardsToActiveBalances(uint256 _debt, uint256 _collateral) external {\\n\\t\\t_requireCallerIsLM();\\n\\t\\t_movePendingTroveRewardsToActiveBalance(_debt, _collateral);\\n\\t}\\n\\n\\tfunction _movePendingTroveRewardsToActiveBalance(uint256 _debt, uint256 _collateral) internal {\\n\\t\\tdefaultedDebt -= _debt;\\n\\t\\ttotalActiveDebt += _debt;\\n\\t\\tdefaultedCollateral -= _collateral;\\n\\t\\ttotalActiveCollateral += _collateral;\\n\\t}\\n\\n\\tfunction addCollateralSurplus(address borrower, uint256 collSurplus) external {\\n\\t\\t_requireCallerIsLM();\\n\\t\\tsurplusBalances[borrower] += collSurplus;\\n\\t}\\n\\n\\tfunction finalizeLiquidation(address _liquidator, uint256 _debt, uint256 _coll, uint256 _collSurplus, uint256 _debtGasComp, uint256 _collGasComp, uint256 _interest) external {\\n\\t\\t_requireCallerIsLM();\\n\\t\\t// redistribute debt and collateral\\n\\t\\t_redistributeDebtAndColl(_debt, _coll);\\n\\n\\t\\tuint256 _activeColl = totalActiveCollateral;\\n\\t\\tif (_collSurplus > 0) {\\n\\t\\t\\t_activeColl -= _collSurplus;\\n\\t\\t\\ttotalActiveCollateral = _activeColl;\\n\\t\\t}\\n\\n\\t\\t// update system snapshos\\n\\t\\ttotalStakesSnapshot = totalStakes;\\n\\t\\ttotalCollateralSnapshot = _activeColl - _collGasComp + defaultedCollateral;\\n\\t\\temit SystemSnapshotsUpdated(totalStakesSnapshot, totalCollateralSnapshot);\\n\\t\\tdecreaseOutstandingInterestDebt(_interest);\\n\\t\\t// send gas compensation\\n\\t\\tPropelUSD.returnFromPool(gasPoolAddress, _liquidator, _debtGasComp);\\n\\t\\t_sendCollateral(_liquidator, _collGasComp);\\n\\t}\\n\\n\\tfunction _redistributeDebtAndColl(uint256 _debt, uint256 _coll) internal {\\n\\t\\tif (_debt == 0) {\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t\\t/*\\n\\t\\t * Add distributed coll and debt rewards-per-unit-staked to the running totals. Division uses a \\\"feedback\\\"\\n\\t\\t * error correction, to keep the cumulative error low in the running totals L_collateral and L_debt:\\n\\t\\t *\\n\\t\\t * 1) Form numerators which compensate for the floor division errors that occurred the last time this\\n\\t\\t * function was called.\\n\\t\\t * 2) Calculate \\\"per-unit-staked\\\" ratios.\\n\\t\\t * 3) Multiply each ratio back by its denominator, to reveal the current floor division error.\\n\\t\\t * 4) Store these errors for use in the next correction when this function is called.\\n\\t\\t * 5) Note: static analysis tools complain about this \\\"division before multiplication\\\", however, it is intended.\\n\\t\\t */\\n\\t\\tuint256 collateralNumerator = (_coll * DECIMAL_PRECISION) + lastCollateralError_Redistribution;\\n\\t\\tuint256 debtNumerator = (_debt * DECIMAL_PRECISION) + lastDebtError_Redistribution;\\n\\t\\tuint256 totalStakesCached = totalStakes;\\n\\t\\t// Get the per-unit-staked terms\\n\\t\\tuint256 collateralRewardPerUnitStaked = collateralNumerator / totalStakesCached;\\n\\t\\tuint256 debtRewardPerUnitStaked = debtNumerator / totalStakesCached;\\n\\n\\t\\tlastCollateralError_Redistribution = collateralNumerator - (collateralRewardPerUnitStaked * totalStakesCached);\\n\\t\\tlastDebtError_Redistribution = debtNumerator - (debtRewardPerUnitStaked * totalStakesCached);\\n\\n\\t\\t// Add per-unit-staked terms to the running totals\\n\\t\\tuint256 new_L_collateral = L_collateral + collateralRewardPerUnitStaked;\\n\\t\\tuint256 new_L_debt = L_debt + debtRewardPerUnitStaked;\\n\\t\\tL_collateral = new_L_collateral;\\n\\t\\tL_debt = new_L_debt;\\n\\n\\t\\temit LTermsUpdated(new_L_collateral, new_L_debt);\\n\\n\\t\\ttotalActiveDebt -= _debt;\\n\\t\\tdefaultedDebt += _debt;\\n\\t\\tdefaultedCollateral += _coll;\\n\\t\\ttotalActiveCollateral -= _coll;\\n\\t}\\n\\n\\t// --- Trove property setters ---\\n\\n\\tfunction _sendCollateral(address _account, uint256 _amount) private {\\n\\t\\tif (_amount > 0) {\\n\\t\\t\\ttotalActiveCollateral = totalActiveCollateral - _amount;\\n\\t\\t\\temit CollateralSent(_account, _amount);\\n\\n\\t\\t\\tcollateralToken.safeTransfer(_account, _amount);\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _increaseDebt(address account, uint256 netDebtAmount, uint256 debtAmount) internal {\\n\\t\\tuint256 _newTotalDebt = totalActiveDebt + netDebtAmount;\\n\\t\\trequire(_newTotalDebt + defaultedDebt <= maxSystemDebt, \\\"Collateral debt limit reached\\\");\\n\\t\\ttotalActiveDebt = _newTotalDebt;\\n\\t\\tPropelUSD.mint(account, debtAmount);\\n\\t}\\n\\n\\tfunction decreaseDebtAndSendCollateral(address account, uint256 debt, uint256 coll) external {\\n\\t\\t_requireCallerIsLM();\\n\\t\\t_decreaseDebt(account, debt);\\n\\t\\t_sendCollateral(account, coll);\\n\\t}\\n\\n\\tfunction _decreaseDebt(address account, uint256 amount) internal {\\n\\t\\tPropelUSD.burn(account, amount);\\n\\t\\ttotalActiveDebt = totalActiveDebt - amount;\\n\\t}\\n\\n\\t// --- Requires ---\\n\\n\\tfunction _requireCallerIsBO() internal view {\\n\\t\\trequire(msg.sender == borrowerOperationsAddress, \\\"Caller not BO\\\");\\n\\t}\\n\\n\\tfunction _requireCallerIsLM() internal view {\\n\\t\\trequire(msg.sender == liquidationManager, \\\"Not Liquidation Manager\\\");\\n\\t}\\n}\\n\",\"keccak256\":\"0x55810407624276ea023932e02833550e834780b920c2d572df797b5e49f5a915\",\"license\":\"MIT\"},\"contracts/dependencies/BlastWrapper.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"./PropelOwnable.sol\\\";\\nimport \\\"../interfaces/IBlast.sol\\\";\\nimport \\\"../interfaces/IWETH.sol\\\";\\n\\ncontract BlastWrapper is PropelOwnable {\\n\\n\\tconstructor(IPropelCore _propelCore) PropelOwnable(_propelCore) {\\n\\t\\tblast().configureClaimableGas();\\n\\t\\tWETH().configure(YieldMode.CLAIMABLE);\\n\\t}\\n\\n\\tfunction getClaimableWETH() public view returns(uint256) {\\n\\t\\treturn WETH().getClaimableAmount(address(this));\\n\\t}\\n\\n\\tfunction claimAllYield(address to) external onlyOwner {\\n\\t\\tuint256 amount = getClaimableWETH();\\n\\t\\trequire(amount > 0, \\\"no claimable amount\\\");\\n\\t\\tWETH().claim(to, amount);\\n\\t}\\n\\n\\tfunction claimAllGas(address to) external onlyOwner {\\n\\t\\tblast().claimAllGas(address(this), to);\\n\\t}\\n}\\n\",\"keccak256\":\"0x2c365e113694b57de3aac7301f9e44b4d911e7e31056093a2164afee2dbb3321\",\"license\":\"MIT\"},\"contracts/dependencies/PropelBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\nimport \\\"../interfaces/IPropelBase.sol\\\";\\n\\n/*\\n * Base contract for TroveManager, BorrowerOperations and StabilityPool. Contains global system constants and\\n * common functions.\\n */\\ncontract PropelBase is IPropelBase {\\n\\tuint256 public constant override DECIMAL_PRECISION = 1e18;\\n\\n\\t// Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered.\\n\\tuint256 public constant override CCR = 1500000000000000000; // 150%\\n\\n\\t// Amount of debt to be locked in gas pool on opening troves\\n\\tuint256 public immutable override DEBT_GAS_COMPENSATION;\\n\\n\\tuint256 public constant override PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5%\\n\\n\\tconstructor(uint256 _gasCompensation) {\\n\\t\\tDEBT_GAS_COMPENSATION = _gasCompensation;\\n\\t}\\n\\n\\t// --- Gas compensation functions ---\\n\\n\\t// Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation\\n\\tfunction _getCompositeDebt(uint256 _debt) internal view returns (uint256) {\\n\\t\\treturn _debt + DEBT_GAS_COMPENSATION;\\n\\t}\\n\\n\\tfunction _getNetDebt(uint256 _debt) internal view returns (uint256) {\\n\\t\\treturn _debt - DEBT_GAS_COMPENSATION;\\n\\t}\\n\\n\\t// Return the amount of collateral to be drawn from a trove's collateral and sent as gas compensation.\\n\\tfunction _getCollGasCompensation(uint256 _entireColl) internal pure returns (uint256) {\\n\\t\\treturn _entireColl / PERCENT_DIVISOR;\\n\\t}\\n\\n\\tfunction _requireUserAcceptsFee(uint256 _fee, uint256 _amount, uint256 _maxFeePercentage) internal pure {\\n\\t\\tuint256 feePercentage = (_fee * DECIMAL_PRECISION) / _amount;\\n\\t\\trequire(feePercentage <= _maxFeePercentage, \\\"Fee exceeded provided maximum\\\");\\n\\t}\\n}\\n\",\"keccak256\":\"0x3ce1c3d1c0700c1b277c88c8452c601c3d21e254e4c3f141618299e6d13ff32b\",\"license\":\"MIT\"},\"contracts/dependencies/PropelMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nlibrary PropelMath {\\n\\tuint256 internal constant DECIMAL_PRECISION = 1e18;\\n\\n\\t/* Precision for Nominal ICR (independent of price). Rationale for the value:\\n\\t *\\n\\t * - Making it \\u201ctoo high\\u201d could lead to overflows.\\n\\t * - Making it \\u201ctoo low\\u201d could lead to an ICR equal to zero, due to truncation from Solidity floor division.\\n\\t *\\n\\t * This value of 1e20 is chosen for safety: the NICR will only overflow for numerator > ~1e39,\\n\\t * and will only truncate to 0 if the denominator is at least 1e20 times greater than the numerator.\\n\\t *\\n\\t */\\n\\tuint256 internal constant NICR_PRECISION = 1e20;\\n\\n\\tfunction _min(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n\\t\\treturn (_a < _b) ? _a : _b;\\n\\t}\\n\\n\\tfunction _max(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n\\t\\treturn (_a >= _b) ? _a : _b;\\n\\t}\\n\\n\\t/*\\n\\t * Multiply two decimal numbers and use normal rounding rules:\\n\\t * -round product up if 19'th mantissa digit >= 5\\n\\t * -round product down if 19'th mantissa digit < 5\\n\\t *\\n\\t * Used only inside the exponentiation, _decPow().\\n\\t */\\n\\tfunction decMul(uint256 x, uint256 y) internal pure returns (uint256 decProd) {\\n\\t\\tuint256 prod_xy = x * y;\\n\\n\\t\\tdecProd = (prod_xy + (DECIMAL_PRECISION / 2)) / DECIMAL_PRECISION;\\n\\t}\\n\\n\\t/*\\n\\t * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n.\\n\\t *\\n\\t * Uses the efficient \\\"exponentiation by squaring\\\" algorithm. O(log(n)) complexity.\\n\\t *\\n\\t * TroveManager._calcDecayedBaseRate\\n\\t *\\n\\t * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals\\n\\t * \\\"minutes in 1000 years\\\": 60 * 24 * 365 * 1000\\n\\t *\\n\\t * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be\\n\\t * negligibly different from just passing the cap, since:\\n\\t *\\n\\t * the decayed base rate will be 0 for 1000 years or > 1000 years\\n\\t */\\n\\tfunction _decPow(uint256 _base, uint256 _minutes) internal pure returns (uint256) {\\n\\t\\tif (_minutes > 525600000) {\\n\\t\\t\\t_minutes = 525600000;\\n\\t\\t} // cap to avoid overflow\\n\\n\\t\\tif (_minutes == 0) {\\n\\t\\t\\treturn DECIMAL_PRECISION;\\n\\t\\t}\\n\\n\\t\\tuint256 y = DECIMAL_PRECISION;\\n\\t\\tuint256 x = _base;\\n\\t\\tuint256 n = _minutes;\\n\\n\\t\\t// Exponentiation-by-squaring\\n\\t\\twhile (n > 1) {\\n\\t\\t\\tif (n % 2 == 0) {\\n\\t\\t\\t\\tx = decMul(x, x);\\n\\t\\t\\t\\tn = n / 2;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// if (n % 2 != 0)\\n\\t\\t\\t\\ty = decMul(x, y);\\n\\t\\t\\t\\tx = decMul(x, x);\\n\\t\\t\\t\\tn = (n - 1) / 2;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\treturn decMul(x, y);\\n\\t}\\n\\n\\tfunction _getAbsoluteDifference(uint256 _a, uint256 _b) internal pure returns (uint256) {\\n\\t\\treturn (_a >= _b) ? _a - _b : _b - _a;\\n\\t}\\n\\n\\tfunction _computeNominalCR(uint256 _coll, uint256 _debt) internal pure returns (uint256) {\\n\\t\\tif (_debt > 0) {\\n\\t\\t\\treturn (_coll * NICR_PRECISION) / _debt;\\n\\t\\t}\\n\\t\\t// Return the maximal value for uint256 if the Trove has a debt of 0. Represents \\\"infinite\\\" CR.\\n\\t\\telse {\\n\\t\\t\\t// if (_debt == 0)\\n\\t\\t\\treturn 2 ** 256 - 1;\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _computeCR(uint256 _coll, uint256 _debt, uint256 _price) internal pure returns (uint256) {\\n\\t\\tif (_debt > 0) {\\n\\t\\t\\tuint256 newCollRatio = (_coll * _price) / _debt;\\n\\n\\t\\t\\treturn newCollRatio;\\n\\t\\t}\\n\\t\\t// Return the maximal value for uint256 if the Trove has a debt of 0. Represents \\\"infinite\\\" CR.\\n\\t\\telse {\\n\\t\\t\\t// if (_debt == 0)\\n\\t\\t\\treturn type(uint256).max;\\n\\t\\t}\\n\\t}\\n\\n\\tfunction _computeCR(uint256 _coll, uint256 _debt) internal pure returns (uint256) {\\n\\t\\tif (_debt > 0) {\\n\\t\\t\\tuint256 newCollRatio = (_coll) / _debt;\\n\\n\\t\\t\\treturn newCollRatio;\\n\\t\\t}\\n\\t\\t// Return the maximal value for uint256 if the Trove has a debt of 0. Represents \\\"infinite\\\" CR.\\n\\t\\telse {\\n\\t\\t\\t// if (_debt == 0)\\n\\t\\t\\treturn type(uint256).max;\\n\\t\\t}\\n\\t}\\n}\\n\",\"keccak256\":\"0xfd2ccf04b9e82e07adb4f601571bc76fa84099d1a39ceddd3934ff520158f368\",\"license\":\"MIT\"},\"contracts/dependencies/PropelOwnable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IPropelCore.sol\\\";\\n\\n/**\\n    @title Propel Ownable\\n    @notice Contracts inheriting `PropelOwnable` have the same owner as `PropelCore`.\\n            The ownership cannot be independently modified or renounced.\\n */\\ncontract PropelOwnable {\\n\\tIPropelCore public immutable PropelCore;\\n\\n\\tconstructor(IPropelCore _PropelCore) {\\n\\t\\tPropelCore = _PropelCore;\\n\\t}\\n\\n\\tmodifier onlyOwner() {\\n\\t\\trequire(msg.sender == owner(), \\\"Only owner\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\tmodifier onlyGuardian() {\\n\\t\\trequire(msg.sender == guardian(), \\\"Only guardian\\\");\\n\\t\\t_;\\n\\t}\\n\\n\\tfunction owner() public view returns (address) {\\n\\t\\treturn PropelCore.owner();\\n\\t}\\n\\n\\tfunction guardian() public view returns (address) {\\n\\t\\treturn PropelCore.guardian();\\n\\t}\\n\\n\\tfunction WETH() public view returns(IWETH) {\\n\\t\\treturn PropelCore.WETH();\\n\\t}\\n\\n\\tfunction blast() public view returns(IBlast) {\\n\\t\\treturn PropelCore.blast();\\n\\t}\\n}\\n\",\"keccak256\":\"0x4da3a2231c25589b2d494c2aa78c5784cec15d825ced6cfaaaed8fc8660c322b\",\"license\":\"MIT\"},\"contracts/dependencies/SystemStart.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IPropelCore.sol\\\";\\n\\n/**\\n    @title Propel System Start Time\\n    @dev Provides a unified `startTime` and `getWeek`, used for emissions.\\n */\\ncontract SystemStart {\\n\\tuint256 public immutable startTime;\\n\\n\\tconstructor(IPropelCore PropelCore) {\\n\\t\\tstartTime = PropelCore.startTime();\\n\\t}\\n}\\n\",\"keccak256\":\"0x988a7273c991093e65eb011f5efe961d12868c43221cc9a420fa08b27aee8bcb\",\"license\":\"MIT\"},\"contracts/dependencies/console.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\n// Buidler's helper contract for console logging\\nlibrary console {\\n\\taddress public constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);\\n\\n\\tfunction log() internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log()\\\"));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logInt(int p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(int)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction loguint256(uint256 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logString(string memory p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBool(bool p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logAddress(address p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes(bytes memory p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logByte(bytes1 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(byte)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes1(bytes1 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes1)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes2(bytes2 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes2)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes3(bytes3 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes3)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes4(bytes4 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes4)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes5(bytes5 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes5)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes6(bytes6 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes6)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes7(bytes7 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes7)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes8(bytes8 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes8)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes9(bytes9 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes9)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes10(bytes10 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes10)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes11(bytes11 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes11)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes12(bytes12 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes12)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes13(bytes13 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes13)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes14(bytes14 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes14)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes15(bytes15 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes15)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes16(bytes16 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes16)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes17(bytes17 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes17)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes18(bytes18 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes18)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes19(bytes19 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes19)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes20(bytes20 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes20)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes21(bytes21 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes21)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes22(bytes22 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes22)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes23(bytes23 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes23)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes24(bytes24 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes24)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes25(bytes25 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes25)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes26(bytes26 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes26)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes27(bytes27 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes27)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes28(bytes28 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes28)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes29(bytes29 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes29)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes30(bytes30 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes30)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes31(bytes31 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes31)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction logBytes32(bytes32 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bytes32)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address)\\\", p0));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address)\\\", p0, p1));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,uint256)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,string)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,bool)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,address)\\\", p0, p1, p2));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,string,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, bool p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(uint256 p0, address p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(uint256,address,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,string,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, bool p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(string memory p0, address p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(string,address,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,string,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, bool p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(bool p0, address p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(bool,address,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, uint256 p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,uint256,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, string memory p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,string,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, bool p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,bool,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,uint256,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,uint256,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,uint256,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, uint256 p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,uint256,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,string,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,string,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,string,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, string memory p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,string,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,bool,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,bool,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,bool,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, bool p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,bool,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, uint256 p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,address,uint256)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, string memory p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,address,string)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, bool p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,address,bool)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n\\n\\tfunction log(address p0, address p1, address p2, address p3) internal view {\\n\\t\\t(bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature(\\\"log(address,address,address,address)\\\", p0, p1, p2, p3));\\n\\t\\tignored;\\n\\t}\\n}\\n\",\"keccak256\":\"0x3b9e33fee27fa8d01fb3623be86f2c9f2c350f91e3aaa1452710076ba1251d4e\",\"license\":\"MIT\"},\"contracts/interfaces/IBlast.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nenum YieldMode {\\n\\tAUTOMATIC,\\n\\tVOID,\\n\\tCLAIMABLE\\n}\\n\\nenum GasMode {\\n\\tVOID,\\n\\tCLAIMABLE\\n}\\n\\ninterface IERC20Rebasing {\\n\\t// changes the yield mode of the caller and update the balance\\n\\t// to reflect the configuration\\n\\tfunction configure(YieldMode) external returns (uint256);\\n\\n\\t// \\\"claimable\\\" yield mode accounts can call this this claim their yield\\n\\t// to another address\\n\\tfunction claim(address recipient, uint256 amount) external returns (uint256);\\n\\n\\t// read the claimable amount for an account\\n\\tfunction getClaimableAmount(address account) external view returns (uint256);\\n}\\n\\ninterface IBlast {\\n\\t// configure\\n\\tfunction configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;\\n\\n\\tfunction configure(YieldMode _yield, GasMode gasMode, address governor) external;\\n\\n\\t// base configuration options\\n\\tfunction configureClaimableYield() external;\\n\\n\\tfunction configureClaimableYieldOnBehalf(address contractAddress) external;\\n\\n\\tfunction configureAutomaticYield() external;\\n\\n\\tfunction configureAutomaticYieldOnBehalf(address contractAddress) external;\\n\\n\\tfunction configureVoidYield() external;\\n\\n\\tfunction configureVoidYieldOnBehalf(address contractAddress) external;\\n\\n\\tfunction configureClaimableGas() external;\\n\\n\\tfunction configureClaimableGasOnBehalf(address contractAddress) external;\\n\\n\\tfunction configureVoidGas() external;\\n\\n\\tfunction configureVoidGasOnBehalf(address contractAddress) external;\\n\\n\\tfunction configureGovernor(address _governor) external;\\n\\n\\tfunction configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;\\n\\n\\t// claim yield\\n\\tfunction claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);\\n\\n\\tfunction claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);\\n\\n\\t// claim gas\\n\\tfunction claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);\\n\\n\\tfunction claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);\\n\\n\\tfunction claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);\\n\\n\\tfunction claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);\\n\\n\\t// read functions\\n\\tfunction readClaimableYield(address contractAddress) external view returns (uint256);\\n\\n\\tfunction readYieldConfiguration(address contractAddress) external view returns (uint8);\\n\\n\\tfunction readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);\\n}\\n\",\"keccak256\":\"0xffaa54f302ba2c47f29080863318906f4094105afb1d5a57798177a9b34f142a\",\"license\":\"MIT\"},\"contracts/interfaces/IBorrowerOperations.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.0;\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"./ITroveManager.sol\\\";\\n\\ninterface IBorrowerOperations {\\n\\tstruct SystemBalances {\\n\\t\\tuint256[] collaterals;\\n\\t\\tuint256[] debts;\\n\\t\\tuint256[] prices;\\n\\t}\\n\\n\\tenum BorrowerOperation {\\n\\t\\topenTrove,\\n\\t\\tcloseTrove,\\n\\t\\tadjustTrove\\n\\t}\\n\\n\\tevent BorrowingFeePaid(address indexed borrower, uint256 amount);\\n\\tevent CollateralConfigured(ITroveManager troveManager, IERC20 collateralToken);\\n\\tevent TroveCreated(address indexed _borrower, uint256 arrayIndex);\\n\\tevent TroveManagerRemoved(ITroveManager troveManager);\\n\\tevent TroveUpdated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 stake, BorrowerOperation operation);\\n\\n\\tfunction addColl(ITroveManager troveManager, address account, uint256 _collateralAmount, address _upperHint, address _lowerHint) external;\\n\\n\\tfunction adjustTrove(ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _collDeposit, uint256 _collWithdrawal, uint256 _debtChange, bool _isDebtIncrease, address _upperHint, address _lowerHint) external;\\n\\n\\tfunction closeTrove(ITroveManager troveManager, address account) external;\\n\\n\\tfunction configureCollateral(ITroveManager troveManager, IERC20 collateralToken) external;\\n\\n\\tfunction fetchBalances() external returns (SystemBalances memory balances);\\n\\n\\tfunction getGlobalSystemBalances() external returns (uint256 totalPricedCollateral, uint256 totalDebt);\\n\\n\\tfunction getTCR() external returns (uint256 globalTotalCollateralRatio);\\n\\n\\tfunction openTrove(ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _collateralAmount, uint256 _debtAmount, address _upperHint, address _lowerHint) external;\\n\\n\\tfunction removeTroveManager(ITroveManager troveManager) external;\\n\\n\\tfunction repayDebt(ITroveManager troveManager, address account, uint256 _debtAmount, address _upperHint, address _lowerHint) external;\\n\\n\\tfunction setMinNetDebt(uint256 _minNetDebt) external;\\n\\n\\tfunction withdrawColl(ITroveManager troveManager, address account, uint256 _collWithdrawal, address _upperHint, address _lowerHint) external;\\n\\n\\tfunction withdrawDebt(ITroveManager troveManager, address account, uint256 _maxFeePercentage, uint256 _debtAmount, address _upperHint, address _lowerHint) external;\\n\\n\\tfunction factory() external view returns (address);\\n\\n\\tfunction getCompositeDebt(uint256 _debt) external view returns (uint256);\\n\\n\\tfunction minNetDebt() external view returns (uint256);\\n\\n\\tfunction checkRecoveryMode(uint256 TCR) external pure returns (bool);\\n}\\n\",\"keccak256\":\"0x5cab9594ba308880bc3b0624422faef2673bf306c7f08d898e82544afa6c15aa\",\"license\":\"MIT\"},\"contracts/interfaces/IPriceFeed.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IPyth.sol\\\";\\n\\ninterface IPriceFeed {\\n\\tstruct OracleRecord {\\n\\t\\tIPyth pyth;\\n\\t\\tuint32 decimals;\\n\\t\\tuint32 heartbeat;\\n\\t\\tbool isFeedWorking;\\n\\t}\\n\\n\\tstruct PriceRecord {\\n\\t\\tuint96 scaledPrice;\\n\\t\\tuint32 timestamp;\\n\\t\\tuint32 lastUpdated;\\n\\t}\\n\\n\\tstruct FeedResponse {\\n\\t\\tint64 price;\\n\\t\\t// Confidence interval around the price\\n\\t\\tuint64 conf;\\n\\t\\t// Price exponent\\n\\t\\tint32 expo;\\n\\t\\t// Unix timestamp describing when the price was published\\n\\t\\tuint publishTime;\\n\\t\\tbool success;\\n\\t}\\n\\n\\t// Custom Errors --------------------------------------------------------------------------------------------------\\n\\n\\terror PriceFeed__InvalidFeedResponseError();\\n\\terror PriceFeed__FeedFrozenError();\\n\\terror PriceFeed__UnknownFeedError();\\n\\terror PriceFeed__HeartbeatOutOfBoundsError();\\n\\n\\t// Events ---------------------------------------------------------------------------------------------------------\\n\\n\\tevent NewOracleRegistered(address pyth);\\n\\tevent PriceFeedStatusUpdated(address oracle, bool isWorking);\\n\\tevent PriceRecordUpdated(uint256 _price);\\n\\n\\tfunction fetchPrice(address _token) external returns (uint256);\\n}\\n\",\"keccak256\":\"0x8ef2b41df0f27e3c3a61cbcbd999aac5928199c7cd5dc7da2d93d7a58891a908\",\"license\":\"MIT\"},\"contracts/interfaces/IPropelBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\ninterface IPropelBase {\\n\\tfunction DECIMAL_PRECISION() external view returns (uint256);\\n\\n\\t// Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered.\\n\\tfunction CCR() external view returns (uint256); // 150%\\n\\n\\t// Amount of debt to be locked in gas pool on opening troves\\n\\tfunction DEBT_GAS_COMPENSATION() external view returns (uint256);\\n\\n\\tfunction PERCENT_DIVISOR() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xcf4433a83eb57f68ce98b33c442abde5420e6e4cede255cfa41680fc5c2808b8\",\"license\":\"MIT\"},\"contracts/interfaces/IPropelCore.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IBlast.sol\\\";\\nimport \\\"../interfaces/IWETH.sol\\\";\\n\\ninterface IPropelCore {\\n\\tevent FeeReceiverSet(address feeReceiver);\\n\\tevent GuardianSet(address guardian);\\n\\tevent NewOwnerAccepted(address oldOwner, address owner);\\n\\tevent NewOwnerCommitted(address owner, address pendingOwner, uint256 deadline);\\n\\tevent NewOwnerRevoked(address owner, address revokedOwner);\\n\\tevent Paused();\\n\\tevent PriceFeedSet(address priceFeed);\\n\\tevent Unpaused();\\n\\n\\tfunction acceptTransferOwnership() external;\\n\\n\\tfunction commitTransferOwnership(address newOwner) external;\\n\\n\\tfunction revokeTransferOwnership() external;\\n\\n\\tfunction setFeeReceiver(address _feeReceiver) external;\\n\\n\\tfunction setGuardian(address _guardian) external;\\n\\n\\tfunction setPaused(bool _paused) external;\\n\\n\\tfunction setPriceFeed(address _priceFeed) external;\\n\\n\\tfunction OWNERSHIP_TRANSFER_DELAY() external view returns (uint256);\\n\\n\\tfunction feeReceiver() external view returns (address);\\n\\n\\tfunction guardian() external view returns (address);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction WETH() external view returns(IWETH);\\n\\n\\tfunction blast() external view returns(IBlast);\\n\\n\\tfunction ownershipTransferDeadline() external view returns (uint256);\\n\\n\\tfunction paused() external view returns (bool);\\n\\n\\tfunction pendingOwner() external view returns (address);\\n\\n\\tfunction startTime() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xe099656468b3bdf731d4f5bd1e8e1cc8cece0d45cdef837194c1282fdbcac177\",\"license\":\"MIT\"},\"contracts/interfaces/IPropelUSD.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\ninterface IPropelUSD {\\n\\tevent Approval(address indexed owner, address indexed spender, uint256 value);\\n\\tevent MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason);\\n\\tevent OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\tevent ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint256 _amount);\\n\\tevent RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash);\\n\\tevent SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint256 _amount);\\n\\tevent SetMinDstGas(uint16 _dstChainId, uint16 _type, uint256 _minDstGas);\\n\\tevent SetPrecrime(address precrime);\\n\\tevent SetTrustedRemote(uint16 _remoteChainId, bytes _path);\\n\\tevent SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);\\n\\tevent SetUseCustomAdapterParams(bool _useCustomAdapterParams);\\n\\tevent Transfer(address indexed from, address indexed to, uint256 value);\\n\\n\\tfunction approve(address spender, uint256 amount) external returns (bool);\\n\\n\\tfunction burn(address _account, uint256 _amount) external;\\n\\n\\tfunction burnWithGasCompensation(address _account, uint256 _amount) external returns (bool);\\n\\n\\tfunction decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);\\n\\n\\tfunction enableTroveManager(address _troveManager) external;\\n\\n\\tfunction flashLoan(address receiver, address token, uint256 amount, bytes calldata data) external returns (bool);\\n\\n\\tfunction forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;\\n\\n\\tfunction increaseAllowance(address spender, uint256 addedValue) external returns (bool);\\n\\n\\tfunction lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;\\n\\n\\tfunction mint(address _account, uint256 _amount) external;\\n\\n\\tfunction mintWithGasCompensation(address _account, uint256 _amount) external returns (bool);\\n\\n\\tfunction nonblockingLzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;\\n\\n\\tfunction permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;\\n\\n\\tfunction renounceOwnership() external;\\n\\n\\tfunction returnFromPool(address _poolAddress, address _receiver, uint256 _amount) external;\\n\\n\\tfunction sendToSP(address _sender, uint256 _amount) external;\\n\\n\\tfunction setConfig(uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config) external;\\n\\n\\tfunction setMinDstGas(uint16 _dstChainId, uint16 _packetType, uint256 _minGas) external;\\n\\n\\tfunction setPayloadSizeLimit(uint16 _dstChainId, uint256 _size) external;\\n\\n\\tfunction setPrecrime(address _precrime) external;\\n\\n\\tfunction setReceiveVersion(uint16 _version) external;\\n\\n\\tfunction setSendVersion(uint16 _version) external;\\n\\n\\tfunction setTrustedRemote(uint16 _srcChainId, bytes calldata _path) external;\\n\\n\\tfunction setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external;\\n\\n\\tfunction setUseCustomAdapterParams(bool _useCustomAdapterParams) external;\\n\\n\\tfunction transfer(address recipient, uint256 amount) external returns (bool);\\n\\n\\tfunction transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\\n\\n\\tfunction transferOwnership(address newOwner) external;\\n\\n\\tfunction retryMessage(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external payable;\\n\\n\\tfunction sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint256 _amount, address _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;\\n\\n\\tfunction DEBT_GAS_COMPENSATION() external view returns (uint256);\\n\\n\\tfunction DEFAULT_PAYLOAD_SIZE_LIMIT() external view returns (uint256);\\n\\n\\tfunction FLASH_LOAN_FEE() external view returns (uint256);\\n\\n\\tfunction NO_EXTRA_GAS() external view returns (uint256);\\n\\n\\tfunction PT_SEND() external view returns (uint16);\\n\\n\\tfunction allowance(address owner, address spender) external view returns (uint256);\\n\\n\\tfunction balanceOf(address account) external view returns (uint256);\\n\\n\\tfunction borrowerOperationsAddress() external view returns (address);\\n\\n\\tfunction circulatingSupply() external view returns (uint256);\\n\\n\\tfunction decimals() external view returns (uint8);\\n\\n\\tfunction domainSeparator() external view returns (bytes32);\\n\\n\\tfunction estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint256 _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint256 nativeFee, uint256 zroFee);\\n\\n\\tfunction factory() external view returns (address);\\n\\n\\tfunction failedMessages(uint16, bytes calldata, uint64) external view returns (bytes32);\\n\\n\\tfunction flashFee(address token, uint256 amount) external view returns (uint256);\\n\\n\\tfunction gasPool() external view returns (address);\\n\\n\\tfunction getConfig(uint16 _version, uint16 _chainId, address, uint256 _configType) external view returns (bytes memory);\\n\\n\\tfunction getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory);\\n\\n\\tfunction isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);\\n\\n\\tfunction lzEndpoint() external view returns (address);\\n\\n\\tfunction maxFlashLoan(address token) external view returns (uint256);\\n\\n\\tfunction minDstGasLookup(uint16, uint16) external view returns (uint256);\\n\\n\\tfunction name() external view returns (string memory);\\n\\n\\tfunction nonces(address owner) external view returns (uint256);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction payloadSizeLimitLookup(uint16) external view returns (uint256);\\n\\n\\tfunction permitTypeHash() external view returns (bytes32);\\n\\n\\tfunction precrime() external view returns (address);\\n\\n\\tfunction stabilityPoolAddress() external view returns (address);\\n\\n\\tfunction supportsInterface(bytes4 interfaceId) external view returns (bool);\\n\\n\\tfunction symbol() external view returns (string memory);\\n\\n\\tfunction token() external view returns (address);\\n\\n\\tfunction totalSupply() external view returns (uint256);\\n\\n\\tfunction troveManager(address) external view returns (bool);\\n\\n\\tfunction trustedRemoteLookup(uint16) external view returns (bytes memory);\\n\\n\\tfunction useCustomAdapterParams() external view returns (bool);\\n\\n\\tfunction version() external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xa39f5ca61c6ebd7adbdf39f1e4d9e37496dd0ca2d401244e93ca56fe5a8607ca\",\"license\":\"MIT\"},\"contracts/interfaces/IPyth.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\ninterface IPyth {\\n\\tstruct Price {\\n\\t\\t// Price\\n\\t\\tint64 price;\\n\\t\\t// Confidence interval around the price\\n\\t\\tuint64 conf;\\n\\t\\t// Price exponent\\n\\t\\tint32 expo;\\n\\t\\t// Unix timestamp describing when the price was published\\n\\t\\tuint publishTime;\\n\\t}\\n\\n\\tfunction getPrice(bytes32 id) external view returns (Price memory);\\n\\n\\tfunction getPriceUnsafe(bytes32 id) external view returns (Price memory price);\\n}\\n\",\"keccak256\":\"0xfd589468ff2885c85543d89042b18e7801be77d8586bddf27481830fb233bd01\",\"license\":\"MIT\"},\"contracts/interfaces/ISortedTroves.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\ninterface ISortedTroves {\\n\\tevent NodeAdded(address _id, uint256 _NICR);\\n\\tevent NodeRemoved(address _id);\\n\\n\\tfunction insert(address _id, uint256 _NICR, address _prevId, address _nextId) external;\\n\\n\\tfunction reInsert(address _id, uint256 _newNICR, address _prevId, address _nextId) external;\\n\\n\\tfunction remove(address _id) external;\\n\\n\\tfunction setAddresses(address _troveManagerAddress) external;\\n\\n\\tfunction contains(address _id) external view returns (bool);\\n\\n\\tfunction data() external view returns (address head, address tail, uint256 size);\\n\\n\\tfunction findInsertPosition(uint256 _NICR, address _prevId, address _nextId) external view returns (address, address);\\n\\n\\tfunction getFirst() external view returns (address);\\n\\n\\tfunction getLast() external view returns (address);\\n\\n\\tfunction getNext(address _id) external view returns (address);\\n\\n\\tfunction getPrev(address _id) external view returns (address);\\n\\n\\tfunction getSize() external view returns (uint256);\\n\\n\\tfunction isEmpty() external view returns (bool);\\n\\n\\tfunction troveManager() external view returns (address);\\n\\n\\tfunction validInsertPosition(uint256 _NICR, address _prevId, address _nextId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x568f6029aad06d63866b67a30cddcb6ca716b5163aac714d847189d09a2aaf31\",\"license\":\"MIT\"},\"contracts/interfaces/ITroveManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"./IPropelBase.sol\\\";\\nimport \\\"./ISortedTroves.sol\\\";\\nimport \\\"./IPriceFeed.sol\\\";\\n\\ninterface ITroveManager is IPropelBase {\\n\\t// Store the necessary data for a trove\\n\\tstruct Trove {\\n\\t\\tuint256 debt;\\n\\t\\tuint256 coll;\\n\\t\\tuint256 stake;\\n\\t\\tStatus status;\\n\\t\\tuint128 arrayIndex;\\n\\t}\\n\\n\\tstruct RedemptionTotals {\\n\\t\\tuint256 remainingDebt;\\n\\t\\tuint256 totalDebtToRedeem;\\n\\t\\tuint256 totalCollateralDrawn;\\n\\t\\tuint256 totalInterest;\\n\\t\\tuint256 collateralFee;\\n\\t\\tuint256 collateralToSendToRedeemer;\\n\\t\\tuint256 decayedBaseRate;\\n\\t\\tuint256 price;\\n\\t\\tuint256 totalDebtSupplyAtStart;\\n\\t}\\n\\n\\tstruct SingleRedemptionValues {\\n\\t\\tuint256 debtLot;\\n\\t\\tuint256 collateralLot;\\n\\t\\tuint256 interestLot;\\n\\t\\tbool cancelledPartial;\\n\\t}\\n\\n\\t// Object containing the collateral and debt snapshots for a given active trove\\n\\tstruct RewardSnapshot {\\n\\t\\tuint256 collateral;\\n\\t\\tuint256 debt;\\n\\t\\tuint256 interest;\\n\\t}\\n\\n\\tenum TroveManagerOperation {\\n\\t\\tapplyPendingRewards,\\n\\t\\tliquidateInNormalMode,\\n\\t\\tliquidateInRecoveryMode,\\n\\t\\tredeemCollateral\\n\\t}\\n\\n\\tenum Status {\\n\\t\\tnonExistent,\\n\\t\\tactive,\\n\\t\\tclosedByOwner,\\n\\t\\tclosedByLiquidation,\\n\\t\\tclosedByRedemption\\n\\t}\\n\\n\\tevent InsterstPaid(address _account, address _borrower, uint256 _interest);\\n\\tevent TroveUpdated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 _stake, TroveManagerOperation _operation);\\n\\tevent Redemption(uint256 _attemptedDebtAmount, uint256 _actualDebtAmount, uint256 _collateralSent, uint256 _InterestDebt, uint256 _collateralFee);\\n\\tevent BaseRateUpdated(uint256 _baseRate);\\n\\tevent LastFeeOpTimeUpdated(uint256 _lastFeeOpTime);\\n\\tevent TotalStakesUpdated(uint256 _newTotalStakes);\\n\\tevent SystemSnapshotsUpdated(uint256 _totalStakesSnapshot, uint256 _totalCollateralSnapshot);\\n\\tevent LTermsUpdated(uint256 _L_collateral, uint256 _L_debt);\\n\\tevent TroveSnapshotsUpdated(uint256 _L_collateral, uint256 _L_debt, uint256 _L_Interest_Debt);\\n\\tevent TroveIndexUpdated(address _borrower, uint256 _newIndex);\\n\\tevent CollateralSent(address _to, uint256 _amount);\\n\\tevent RewardClaimed(address indexed account, address indexed recipient, uint256 claimed);\\n\\n\\tfunction addCollateralSurplus(address borrower, uint256 collSurplus) external;\\n\\n\\tfunction applyPendingRewards(address _borrower) external returns (uint256 coll, uint256 debt);\\n\\n\\tfunction claimCollateral(address _receiver) external;\\n\\n\\tfunction closeTrove(address _borrower, address _receiver, uint256 collAmount, uint256 debtAmount) external;\\n\\n\\tfunction closeTroveByLiquidation(address _borrower) external;\\n\\n\\tfunction decayBaseRateAndGetBorrowingFee(uint256 _debt) external returns (uint256);\\n\\n\\tfunction decreaseDebtAndSendCollateral(address account, uint256 debt, uint256 coll) external;\\n\\n\\tfunction finalizeLiquidation(address _liquidator, uint256 _debt, uint256 _coll, uint256 _collSurplus, uint256 _debtGasComp, uint256 _collGasComp, uint256 _interest) external;\\n\\n\\tfunction getEntireSystemBalances() external returns (uint256, uint256, uint256);\\n\\n\\tfunction movePendingTroveRewardsToActiveBalances(uint256 _debt, uint256 _collateral) external;\\n\\n\\tfunction openTrove(address _borrower, uint256 _collateralAmount, uint256 _compositeDebt, uint256 NICR, address _upperHint, address _lowerHint) external returns (uint256 stake, uint256 arrayIndex);\\n\\n\\tfunction redeemCollateral(uint256 _debtAmount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint256 _partialRedemptionHintNICR, uint256 _maxIterations, uint256 _maxFeePercentage) external;\\n\\n\\tfunction setAddresses(address _priceFeedAddress, address _sortedTrovesAddress, IERC20 _collateralToken) external;\\n\\n\\tfunction setParameters(uint256 _minuteDecayFactor, uint256 _redemptionFeeFloor, uint256 _maxRedemptionFee, uint256 _borrowingFeeFloor, uint256 _maxBorrowingFee, uint256 _maxSystemDebt, uint256 _MCR, uint32 _interestRate) external;\\n\\n\\tfunction setPaused(bool _paused) external;\\n\\n\\tfunction setPriceFeed(address _priceFeedAddress) external;\\n\\n\\tfunction updateTroveFromAdjustment(bool _isDebtIncrease, uint256 _debtChange, uint256 _netDebtChange, bool _isCollIncrease, uint256 _collChange, address _upperHint, address _lowerHint, address _borrower, address _receiver) external returns (uint256, uint256, uint256);\\n\\n\\tfunction fetchPrice() external returns (uint256);\\n\\n\\tfunction distributeInterestDebt() external returns (uint256);\\n\\n\\tfunction repayInterest(address _account, address _borrower, uint256 _debt) external;\\n\\n\\tfunction BOOTSTRAP_PERIOD() external view returns (uint256);\\n\\n\\tfunction L_collateral() external view returns (uint256);\\n\\n\\tfunction L_debt() external view returns (uint256);\\n\\n\\tfunction MCR() external view returns (uint256);\\n\\n\\tfunction getTrove(address _borrower) external view returns (Trove memory);\\n\\n\\tfunction baseRate() external view returns (uint256);\\n\\n\\tfunction borrowerOperationsAddress() external view returns (address);\\n\\n\\tfunction borrowingFeeFloor() external view returns (uint256);\\n\\n\\tfunction collateralToken() external view returns (IERC20);\\n\\n\\tfunction defaultedCollateral() external view returns (uint256);\\n\\n\\tfunction defaultedDebt() external view returns (uint256);\\n\\n\\tfunction getBorrowingFee(uint256 _debt) external view returns (uint256);\\n\\n\\tfunction getBorrowingFeeWithDecay(uint256 _debt) external view returns (uint256);\\n\\n\\tfunction getBorrowingRate() external view returns (uint256);\\n\\n\\tfunction getBorrowingRateWithDecay() external view returns (uint256);\\n\\n\\tfunction getCurrentICR(address _borrower, uint256 _price) external view returns (uint256);\\n\\n\\tfunction getEntireDebtAndColl(address _borrower) external view returns (uint256 debt, uint256 coll, uint256 pendingDebtReward, uint256 pendingCollateralReward);\\n\\n\\tfunction getEntireSystemColl() external view returns (uint256);\\n\\n\\tfunction getEntireSystemDebt() external view returns (uint256);\\n\\n\\tfunction getGlobalSystemDebt() external view returns (uint256);\\n\\n\\tfunction getTroveInterest(address _borrower, uint256 _debt) external view returns (uint256);\\n\\n\\tfunction getRedemptionICR(address _borrower, uint256 _price) external view returns (uint256);\\n\\n\\tfunction getNominalICR(address _borrower) external view returns (uint256);\\n\\n\\tfunction getPendingCollAndDebtRewards(address _borrower) external view returns (uint256, uint256);\\n\\n\\tfunction getRedemptionFeeWithDecay(uint256 _collateralDrawn) external view returns (uint256);\\n\\n\\tfunction getRedemptionRate() external view returns (uint256);\\n\\n\\tfunction getRedemptionRateWithDecay() external view returns (uint256);\\n\\n\\tfunction getTotalActiveCollateral() external view returns (uint256);\\n\\n\\tfunction getTotalActiveDebt() external view returns (uint256);\\n\\n\\tfunction getTroveCollAndDebt(address _borrower) external view returns (uint256 coll, uint256 debt);\\n\\n\\tfunction getTroveFromTroveOwnersArray(uint256 _index) external view returns (address);\\n\\n\\tfunction getTroveOwnersCount() external view returns (uint256);\\n\\n\\tfunction getTroveStake(address _borrower) external view returns (uint256);\\n\\n\\tfunction getTroveStatus(address _borrower) external view returns (uint256);\\n\\n\\tfunction hasPendingRewards(address _borrower) external view returns (bool);\\n\\n\\tfunction lastCollateralError_Redistribution() external view returns (uint256);\\n\\n\\tfunction lastDebtError_Redistribution() external view returns (uint256);\\n\\n\\tfunction lastFeeOperationTime() external view returns (uint256);\\n\\n\\tfunction liquidationManager() external view returns (address);\\n\\n\\tfunction maxBorrowingFee() external view returns (uint256);\\n\\n\\tfunction maxRedemptionFee() external view returns (uint256);\\n\\n\\tfunction maxSystemDebt() external view returns (uint256);\\n\\n\\tfunction minuteDecayFactor() external view returns (uint256);\\n\\n\\tfunction paused() external view returns (bool);\\n\\n\\tfunction redemptionFeeFloor() external view returns (uint256);\\n\\n\\tfunction getRewardSnapshots(address) external view returns (RewardSnapshot memory);\\n\\n\\tfunction priceFeed() external view returns (IPriceFeed);\\n\\n\\tfunction sortedTroves() external view returns (ISortedTroves);\\n\\n\\tfunction sunsetting() external view returns (bool);\\n\\n\\tfunction surplusBalances(address) external view returns (uint256);\\n\\n\\tfunction systemDeploymentTime() external view returns (uint256);\\n\\n\\tfunction totalCollateralSnapshot() external view returns (uint256);\\n\\n\\tfunction totalStakes() external view returns (uint256);\\n\\n\\tfunction totalStakesSnapshot() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0x489a259e79e6b4ba4d57177d8b4576487645b00ca324c9d1ae50301abfc939a8\",\"license\":\"MIT\"},\"contracts/interfaces/IWETH.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IBlast.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IWETH is IERC20, IERC20Rebasing {\\n\\tfunction deposit() external payable;\\n}\\n\",\"keccak256\":\"0x63d5514ce911f067af3312ed496bb55dae2526835692c6d3e01b2c68c6b28d54\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x6101606040523480156200001257600080fd5b5060405162005e4038038062005e4083398101604081905262000035916200028d565b6001600160a01b0380851660805260a0829052861660c052858062000059620001c3565b6001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200009457600080fd5b505af1158015620000a9573d6000803e3d6000fd5b50505050620000bd6200023160201b60201c565b6001600160a01b0316631a33757d60026040518263ffffffff1660e01b8152600401620000eb919062000315565b6020604051808303816000875af11580156200010b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013191906200033e565b5050806001600160a01b03166378e979256040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000172573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019891906200033e565b60e05250506001600160a01b03938416610140529083166101005290911661012052506200037f9050565b600060c0516001600160a01b031663175e1a7d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022c919062000358565b905090565b600060c0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000206573d6000803e3d6000fd5b6001600160a01b03811681146200028a57600080fd5b50565b60008060008060008060c08789031215620002a757600080fd5b8651620002b48162000274565b6020880151909650620002c78162000274565b6040880151909550620002da8162000274565b6060880151909450620002ed8162000274565b6080880151909350620003008162000274565b8092505060a087015190509295509295509295565b60208101600383106200033857634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156200035157600080fd5b5051919050565b6000602082840312156200036b57600080fd5b8151620003788162000274565b9392505050565b60805160a05160c05160e0516101005161012051610140516159b06200049060003960008181610e630152818161186201526150170152600081816107b60152613a52015260008181610c120152818161228301528181612785015281816136c2015261489901526000610a3f015260008181610e210152818161117a0152818161159d01528181611ffa015281816124b2015261256101526000818161092201528181614716015281816147a2015281816147e101526151050152600081816106fc01528181611899015281816123da015281816128d501528181612dbb01528181613961015281816141f90152818161428f01528181614bdf01528181614d62015261504601526159b06000f3fe608060405234801561001057600080fd5b50600436106106ca5760003560e01c80637eb18bbc1161037c578063bcd37526116101de578063d5b356351161010f578063ebe2b12b116100ad578063f2b6db5111610087578063f2b6db5114610e1c578063f36b242514610e43578063f962fa3b14610e4b578063fe9d032314610e5e57600080fd5b8063ebe2b12b14610dc5578063ec38a05d14610de9578063f158c80914610e0957600080fd5b8063e2ac77b0116100e9578063e2ac77b014610d83578063e47cf0c314610d96578063e9186c9414610d9f578063eb3007fd14610db257600080fd5b8063d5b3563514610d4a578063d8a0c92714610d5d578063d9a7244414610d7057600080fd5b8063c9a4cbf11161017c578063d293c71011610156578063d293c71014610d1b578063d30612e114610d2e578063d380a37c14610d38578063d38b055814610d4157600080fd5b8063c9a4cbf114610ced578063d128080c14610d00578063d12ae84114610d0857600080fd5b8063bf9befb1116101b8578063bf9befb114610cbf578063c2d94aec14610cc8578063c35bc55014610cdb578063c52861f214610ce557600080fd5b8063bcd3752614610c83578063bd28c0f414610c96578063be2c377b14610cb657600080fd5b80639d8dc8fa116102b8578063b2f29d7b11610256578063b7f8cf9b11610230578063b7f8cf9b14610c0d578063b91af97c14610c34578063ba8dd56214610c67578063bc006c3814610c7a57600080fd5b8063b2f29d7b14610be9578063b3f0067414610bfc578063b4997a1f14610c0457600080fd5b8063ad5c464811610292578063ad5c464814610ba8578063ae91875414610bb0578063b0d8e18114610bc3578063b2016bd414610bd657600080fd5b80639d8dc8fa14610b885780639ed7254214610b90578063a20baee614610b9957600080fd5b80638da5cb5b116103255780639484fb8e116102ff5780639484fb8e14610b5c57806396660b1814610b6e57806396d711ff14610b775780639d31b71214610b8057600080fd5b80638da5cb5b14610b4257806390fb8bb114610b4a57806391245f9f14610b5357600080fd5b806384de387f1161035657806384de387f14610b1f57806386ad29aa14610b32578063887105d314610b3a57600080fd5b80637eb18bbc14610af0578063807d138d14610b035780638235b28414610b0c57600080fd5b80634056d9fc1161053057806366ca4a211161046157806378e97925116103ff5780637b0a47ee116103d95780637b0a47ee14610a725780637c3a00fd14610aaf5780637da0b1fa14610ad45780637e95d66414610ae757600080fd5b806378e9792514610a3a578063794e572414610a61578063795d26c314610a6a57600080fd5b8063741bef1a1161043b578063741bef1a146109ee5780637541ae1b14610a01578063756b253e14610a14578063789c6b9314610a2757600080fd5b806366ca4a21146109ca578063720fbe2c146109d2578063724e78da146109db57600080fd5b80634ba4a28b116104ce5780635733d58f116104a85780635733d58f1461095f5780635c975abb1461096e578063631203b01461098b57806364cee2601461099e57600080fd5b80634ba4a28b1461091d5780635429c9421461094457806355ca38cf1461094c57600080fd5b80634820fe561161050a5780634820fe56146108d05780634870dd9a146108d857806349eefeee146108e05780634b269bf9146108e857600080fd5b80634056d9fc146108ac578063452a9320146108b5578063477d66cf146108bd57600080fd5b8063205b410a1161060a5780632b2b2bac116105a857806333d53b591161058257806333d53b591461086a578063363bf96414610873578063385a128f1461088657806338b681431461089957600080fd5b80632b2b2bac146108455780632f5c83a81461085857806331c7a2611461086157600080fd5b806325019ee9116105e457806325019ee91461080e578063272b13231461082157806328fc4465146108345780632b11551a1461083d57600080fd5b8063205b410a146107ea57806320d17d7b146107f257806321e37801146107fb57600080fd5b806316c38b3c116106775780631e897901116106515780631e897901146107a95780631ef3a04c146107b15780631f68f20a146107d85780631fd865d7146107e157600080fd5b806316c38b3c14610786578063175e1a7d1461079957806319d82163146107a157600080fd5b80630fd5d747116106a85780630fd5d7471461075e5780630fdb11cf146107745780631289fefb1461077c57600080fd5b806301c799fc146106cf578063086ce520146106f75780630b07655714610736575b600080fd5b6106d7610e85565b604080519384526020840192909252908201526060015b60405180910390f35b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016106ee565b6107496107443660046152c9565b610ead565b604080519283526020830191909152016106ee565b610766610eca565b6040519081526020016106ee565b610766610fa9565b610784611041565b005b6107846107943660046152f4565b6110cf565b61071e611176565b6107666111ff565b610766611216565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b61076660115481565b61076660035481565b600154610766565b610766601e5481565b6107666108093660046152c9565b611220565b61078461081c3660046152c9565b611256565b61078461082f3660046152c9565b611275565b61076660025481565b610766611363565b6107496108533660046152c9565b611370565b610766600e5481565b610766600c5481565b61076660165481565b610784610881366004615311565b611389565b61078461089436600461535c565b6113fd565b6107846108a736600461535c565b6114c3565b610766600d5481565b61071e611599565b6107666108cb36600461535c565b6115f9565b601a54610766565b61076660c881565b602454610766565b6108fb6108f63660046152c9565b61160c565b60408051825181526020808401519082015291810151908201526060016106ee565b6107667f000000000000000000000000000000000000000000000000000000000000000081565b610766611672565b61076661095a366004615375565b6116a3565b6107666714d1120d7b16000081565b60105461097b9060ff1681565b60405190151581526020016106ee565b61076661099936600461535c565b6116f6565b6107666109ac3660046152c9565b6001600160a01b031660009081526021602052604090206002015490565b610766611703565b610766600f5481565b6107846109e93660046152c9565b611715565b60055461071e906001600160a01b031681565b610784610a0f3660046153a1565b611799565b61071e610a2236600461535c565b611909565b610784610a35366004615375565b611933565b6107667f000000000000000000000000000000000000000000000000000000000000000081565b61076660085481565b61076661196c565b602054610a8e906fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020016106ee565b600054610abf9063ffffffff1681565b60405163ffffffff90911681526020016106ee565b610749610ae23660046153f6565b61197e565b610766600a5481565b610784610afe3660046152c9565b611c98565b61076660145481565b610784610b1a3660046152c9565b611cc7565b610784610b2d366004615471565b611d4b565b610766611f57565b610766611fe4565b61071e611ff6565b61076660045481565b610766600b5481565b60105461097b90610100900460ff1681565b610766601c5481565b61076660155481565b610766612056565b610784612121565b61076660195481565b610766670de0b6b3a764000081565b61071e6124ae565b60075461071e906001600160a01b031681565b610766610bd13660046152c9565b61250e565b60065461071e906001600160a01b031681565b610766610bf736600461535c565b612535565b61071e61255d565b610766601f5481565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b610c47610c423660046152c9565b6125bd565b6040805194855260208501939093529183015260608201526080016106ee565b610766610c75366004615375565b61260f565b61076660095481565b610784610c913660046154d7565b612638565b610ca9610ca43660046152c9565b612e64565b6040516106ee919061555b565b610766601d5481565b61076660135481565b610784610cd63660046152c9565b612f0a565b6107666212750081565b610766613056565b610784610cfb3660046155b9565b613068565b601b54610766565b610749610d163660046152c9565b61312c565b610766610d29366004615375565b613252565b610abf6207a12081565b61076660125481565b61076660185481565b610766610d5836600461535c565b613284565b610784610d6b3660046155ff565b613297565b61071e610d7e36600461535c565b61333a565b61097b610d913660046152c9565b61336a565b61076660175481565b610784610dad36600461561a565b6133cd565b610784610dc036600461564f565b6133e9565b602054610abf90700100000000000000000000000000000000900463ffffffff1681565b610766610df73660046152c9565b60236020526000908152604090205481565b6106d7610e17366004615671565b6133fb565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b610766613697565b610784610e59366004615712565b6136a4565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610e92611fe4565b610e9a611672565b610ea2610fa9565b925092509250909192565b600080610eb86136b7565b610ec183613731565b91509150915091565b600060035460001480610ede575042600354145b15610ee95750600090565b6000610ef361196c565b905080600003610f0557600091505090565b60045460008054600354919291620f4240916301e1338091670de0b6b3a76400009163ffffffff1690610f389042615769565b610f42919061577c565b610f4c919061577c565b610f56908661577c565b610f6091906157a9565b610f6a91906157a9565b610f7491906157bd565b90506000610f8283836157a9565b9050670de0b6b3a7640000610f97848361577c565b610fa191906157a9565b935050505090565b6005546006546040517face1798e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000929190911690819063ace1798e906024016020604051808303816000875af1158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b91906157d0565b91505090565b611049611ff6565b6001600160a01b0316336001600160a01b03161461109b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b6110a3613829565b506010805461ff0019166101001790556000805463ffffffff19166207a120178155600a819055600e55565b8080156110f457506110df611599565b6001600160a01b0316336001600160a01b0316145b806111175750611102611ff6565b6001600160a01b0316336001600160a01b0316145b6111635760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401611092565b6010805460ff1916911515919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663175e1a7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa91906157e9565b905090565b6000611209610eca565b6001546111fa91906157bd565b60006111fa613829565b6001600160a01b03811660009081526021602052604081206003015460ff16600481111561125057611250615545565b92915050565b61125e613a47565b61126781613abf565b611272816003613b0a565b50565b61127d611ff6565b6001600160a01b0316336001600160a01b0316146112ca5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6112d2611176565b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038381166024830152919091169063954fa5ee906044016020604051808303816000875af115801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f91906157d0565b5050565b60006111fa601154613dfe565b60008061137c836125bd565b5090959194509092505050565b6007546001600160a01b0316156113a2576113a2615806565b600580546001600160a01b0394851673ffffffffffffffffffffffffffffffffffffffff19918216179091556007805493851693821693909317909255600680549190931691161790556010805461ff001916905542600f55565b611405611ff6565b6001600160a01b0316336001600160a01b0316146114525760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6714d1120d7b16000081111580156114725750670f43fc2c04ee00008110155b6114be5760405162461bcd60e51b815260206004820152601d60248201527f4d43522063616e6e6f74206265203e20434352206f72203c20313130250000006044820152606401611092565b600855565b6114cb611ff6565b6001600160a01b0316336001600160a01b0316146115185760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b61152061196c565b81116115945760405162461bcd60e51b815260206004820152603c60248201527f6e6577206d61782073797374656d2064656274206d757374206265206772656160448201527f746572207468616e2063757272656e742073797374656d2064656274000000006064820152608401611092565b600e55565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b6000611250611606611703565b83613e19565b61163060405180606001604052806000815260200160008152602001600081525090565b506001600160a01b0316600090815260226020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b600061167c610eca565b600154601e54601b5461168f91906157bd565b61169991906157bd565b6111fa91906157bd565b6001600160a01b038216600090815260226020526040812060020154670de0b6b3a7640000906116d1612056565b6116db9190615769565b6116e5908461577c565b6116ef91906157a9565b9392505050565b6000611250611606613697565b60006111fa611710613e2e565b613e7e565b61171d611ff6565b6001600160a01b0316336001600160a01b03161461176a5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6117a1613a47565b6117ab8686613e99565b601a5484156117c6576117be8582615769565b601a81905590505b601354601455601d546117d98483615769565b6117e391906157bd565b60158190556014546040517f51bf4c63ec3cba9d03d43238abbdd979dd91bd16d9895c74ceea9118c7baaf6092611821928252602082015260400190565b60405180910390a161183282614012565b6040517f20c582be0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528981166024830152604482018690527f000000000000000000000000000000000000000000000000000000000000000016906320c582be90606401600060405180830381600087803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b505050506118ff888461402c565b5050505050505050565b6024818154811061191957600080fd5b6000918252602090912001546001600160a01b0316905081565b61193b613a47565b6001600160a01b038216600090815260236020526040812080548392906119639084906157bd565b90915550505050565b6000601e54601b546111fa91906157bd565b601054600090819060ff16156119d65760405162461bcd60e51b815260206004820152601160248201527f436f6c6c61746572616c205061757365640000000000000000000000000000006044820152606401611092565b6119de6136b7565b601054610100900460ff1615611a365760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74206f70656e207768696c652073756e73657474696e67000000006044820152606401611092565b601b546001600160a01b03891660009081526021602052604090206001600382015460ff166004811115611a6c57611a6c615545565b03611ab95760405162461bcd60e51b815260206004820152601c60248201527f426f72726f7765724f70733a2054726f766520697320616374697665000000006044820152606401611092565b60038101805460ff191660019081179091558101899055878155611adc8a61409c565b611ae581614131565b6007546040517f46f7cf870000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018b9052898116604483015288811660648301529296509116906346f7cf8790608401600060405180830381600087803b158015611b5e57600080fd5b505af1158015611b72573d6000803e3d6000fd5b5050505060248a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055506001602480549050611bd19190615769565b60038201805470ffffffffffffffffffffffffffffffff0019166101006fffffffffffffffffffffffffffffffff841602179055601a54909350611c16908a906157bd565b601a556000611c2589846157bd565b9050600e54601e5482611c3891906157bd565b1115611c865760405162461bcd60e51b815260206004820152601d60248201527f436f6c6c61746572616c2064656274206c696d697420726561636865640000006044820152606401611092565b601b5550919890975095505050505050565b611ca0613829565b50611caa81613731565b50506000611cb7826125bd565b505050905061135f3383836141b0565b3360009081526023602052604090205480611d245760405162461bcd60e51b815260206004820181905260248201527f4e6f20636f6c6c61746572616c20617661696c61626c6520746f20636c61696d6044820152606401611092565b3360009081526023602052604081205560065461135f906001600160a01b0316838361438f565b601054610100900460ff1615611da35760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206368616e67652061667465722073756e7365740000000000006044820152606401611092565b6714d1120d7b1600008211158015611dc35750670f43fc2c04ee00008210155b611e0f5760405162461bcd60e51b815260206004820152601d60248201527f4d43522063616e6e6f74206265203e20434352206f72203c20313130250000006044820152606401611092565b60095415611e6c57611e1f611ff6565b6001600160a01b0316336001600160a01b031614611e6c5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b670d8f91d067414d888810158015611e8c5750670de07829b2adec288811155b611e9857611e98615806565b858711158015611eb05750670de0b6b3a76400008611155b611ebc57611ebc615806565b838511158015611ed45750670de0b6b3a76400008411155b611ee057611ee0615806565b611eee600a620f424061581c565b63ffffffff168163ffffffff161115611f0957611f09615806565b611f11613829565b50611f1a61440f565b50600997909755600a95909555600b93909355600c91909155600d55600e556008556000805463ffffffff191663ffffffff909216919091179055565b6000611f616124ae565b6040517fe12f3a610000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063e12f3a6190602401602060405180830381865afa158015611fc0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa91906157d0565b6000601d54601a546111fa91906157bd565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b60006003546000148061206a575042600354145b15612076575060025490565b600061208061196c565b90508060000361209257505060025490565b60045460008054600354919291620f4240916301e1338091670de0b6b3a76400009163ffffffff16906120c59042615769565b6120cf908861577c565b6120d9919061577c565b6120e3919061577c565b6120ed91906157a9565b6120f791906157a9565b61210191906157bd565b905061210d82826157a9565b60025461211a91906157bd565b9250505090565b612129611ff6565b6001600160a01b0316336001600160a01b0316146121765760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b601054610100900460ff166121cd5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420696e2073756e73657474696e670000000000000000000000000000006044820152606401611092565b6024546001146122455760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920666f72636520746f20636c6f7365206c6173742074726f60448201527f76650000000000000000000000000000000000000000000000000000000000006064820152608401611092565b6000602460008154811061225b5761225b61583f565b60009182526020822001546001600160a01b0316915061227d82610d29610fa9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b620115d6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156122e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230591906157d0565b9050670de0b6b3a764000082108061231e575060085481105b6123905760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c7920666f72636520636c6f73652062616420626f72726f776560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401611092565b60008061239c85611370565b9150915060006123ac86836116a3565b905081601b546123bc9190615769565b601b55601a546123cd908490615769565b601a556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639dc29fac3361240a84866157bd565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561246857600080fd5b505af115801561247c573d6000803e3d6000fd5b5050505061248a338461402c565b61249386613abf565b61249e866002613b0a565b6124a6614462565b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b600080600061251c84611370565b91509150600061252c83836144b9565b95945050505050565b600061253f6136b7565b600061254961440f565b90506116ef61255782613e7e565b84613e19565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b6001600160a01b0381166000908152602160205260408120805460018201549092909181906125eb8661312c565b935091506125f983866157bd565b945061260582856157bd565b9350509193509193565b600080600061261d85611370565b91509150600061262e8383876144ef565b9695505050505050565b6000600760009054906101000a90046001600160a01b031690506126a16040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600a5483101580156126b55750600b548311155b6127015760405162461bcd60e51b815260206004820152601460248201527f4d61782066656520302e352520746f20313030250000000000000000000000006044820152606401611092565b62127500600f5461271291906157bd565b4210156127615760405162461bcd60e51b815260206004820152601060248201527f424f4f5453545241505f504552494f44000000000000000000000000000000006044820152606401611092565b612769613829565b50612772610fa9565b8160e001818152505060006008549050807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b620115d6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280791906157d0565b10156128555760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742072656465656d207768656e20544352203c204d4352000000006044820152606401611092565b60008a116128a55760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401611092565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201528a907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294891906157d0565b10156129965760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401611092565b61299e611672565b61010083015289825260e08201516000906129bd9085908c9085614522565b156129c9575088612ae1565b836001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2b91906157e9565b90505b6001600160a01b03811615801590612a52575081612a50828560e0015161260f565b105b15612ae1576040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015285169063b72703ac90602401602060405180830381865afa158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada91906157e9565b9050612a2e565b85600003612aef5760001995505b6001600160a01b03811615801590612b075750825115155b8015612b135750600086115b15612c4a5785612b2281615855565b6040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152919850600092509086169063b72703ac90602401602060405180830381865afa158015612b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bad91906157e9565b9050612bb882613731565b50506000612bd3868487600001518860e001518f8f8f61468d565b9050806060015115612be6575050612c4a565b80516020860151612bf791906157bd565b6020808701919091528101516040860151612c1291906157bd565b6040808701919091528101516060860151612c2d91906157bd565b606086015280518551612c409190615769565b8552509050612aef565b6000836040015111612c9e5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f2072656465656d20616e7920616d6f756e7400000000006044820152606401611092565b612cb683604001518460e00151856101000151614a43565b50601054610100900460ff16612ce057612cdb612cd1611363565b8460400151614ad7565b612ce3565b60005b608084018190526040840151612cfa919087614b48565b612d0f612d0561255d565b846080015161402c565b82608001518360400151612d239190615769565b8360a00181815250507fc8f82a388a36012a2cfc586d40688baa3fe0112eff350cfd00b7e4dddaf6a5a48b8460200151856040015186606001518760800151604051612d91959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a16020830151604051632770a7eb60e21b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b5050506020840151601b54612e309250615769565b601b556060830151612e4190614012565b612e4f338460a0015161402c565b612e57614462565b5050505050505050505050565b612e6c615274565b6001600160a01b038216600090815260216020908152604091829020825160a081018452815481526001820154928101929092526002810154928201929092526003820154909190606083019060ff166004811115612ecd57612ecd615545565b6004811115612ede57612ede615545565b81526003919091015461010090046fffffffffffffffffffffffffffffffff1660209091015292915050565b612f12611ff6565b6001600160a01b0316336001600160a01b031614612f5f5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6000612f69611f57565b905060008111612fbb5760405162461bcd60e51b815260206004820152601360248201527f6e6f20636c61696d61626c6520616d6f756e74000000000000000000000000006044820152606401611092565b612fc36124ae565b6040517faad3ec960000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063aad3ec96906044016020604051808303816000875af115801561302d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305191906157d0565b505050565b60006111fa613063613e2e565b613dfe565b6130706136b7565b60016001600160a01b03851660009081526021602052604090206003015460ff1660048111156130a2576130a2615545565b146130ef5760405162461bcd60e51b815260206004820152601e60248201527f54726f766520636c6f736564206f7220646f6573206e6f7420657869737400006044820152606401611092565b6130f884613abf565b613103846002613b0a565b80601b546131119190615769565b601b5561311e838361402c565b613126614462565b50505050565b6001600160a01b038116600090815260226020908152604080832081516060810183528154808252600183015494820194909452600290910154918101919091526016548392839161317e9190615769565b9050600082602001516017546131949190615769565b90506131a081836157bd565b15806131dc575060016001600160a01b03871660009081526021602052604090206003015460ff1660048111156131d9576131d9615545565b14155b156131ef57506000958695509350505050565b6001600160a01b038616600090815260216020526040902060020154670de0b6b3a764000061321e848361577c565b61322891906157a9565b670de0b6b3a764000061323b848461577c565b61324591906157a9565b9550955050505050915091565b600080600061326085611370565b91509150600061262e8361327488856116a3565b61327e90856157bd565b876144ef565b6000611250613291613056565b83614ad7565b61329f611ff6565b6001600160a01b0316336001600160a01b0316146132ec5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6132fa600a620f424061581c565b63ffffffff168163ffffffff16111561331557613315615806565b61331d613829565b506000805463ffffffff191663ffffffff92909216919091179055565b60006024828154811061334f5761334f61583f565b6000918252602090912001546001600160a01b031692915050565b600060016001600160a01b03831660009081526021602052604090206003015460ff16600481111561339e5761339e615545565b146133ab57506000919050565b506016546001600160a01b039091166000908152602260205260409020541090565b6133d5613a47565b6133df8383614bb9565b613051838261402c565b6133f1613a47565b61135f8282614c50565b60008060006134086136b7565b888061341157508b5b156134c15760105460ff16156134695760405162461bcd60e51b815260206004820152601160248201527f436f6c6c61746572616c205061757365640000000000000000000000000000006044820152606401611092565b601054610100900460ff16156134c15760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420696e637265617365207768696c652073756e73657474696e676044820152606401611092565b6001600160a01b03851660009081526021602052604090206001600382015460ff1660048111156134f4576134f4615545565b146135415760405162461bcd60e51b815260206004820152601e60248201527f54726f766520636c6f736564206f7220646f6573206e6f7420657869737400006044820152606401611092565b80548c15613585578d1561356b576135598c826157bd565b9050613566868d8f614cad565b613581565b6135758c82615769565b9050613581868e614bb9565b8082555b60018201548a156135d6578b156135b8576135a08b826157bd565b90508a601a546135b091906157bd565b601a556135ce565b6135c28b82615769565b90506135ce878c61402c565b600183018190555b60006135e282846144b9565b6007546040517f2be212600000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018490528e811660448301528d81166064830152929350911690632be2126090608401600060405180830381600087803b15801561365b57600080fd5b505af115801561366f573d6000803e3d6000fd5b50505050818361367e86614131565b9650965096505050505099509950999650505050505050565b60006111fa601154613e7e565b6136ac6136b7565b6130518383836141b0565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461372f5760405162461bcd60e51b815260206004820152600d60248201527f43616c6c6572206e6f7420424f000000000000000000000000000000000000006044820152606401611092565b565b6001600160a01b038116600090815260216020526040812081906001600382015460ff16600481111561376657613766615545565b03613818576000806137778661312c565b915091508183600101600082825461378f91906157bd565b90915550508254819084906000906137a89084906157bd565b909155506137b790508661409c565b6137c18183614c50565b856001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b846000015485600101548660020154600060405161380d9493929190615880565b60405180910390a250505b600181015490549094909350915050565b600060035460000361383f575042600355600090565b426003540361384e5750600090565b600061385861196c565b90508060000361386a57600091505090565b60045460008054600354919291620f4240916301e1338091670de0b6b3a76400009163ffffffff169061389d9042615769565b6138a7919061577c565b6138b1919061577c565b6138bb908661577c565b6138c591906157a9565b6138cf91906157a9565b6138d991906157bd565b42600355905060006138eb83836157a9565b90506138f7838261577c565b6139019083615769565b600481905550806002600082825461391991906157bd565b9091555060009050670de0b6b3a7640000613934858461577c565b61393e91906157a9565b9050806001600082825461395291906157bd565b90915550506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961398e61255d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b1580156139ee57600080fd5b505af1158015613a02573d6000803e3d6000fd5b505050507f611cce915d1d6bc3f524286d86e46b65211f2c87477a164d9247bf77b7b5bfdf81604051613a3791815260200190565b60405180910390a1509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461372f5760405162461bcd60e51b815260206004820152601760248201527f4e6f74204c69717569646174696f6e204d616e616765720000000000000000006044820152606401611092565b6001600160a01b038116600090815260216020526040902060020154601354613ae9908290615769565b601355506001600160a01b0316600090815260216020526040812060020155565b6024546001600160a01b038316600090815260216020526040902060038101805484919060ff19166001836004811115613b4657613b46615545565b0217905550600060018083018290558183556007546001600160a01b038781168452602260205260408420848155830193909355919091169083118015613bee57506001816001600160a01b031663de8fa4316040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec91906157d0565b115b15613d2757600382015461010090046fffffffffffffffffffffffffffffffff1660006024613c1e600187615769565b81548110613c2e57613c2e61583f565b600091825260209091200154602480546001600160a01b03909216925082916fffffffffffffffffffffffffffffffff8516908110613c6f57613c6f61583f565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0394851617905591831680825260218352604091829020600301805470ffffffffffffffffffffffffffffffff0019166101006fffffffffffffffffffffffffffffffff8816908102919091179091558251918252928101929092527f02b04ae5f7be9ca7c103293a2aa15f3c339d15d6eda53b721fef7b0e609c831a910160405180910390a150505b6024805480613d3857613d386158a2565b6000828152602090206000199082018101805473ffffffffffffffffffffffffffffffffffffffff191690550190556040517f29092d0e0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528216906329092d0e90602401600060405180830381600087803b158015613dc357600080fd5b505af1158015613dd7573d6000803e3d6000fd5b5050506003909201805470ffffffffffffffffffffffffffffffff00191690555050505050565b600061125082600a54613e1191906157bd565b600b54614dba565b6000670de0b6b3a76400006116e5838561577c565b600080603c60125442613e419190615769565b613e4b91906157a9565b90506000613e5b60095483614dd0565b9050670de0b6b3a764000081601154613e74919061577c565b61211a91906157a9565b600061125082600c54613e9191906157bd565b600d54614dba565b81600003613ea5575050565b601854600090613ebd670de0b6b3a76400008461577c565b613ec791906157bd565b90506000601954670de0b6b3a764000085613ee2919061577c565b613eec91906157bd565b6013549091506000613efe82856157a9565b90506000613f0c83856157a9565b9050613f18838361577c565b613f229086615769565b601855613f2f838261577c565b613f399085615769565b601955601654600090613f4d9084906157bd565b9050600082601754613f5f91906157bd565b6016839055601781905560408051848152602081018390529192507f9f8bc8ab0daf5bceef75ecfd2085d1fcc6548c657ea970d9a23a60610d0737e3910160405180910390a188601b6000828254613fb79190615769565b9250508190555088601e6000828254613fd091906157bd565b9250508190555087601d6000828254613fe991906157bd565b9250508190555087601a60008282546140029190615769565b9091555050505050505050505050565b80600160008282546140249190615769565b909155505050565b801561135f5780601a546140409190615769565b601a55604080516001600160a01b0384168152602081018390527f342693d2465f6f44931e41128424a0227e0cbc69d1c3917a839e6de71696d44c910160405180910390a160065461135f906001600160a01b0316838361438f565b60165460175460028054604080516060808201835286825260208083018781528385018681526001600160a01b038b166000908152602284528690209451855590516001850155519290950191909155815186815293840185905290830182905290917fe083b7310cc9f9afc538d812522bbf1964db34ca10a6a4ffa9713025f4b3297191015b60405180910390a150505050565b6000806141418360010154614e7b565b60028401805490829055601354919250906000908390614162908490615769565b61416c91906157bd565b60138190556040518181529091507f6bac5e0eb3c44eb03a60ab11ec3a2c051771616aecadbcfff2630aabae5203829060200160405180910390a150909392505050565b60006141bc83836116a3565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291925082917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015614240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061426491906157d0565b106142f057604051632770a7eb60e21b81526001600160a01b038581166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b1580156142d357600080fd5b505af11580156142e7573d6000803e3d6000fd5b50505050614335565b80601b600082825461430291906157bd565b90915550506001600160a01b0383166000908152602160205260408120805483929061432f9084906157bd565b90915550505b61433e81614012565b6143478361409c565b604080516001600160a01b038087168252851660208201529081018290527f9354b8667251c59add7ab06f5ee968ec12dd3768ab329ee3f26f90a142e23ba390606001614123565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613051908490614ec2565b60008061441a613e2e565b60118190556040518181529091507fc454ee9b76c52f782a256af821b857ca6e125d1e3333bcede402fec2bed9600c9060200160405180910390a161445d614faa565b919050565b60245460000361372f5760006003819055601381905560148190556015819055601681905560178190556002819055600481905560188190556019819055601a819055601b819055601d819055601e819055600155565b600081156144e657816144d568056bc75e2d631000008561577c565b6144df91906157a9565b9050611250565b50600019611250565b6000821561451757600083614504848761577c565b61450e91906157a9565b91506116ef9050565b506000199392505050565b60006001600160a01b03841615806145ba57506040517f5dbe47e80000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152861690635dbe47e890602401602060405180830381865afa158015614594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145b891906158b8565b155b806145cd5750816145cb858561260f565b105b156145da57506000614685565b6040517f765e01590000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526000919087169063765e015990602401602060405180830381865afa15801561463d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061466191906157e9565b90506001600160a01b038116158061468157508261467f828661260f565b105b9150505b949350505050565b6146ba60405180608001604052806000815260200160008152602001600081526020016000151581525090565b6001600160a01b038716600090815260216020526040812080549091906146e2908a906116a3565b9050808810156146fa57505060016060820152614a38565b6040830181905261474061470e828a615769565b835461473b907f000000000000000000000000000000000000000000000000000000000000000090615769565b614dba565b80845260408401518891670de0b6b3a76400009161475d916157bd565b614767919061577c565b61477191906157a9565b60208401528251825460009161478691615769565b905060008460200151846001015461479e9190615769565b90507f00000000000000000000000000000000000000000000000000000000000000008203614855576147d08b613abf565b6147db8b6004613b0a565b6148068b7f000000000000000000000000000000000000000000000000000000000000000083615000565b8a6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b600080600060036040516148489493929190615880565b60405180910390a2614a33565b600061486182846144b9565b9050600081881161487b576148768883615769565b614885565b6148858289615769565b90506601c6bf5263400081118061492457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663969c24526040518163ffffffff1660e01b8152600401602060405180830381865afa1580156148f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491991906157d0565b614922856150fe565b105b1561493c5750506001606086015250614a3892505050565b506040517f2be212600000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018390528a8116604483015289811660648301528e1690632be2126090608401600060405180830381600087803b1580156149b057600080fd5b505af11580156149c4573d6000803e3d6000fd5b50505083865550600185018290556149db85614131565b506149e58c61409c565b8b6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b848488600201546003604051614a299493929190615880565b60405180910390a2505b505050505b979650505050505050565b600080614a4e613e2e565b9050600083614a5d868861577c565b614a6791906157a9565b90506000614a766002836157a9565b614a8090846157bd565b9050614a9481670de0b6b3a7640000614dba565b60118190556040518181529091507fc454ee9b76c52f782a256af821b857ca6e125d1e3333bcede402fec2bed9600c9060200160405180910390a161262e614faa565b600080670de0b6b3a7640000614aed848661577c565b614af791906157a9565b90508281106116ef5760405162461bcd60e51b815260206004820152601f60248201527f46656520657863656564732072657475726e656420636f6c6c61746572616c006044820152606401611092565b600082614b5d670de0b6b3a76400008661577c565b614b6791906157a9565b9050818111156131265760405162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d0000006044820152606401611092565b604051632770a7eb60e21b81526001600160a01b038381166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b158015614c2357600080fd5b505af1158015614c37573d6000803e3d6000fd5b5050505080601b54614c499190615769565b601b555050565b81601e6000828254614c629190615769565b9250508190555081601b6000828254614c7b91906157bd565b9250508190555080601d6000828254614c949190615769565b9250508190555080601a600082825461196391906157bd565b600082601b54614cbd91906157bd565b9050600e54601e5482614cd091906157bd565b1115614d1e5760405162461bcd60e51b815260206004820152601d60248201527f436f6c6c61746572616c2064656274206c696d697420726561636865640000006044820152606401611092565b601b8190556040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018490527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b158015614da657600080fd5b505af11580156118ff573d6000803e3d6000fd5b6000818310614dc957816116ef565b5090919050565b6000631f540500821115614de657631f54050091505b81600003614dfd5750670de0b6b3a7640000611250565b670de0b6b3a764000083835b6001811115614e7157614e1d6002826158d5565b600003614e4257614e2e828361512a565b9150614e3b6002826157a9565b9050614e09565b614e4c828461512a565b9250614e58828361512a565b91506002614e67600183615769565b614e3b91906157a9565b61262e828461512a565b6015546000908190808203614e9257839150614ebb565b60145480614ea257614ea2615806565b81614ead828761577c565b614eb791906157a9565b9250505b5092915050565b6000614f17826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151619092919063ffffffff16565b9050805160001480614f38575080806020019051810190614f3891906158b8565b6130515760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611092565b600060125442614fba9190615769565b9050603c8110611272574260128190556040519081527f860f8d2f0c74dd487e89e2883e3b25b8159ce1e1b3433a291cba7b82c508f3bc9060200160405180910390a150565b604051632770a7eb60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b15801561508a57600080fd5b505af115801561509e573d6000803e3d6000fd5b5050505081601b546150b09190615769565b601b556001600160a01b038316600090815260236020526040812080548392906150db9084906157bd565b9250508190555080601a60008282546150f49190615769565b9091555050505050565b60006112507f000000000000000000000000000000000000000000000000000000000000000083615769565b600080615137838561577c565b9050670de0b6b3a764000061514d6002826157a9565b61515790836157bd565b61468591906157a9565b6060614685848460008585600080866001600160a01b03168587604051615188919061590d565b60006040518083038185875af1925050503d80600081146151c5576040519150601f19603f3d011682016040523d82523d6000602084013e6151ca565b606091505b5091509150614a38878383876060831561524557825160000361523e576001600160a01b0385163b61523e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611092565b5081614685565b614685838381511561525a5781518083602001fd5b8060405162461bcd60e51b81526004016110929190615929565b6040518060a00160405280600081526020016000815260200160008152602001600060048111156152a7576152a7615545565b8152600060209091015290565b6001600160a01b038116811461127257600080fd5b6000602082840312156152db57600080fd5b81356116ef816152b4565b801515811461127257600080fd5b60006020828403121561530657600080fd5b81356116ef816152e6565b60008060006060848603121561532657600080fd5b8335615331816152b4565b92506020840135615341816152b4565b91506040840135615351816152b4565b809150509250925092565b60006020828403121561536e57600080fd5b5035919050565b6000806040838503121561538857600080fd5b8235615393816152b4565b946020939093013593505050565b600080600080600080600060e0888a0312156153bc57600080fd5b87356153c7816152b4565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b60008060008060008060c0878903121561540f57600080fd5b863561541a816152b4565b9550602087013594506040870135935060608701359250608087013561543f816152b4565b915060a087013561544f816152b4565b809150509295509295509295565b803563ffffffff8116811461445d57600080fd5b600080600080600080600080610100898b03121561548e57600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c089013591506154c860e08a0161545d565b90509295985092959890939650565b600080600080600080600060e0888a0312156154f257600080fd5b873596506020880135615504816152b4565b95506040880135615514816152b4565b94506060880135615524816152b4565b9699959850939660808101359560a0820135955060c0909101359350915050565b634e487b7160e01b600052602160045260246000fd5b600060a08201905082518252602083015160208301526040830151604083015260608301516005811061559057615590615545565b806060840152506fffffffffffffffffffffffffffffffff608084015116608083015292915050565b600080600080608085870312156155cf57600080fd5b84356155da816152b4565b935060208501356155ea816152b4565b93969395505050506040820135916060013590565b60006020828403121561561157600080fd5b6116ef8261545d565b60008060006060848603121561562f57600080fd5b833561563a816152b4565b95602085013595506040909401359392505050565b6000806040838503121561566257600080fd5b50508035926020909101359150565b60008060008060008060008060006101208a8c03121561569057600080fd5b893561569b816152e6565b985060208a0135975060408a0135965060608a01356156b9816152e6565b955060808a0135945060a08a01356156d0816152b4565b935060c08a01356156e0816152b4565b925060e08a01356156f0816152b4565b91506101008a0135615701816152b4565b809150509295985092959850929598565b60008060006060848603121561572757600080fd5b8335615732816152b4565b92506020840135615742816152b4565b929592945050506040919091013590565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125057611250615753565b808202811582820484141761125057611250615753565b634e487b7160e01b600052601260045260246000fd5b6000826157b8576157b8615793565b500490565b8082018082111561125057611250615753565b6000602082840312156157e257600080fd5b5051919050565b6000602082840312156157fb57600080fd5b81516116ef816152b4565b634e487b7160e01b600052600160045260246000fd5b600063ffffffff8084168061583357615833615793565b92169190910492915050565b634e487b7160e01b600052603260045260246000fd5b60008161586457615864615753565b506000190190565b6004811061587c5761587c615545565b9052565b84815260208101849052604081018390526080810161252c606083018461586c565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156158ca57600080fd5b81516116ef816152e6565b6000826158e4576158e4615793565b500690565b60005b838110156159045781810151838201526020016158ec565b50506000910152565b6000825161591f8184602087016158e9565b9190910192915050565b60208152600082518060208401526159488160408501602087016158e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea2646970667358221220b03b8793918e3250da9cd822642cf4508b703a17c543726c000c9a06b413161e64736f6c63430008130033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106106ca5760003560e01c80637eb18bbc1161037c578063bcd37526116101de578063d5b356351161010f578063ebe2b12b116100ad578063f2b6db5111610087578063f2b6db5114610e1c578063f36b242514610e43578063f962fa3b14610e4b578063fe9d032314610e5e57600080fd5b8063ebe2b12b14610dc5578063ec38a05d14610de9578063f158c80914610e0957600080fd5b8063e2ac77b0116100e9578063e2ac77b014610d83578063e47cf0c314610d96578063e9186c9414610d9f578063eb3007fd14610db257600080fd5b8063d5b3563514610d4a578063d8a0c92714610d5d578063d9a7244414610d7057600080fd5b8063c9a4cbf11161017c578063d293c71011610156578063d293c71014610d1b578063d30612e114610d2e578063d380a37c14610d38578063d38b055814610d4157600080fd5b8063c9a4cbf114610ced578063d128080c14610d00578063d12ae84114610d0857600080fd5b8063bf9befb1116101b8578063bf9befb114610cbf578063c2d94aec14610cc8578063c35bc55014610cdb578063c52861f214610ce557600080fd5b8063bcd3752614610c83578063bd28c0f414610c96578063be2c377b14610cb657600080fd5b80639d8dc8fa116102b8578063b2f29d7b11610256578063b7f8cf9b11610230578063b7f8cf9b14610c0d578063b91af97c14610c34578063ba8dd56214610c67578063bc006c3814610c7a57600080fd5b8063b2f29d7b14610be9578063b3f0067414610bfc578063b4997a1f14610c0457600080fd5b8063ad5c464811610292578063ad5c464814610ba8578063ae91875414610bb0578063b0d8e18114610bc3578063b2016bd414610bd657600080fd5b80639d8dc8fa14610b885780639ed7254214610b90578063a20baee614610b9957600080fd5b80638da5cb5b116103255780639484fb8e116102ff5780639484fb8e14610b5c57806396660b1814610b6e57806396d711ff14610b775780639d31b71214610b8057600080fd5b80638da5cb5b14610b4257806390fb8bb114610b4a57806391245f9f14610b5357600080fd5b806384de387f1161035657806384de387f14610b1f57806386ad29aa14610b32578063887105d314610b3a57600080fd5b80637eb18bbc14610af0578063807d138d14610b035780638235b28414610b0c57600080fd5b80634056d9fc1161053057806366ca4a211161046157806378e97925116103ff5780637b0a47ee116103d95780637b0a47ee14610a725780637c3a00fd14610aaf5780637da0b1fa14610ad45780637e95d66414610ae757600080fd5b806378e9792514610a3a578063794e572414610a61578063795d26c314610a6a57600080fd5b8063741bef1a1161043b578063741bef1a146109ee5780637541ae1b14610a01578063756b253e14610a14578063789c6b9314610a2757600080fd5b806366ca4a21146109ca578063720fbe2c146109d2578063724e78da146109db57600080fd5b80634ba4a28b116104ce5780635733d58f116104a85780635733d58f1461095f5780635c975abb1461096e578063631203b01461098b57806364cee2601461099e57600080fd5b80634ba4a28b1461091d5780635429c9421461094457806355ca38cf1461094c57600080fd5b80634820fe561161050a5780634820fe56146108d05780634870dd9a146108d857806349eefeee146108e05780634b269bf9146108e857600080fd5b80634056d9fc146108ac578063452a9320146108b5578063477d66cf146108bd57600080fd5b8063205b410a1161060a5780632b2b2bac116105a857806333d53b591161058257806333d53b591461086a578063363bf96414610873578063385a128f1461088657806338b681431461089957600080fd5b80632b2b2bac146108455780632f5c83a81461085857806331c7a2611461086157600080fd5b806325019ee9116105e457806325019ee91461080e578063272b13231461082157806328fc4465146108345780632b11551a1461083d57600080fd5b8063205b410a146107ea57806320d17d7b146107f257806321e37801146107fb57600080fd5b806316c38b3c116106775780631e897901116106515780631e897901146107a95780631ef3a04c146107b15780631f68f20a146107d85780631fd865d7146107e157600080fd5b806316c38b3c14610786578063175e1a7d1461079957806319d82163146107a157600080fd5b80630fd5d747116106a85780630fd5d7471461075e5780630fdb11cf146107745780631289fefb1461077c57600080fd5b806301c799fc146106cf578063086ce520146106f75780630b07655714610736575b600080fd5b6106d7610e85565b604080519384526020840192909252908201526060015b60405180910390f35b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016106ee565b6107496107443660046152c9565b610ead565b604080519283526020830191909152016106ee565b610766610eca565b6040519081526020016106ee565b610766610fa9565b610784611041565b005b6107846107943660046152f4565b6110cf565b61071e611176565b6107666111ff565b610766611216565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b61076660115481565b61076660035481565b600154610766565b610766601e5481565b6107666108093660046152c9565b611220565b61078461081c3660046152c9565b611256565b61078461082f3660046152c9565b611275565b61076660025481565b610766611363565b6107496108533660046152c9565b611370565b610766600e5481565b610766600c5481565b61076660165481565b610784610881366004615311565b611389565b61078461089436600461535c565b6113fd565b6107846108a736600461535c565b6114c3565b610766600d5481565b61071e611599565b6107666108cb36600461535c565b6115f9565b601a54610766565b61076660c881565b602454610766565b6108fb6108f63660046152c9565b61160c565b60408051825181526020808401519082015291810151908201526060016106ee565b6107667f000000000000000000000000000000000000000000000000000000000000000081565b610766611672565b61076661095a366004615375565b6116a3565b6107666714d1120d7b16000081565b60105461097b9060ff1681565b60405190151581526020016106ee565b61076661099936600461535c565b6116f6565b6107666109ac3660046152c9565b6001600160a01b031660009081526021602052604090206002015490565b610766611703565b610766600f5481565b6107846109e93660046152c9565b611715565b60055461071e906001600160a01b031681565b610784610a0f3660046153a1565b611799565b61071e610a2236600461535c565b611909565b610784610a35366004615375565b611933565b6107667f000000000000000000000000000000000000000000000000000000000000000081565b61076660085481565b61076661196c565b602054610a8e906fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff90911681526020016106ee565b600054610abf9063ffffffff1681565b60405163ffffffff90911681526020016106ee565b610749610ae23660046153f6565b61197e565b610766600a5481565b610784610afe3660046152c9565b611c98565b61076660145481565b610784610b1a3660046152c9565b611cc7565b610784610b2d366004615471565b611d4b565b610766611f57565b610766611fe4565b61071e611ff6565b61076660045481565b610766600b5481565b60105461097b90610100900460ff1681565b610766601c5481565b61076660155481565b610766612056565b610784612121565b61076660195481565b610766670de0b6b3a764000081565b61071e6124ae565b60075461071e906001600160a01b031681565b610766610bd13660046152c9565b61250e565b60065461071e906001600160a01b031681565b610766610bf736600461535c565b612535565b61071e61255d565b610766601f5481565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b610c47610c423660046152c9565b6125bd565b6040805194855260208501939093529183015260608201526080016106ee565b610766610c75366004615375565b61260f565b61076660095481565b610784610c913660046154d7565b612638565b610ca9610ca43660046152c9565b612e64565b6040516106ee919061555b565b610766601d5481565b61076660135481565b610784610cd63660046152c9565b612f0a565b6107666212750081565b610766613056565b610784610cfb3660046155b9565b613068565b601b54610766565b610749610d163660046152c9565b61312c565b610766610d29366004615375565b613252565b610abf6207a12081565b61076660125481565b61076660185481565b610766610d5836600461535c565b613284565b610784610d6b3660046155ff565b613297565b61071e610d7e36600461535c565b61333a565b61097b610d913660046152c9565b61336a565b61076660175481565b610784610dad36600461561a565b6133cd565b610784610dc036600461564f565b6133e9565b602054610abf90700100000000000000000000000000000000900463ffffffff1681565b610766610df73660046152c9565b60236020526000908152604090205481565b6106d7610e17366004615671565b6133fb565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b610766613697565b610784610e59366004615712565b6136a4565b61071e7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610e92611fe4565b610e9a611672565b610ea2610fa9565b925092509250909192565b600080610eb86136b7565b610ec183613731565b91509150915091565b600060035460001480610ede575042600354145b15610ee95750600090565b6000610ef361196c565b905080600003610f0557600091505090565b60045460008054600354919291620f4240916301e1338091670de0b6b3a76400009163ffffffff1690610f389042615769565b610f42919061577c565b610f4c919061577c565b610f56908661577c565b610f6091906157a9565b610f6a91906157a9565b610f7491906157bd565b90506000610f8283836157a9565b9050670de0b6b3a7640000610f97848361577c565b610fa191906157a9565b935050505090565b6005546006546040517face1798e0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000929190911690819063ace1798e906024016020604051808303816000875af1158015611017573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103b91906157d0565b91505090565b611049611ff6565b6001600160a01b0316336001600160a01b03161461109b5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064015b60405180910390fd5b6110a3613829565b506010805461ff0019166101001790556000805463ffffffff19166207a120178155600a819055600e55565b8080156110f457506110df611599565b6001600160a01b0316336001600160a01b0316145b806111175750611102611ff6565b6001600160a01b0316336001600160a01b0316145b6111635760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f72697a656400000000000000000000000000000000000000006044820152606401611092565b6010805460ff1916911515919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663175e1a7d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa91906157e9565b905090565b6000611209610eca565b6001546111fa91906157bd565b60006111fa613829565b6001600160a01b03811660009081526021602052604081206003015460ff16600481111561125057611250615545565b92915050565b61125e613a47565b61126781613abf565b611272816003613b0a565b50565b61127d611ff6565b6001600160a01b0316336001600160a01b0316146112ca5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6112d2611176565b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038381166024830152919091169063954fa5ee906044016020604051808303816000875af115801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f91906157d0565b5050565b60006111fa601154613dfe565b60008061137c836125bd565b5090959194509092505050565b6007546001600160a01b0316156113a2576113a2615806565b600580546001600160a01b0394851673ffffffffffffffffffffffffffffffffffffffff19918216179091556007805493851693821693909317909255600680549190931691161790556010805461ff001916905542600f55565b611405611ff6565b6001600160a01b0316336001600160a01b0316146114525760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6714d1120d7b16000081111580156114725750670f43fc2c04ee00008110155b6114be5760405162461bcd60e51b815260206004820152601d60248201527f4d43522063616e6e6f74206265203e20434352206f72203c20313130250000006044820152606401611092565b600855565b6114cb611ff6565b6001600160a01b0316336001600160a01b0316146115185760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b61152061196c565b81116115945760405162461bcd60e51b815260206004820152603c60248201527f6e6577206d61782073797374656d2064656274206d757374206265206772656160448201527f746572207468616e2063757272656e742073797374656d2064656274000000006064820152608401611092565b600e55565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b6000611250611606611703565b83613e19565b61163060405180606001604052806000815260200160008152602001600081525090565b506001600160a01b0316600090815260226020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b600061167c610eca565b600154601e54601b5461168f91906157bd565b61169991906157bd565b6111fa91906157bd565b6001600160a01b038216600090815260226020526040812060020154670de0b6b3a7640000906116d1612056565b6116db9190615769565b6116e5908461577c565b6116ef91906157a9565b9392505050565b6000611250611606613697565b60006111fa611710613e2e565b613e7e565b61171d611ff6565b6001600160a01b0316336001600160a01b03161461176a5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6005805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6117a1613a47565b6117ab8686613e99565b601a5484156117c6576117be8582615769565b601a81905590505b601354601455601d546117d98483615769565b6117e391906157bd565b60158190556014546040517f51bf4c63ec3cba9d03d43238abbdd979dd91bd16d9895c74ceea9118c7baaf6092611821928252602082015260400190565b60405180910390a161183282614012565b6040517f20c582be0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528981166024830152604482018690527f000000000000000000000000000000000000000000000000000000000000000016906320c582be90606401600060405180830381600087803b1580156118dd57600080fd5b505af11580156118f1573d6000803e3d6000fd5b505050506118ff888461402c565b5050505050505050565b6024818154811061191957600080fd5b6000918252602090912001546001600160a01b0316905081565b61193b613a47565b6001600160a01b038216600090815260236020526040812080548392906119639084906157bd565b90915550505050565b6000601e54601b546111fa91906157bd565b601054600090819060ff16156119d65760405162461bcd60e51b815260206004820152601160248201527f436f6c6c61746572616c205061757365640000000000000000000000000000006044820152606401611092565b6119de6136b7565b601054610100900460ff1615611a365760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74206f70656e207768696c652073756e73657474696e67000000006044820152606401611092565b601b546001600160a01b03891660009081526021602052604090206001600382015460ff166004811115611a6c57611a6c615545565b03611ab95760405162461bcd60e51b815260206004820152601c60248201527f426f72726f7765724f70733a2054726f766520697320616374697665000000006044820152606401611092565b60038101805460ff191660019081179091558101899055878155611adc8a61409c565b611ae581614131565b6007546040517f46f7cf870000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018b9052898116604483015288811660648301529296509116906346f7cf8790608401600060405180830381600087803b158015611b5e57600080fd5b505af1158015611b72573d6000803e3d6000fd5b5050505060248a9080600181540180825580915050600190039060005260206000200160009091909190916101000a8154816001600160a01b0302191690836001600160a01b031602179055506001602480549050611bd19190615769565b60038201805470ffffffffffffffffffffffffffffffff0019166101006fffffffffffffffffffffffffffffffff841602179055601a54909350611c16908a906157bd565b601a556000611c2589846157bd565b9050600e54601e5482611c3891906157bd565b1115611c865760405162461bcd60e51b815260206004820152601d60248201527f436f6c6c61746572616c2064656274206c696d697420726561636865640000006044820152606401611092565b601b5550919890975095505050505050565b611ca0613829565b50611caa81613731565b50506000611cb7826125bd565b505050905061135f3383836141b0565b3360009081526023602052604090205480611d245760405162461bcd60e51b815260206004820181905260248201527f4e6f20636f6c6c61746572616c20617661696c61626c6520746f20636c61696d6044820152606401611092565b3360009081526023602052604081205560065461135f906001600160a01b0316838361438f565b601054610100900460ff1615611da35760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206368616e67652061667465722073756e7365740000000000006044820152606401611092565b6714d1120d7b1600008211158015611dc35750670f43fc2c04ee00008210155b611e0f5760405162461bcd60e51b815260206004820152601d60248201527f4d43522063616e6e6f74206265203e20434352206f72203c20313130250000006044820152606401611092565b60095415611e6c57611e1f611ff6565b6001600160a01b0316336001600160a01b031614611e6c5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b670d8f91d067414d888810158015611e8c5750670de07829b2adec288811155b611e9857611e98615806565b858711158015611eb05750670de0b6b3a76400008611155b611ebc57611ebc615806565b838511158015611ed45750670de0b6b3a76400008411155b611ee057611ee0615806565b611eee600a620f424061581c565b63ffffffff168163ffffffff161115611f0957611f09615806565b611f11613829565b50611f1a61440f565b50600997909755600a95909555600b93909355600c91909155600d55600e556008556000805463ffffffff191663ffffffff909216919091179055565b6000611f616124ae565b6040517fe12f3a610000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063e12f3a6190602401602060405180830381865afa158015611fc0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa91906157d0565b6000601d54601a546111fa91906157bd565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b60006003546000148061206a575042600354145b15612076575060025490565b600061208061196c565b90508060000361209257505060025490565b60045460008054600354919291620f4240916301e1338091670de0b6b3a76400009163ffffffff16906120c59042615769565b6120cf908861577c565b6120d9919061577c565b6120e3919061577c565b6120ed91906157a9565b6120f791906157a9565b61210191906157bd565b905061210d82826157a9565b60025461211a91906157bd565b9250505090565b612129611ff6565b6001600160a01b0316336001600160a01b0316146121765760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b601054610100900460ff166121cd5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420696e2073756e73657474696e670000000000000000000000000000006044820152606401611092565b6024546001146122455760405162461bcd60e51b815260206004820152602260248201527f43616e206f6e6c7920666f72636520746f20636c6f7365206c6173742074726f60448201527f76650000000000000000000000000000000000000000000000000000000000006064820152608401611092565b6000602460008154811061225b5761225b61583f565b60009182526020822001546001600160a01b0316915061227d82610d29610fa9565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b620115d6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156122e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230591906157d0565b9050670de0b6b3a764000082108061231e575060085481105b6123905760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c7920666f72636520636c6f73652062616420626f72726f776560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401611092565b60008061239c85611370565b9150915060006123ac86836116a3565b905081601b546123bc9190615769565b601b55601a546123cd908490615769565b601a556001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639dc29fac3361240a84866157bd565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561246857600080fd5b505af115801561247c573d6000803e3d6000fd5b5050505061248a338461402c565b61249386613abf565b61249e866002613b0a565b6124a6614462565b505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b600080600061251c84611370565b91509150600061252c83836144b9565b95945050505050565b600061253f6136b7565b600061254961440f565b90506116ef61255782613e7e565b84613e19565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b3f006746040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d6573d6000803e3d6000fd5b6001600160a01b0381166000908152602160205260408120805460018201549092909181906125eb8661312c565b935091506125f983866157bd565b945061260582856157bd565b9350509193509193565b600080600061261d85611370565b91509150600061262e8383876144ef565b9695505050505050565b6000600760009054906101000a90046001600160a01b031690506126a16040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600a5483101580156126b55750600b548311155b6127015760405162461bcd60e51b815260206004820152601460248201527f4d61782066656520302e352520746f20313030250000000000000000000000006044820152606401611092565b62127500600f5461271291906157bd565b4210156127615760405162461bcd60e51b815260206004820152601060248201527f424f4f5453545241505f504552494f44000000000000000000000000000000006044820152606401611092565b612769613829565b50612772610fa9565b8160e001818152505060006008549050807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b620115d6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156127e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061280791906157d0565b10156128555760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742072656465656d207768656e20544352203c204d4352000000006044820152606401611092565b60008a116128a55760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401611092565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201528a907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612924573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061294891906157d0565b10156129965760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401611092565b61299e611672565b61010083015289825260e08201516000906129bd9085908c9085614522565b156129c9575088612ae1565b836001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2b91906157e9565b90505b6001600160a01b03811615801590612a52575081612a50828560e0015161260f565b105b15612ae1576040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015285169063b72703ac90602401602060405180830381865afa158015612ab6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ada91906157e9565b9050612a2e565b85600003612aef5760001995505b6001600160a01b03811615801590612b075750825115155b8015612b135750600086115b15612c4a5785612b2281615855565b6040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152919850600092509086169063b72703ac90602401602060405180830381865afa158015612b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bad91906157e9565b9050612bb882613731565b50506000612bd3868487600001518860e001518f8f8f61468d565b9050806060015115612be6575050612c4a565b80516020860151612bf791906157bd565b6020808701919091528101516040860151612c1291906157bd565b6040808701919091528101516060860151612c2d91906157bd565b606086015280518551612c409190615769565b8552509050612aef565b6000836040015111612c9e5760405162461bcd60e51b815260206004820152601b60248201527f556e61626c6520746f2072656465656d20616e7920616d6f756e7400000000006044820152606401611092565b612cb683604001518460e00151856101000151614a43565b50601054610100900460ff16612ce057612cdb612cd1611363565b8460400151614ad7565b612ce3565b60005b608084018190526040840151612cfa919087614b48565b612d0f612d0561255d565b846080015161402c565b82608001518360400151612d239190615769565b8360a00181815250507fc8f82a388a36012a2cfc586d40688baa3fe0112eff350cfd00b7e4dddaf6a5a48b8460200151856040015186606001518760800151604051612d91959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a16020830151604051632770a7eb60e21b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b5050506020840151601b54612e309250615769565b601b556060830151612e4190614012565b612e4f338460a0015161402c565b612e57614462565b5050505050505050505050565b612e6c615274565b6001600160a01b038216600090815260216020908152604091829020825160a081018452815481526001820154928101929092526002810154928201929092526003820154909190606083019060ff166004811115612ecd57612ecd615545565b6004811115612ede57612ede615545565b81526003919091015461010090046fffffffffffffffffffffffffffffffff1660209091015292915050565b612f12611ff6565b6001600160a01b0316336001600160a01b031614612f5f5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6000612f69611f57565b905060008111612fbb5760405162461bcd60e51b815260206004820152601360248201527f6e6f20636c61696d61626c6520616d6f756e74000000000000000000000000006044820152606401611092565b612fc36124ae565b6040517faad3ec960000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063aad3ec96906044016020604051808303816000875af115801561302d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305191906157d0565b505050565b60006111fa613063613e2e565b613dfe565b6130706136b7565b60016001600160a01b03851660009081526021602052604090206003015460ff1660048111156130a2576130a2615545565b146130ef5760405162461bcd60e51b815260206004820152601e60248201527f54726f766520636c6f736564206f7220646f6573206e6f7420657869737400006044820152606401611092565b6130f884613abf565b613103846002613b0a565b80601b546131119190615769565b601b5561311e838361402c565b613126614462565b50505050565b6001600160a01b038116600090815260226020908152604080832081516060810183528154808252600183015494820194909452600290910154918101919091526016548392839161317e9190615769565b9050600082602001516017546131949190615769565b90506131a081836157bd565b15806131dc575060016001600160a01b03871660009081526021602052604090206003015460ff1660048111156131d9576131d9615545565b14155b156131ef57506000958695509350505050565b6001600160a01b038616600090815260216020526040902060020154670de0b6b3a764000061321e848361577c565b61322891906157a9565b670de0b6b3a764000061323b848461577c565b61324591906157a9565b9550955050505050915091565b600080600061326085611370565b91509150600061262e8361327488856116a3565b61327e90856157bd565b876144ef565b6000611250613291613056565b83614ad7565b61329f611ff6565b6001600160a01b0316336001600160a01b0316146132ec5760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b6044820152606401611092565b6132fa600a620f424061581c565b63ffffffff168163ffffffff16111561331557613315615806565b61331d613829565b506000805463ffffffff191663ffffffff92909216919091179055565b60006024828154811061334f5761334f61583f565b6000918252602090912001546001600160a01b031692915050565b600060016001600160a01b03831660009081526021602052604090206003015460ff16600481111561339e5761339e615545565b146133ab57506000919050565b506016546001600160a01b039091166000908152602260205260409020541090565b6133d5613a47565b6133df8383614bb9565b613051838261402c565b6133f1613a47565b61135f8282614c50565b60008060006134086136b7565b888061341157508b5b156134c15760105460ff16156134695760405162461bcd60e51b815260206004820152601160248201527f436f6c6c61746572616c205061757365640000000000000000000000000000006044820152606401611092565b601054610100900460ff16156134c15760405162461bcd60e51b815260206004820181905260248201527f43616e6e6f7420696e637265617365207768696c652073756e73657474696e676044820152606401611092565b6001600160a01b03851660009081526021602052604090206001600382015460ff1660048111156134f4576134f4615545565b146135415760405162461bcd60e51b815260206004820152601e60248201527f54726f766520636c6f736564206f7220646f6573206e6f7420657869737400006044820152606401611092565b80548c15613585578d1561356b576135598c826157bd565b9050613566868d8f614cad565b613581565b6135758c82615769565b9050613581868e614bb9565b8082555b60018201548a156135d6578b156135b8576135a08b826157bd565b90508a601a546135b091906157bd565b601a556135ce565b6135c28b82615769565b90506135ce878c61402c565b600183018190555b60006135e282846144b9565b6007546040517f2be212600000000000000000000000000000000000000000000000000000000081526001600160a01b038c81166004830152602482018490528e811660448301528d81166064830152929350911690632be2126090608401600060405180830381600087803b15801561365b57600080fd5b505af115801561366f573d6000803e3d6000fd5b50505050818361367e86614131565b9650965096505050505099509950999650505050505050565b60006111fa601154613e7e565b6136ac6136b7565b6130518383836141b0565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461372f5760405162461bcd60e51b815260206004820152600d60248201527f43616c6c6572206e6f7420424f000000000000000000000000000000000000006044820152606401611092565b565b6001600160a01b038116600090815260216020526040812081906001600382015460ff16600481111561376657613766615545565b03613818576000806137778661312c565b915091508183600101600082825461378f91906157bd565b90915550508254819084906000906137a89084906157bd565b909155506137b790508661409c565b6137c18183614c50565b856001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b846000015485600101548660020154600060405161380d9493929190615880565b60405180910390a250505b600181015490549094909350915050565b600060035460000361383f575042600355600090565b426003540361384e5750600090565b600061385861196c565b90508060000361386a57600091505090565b60045460008054600354919291620f4240916301e1338091670de0b6b3a76400009163ffffffff169061389d9042615769565b6138a7919061577c565b6138b1919061577c565b6138bb908661577c565b6138c591906157a9565b6138cf91906157a9565b6138d991906157bd565b42600355905060006138eb83836157a9565b90506138f7838261577c565b6139019083615769565b600481905550806002600082825461391991906157bd565b9091555060009050670de0b6b3a7640000613934858461577c565b61393e91906157a9565b9050806001600082825461395291906157bd565b90915550506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166340c10f1961398e61255d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b1580156139ee57600080fd5b505af1158015613a02573d6000803e3d6000fd5b505050507f611cce915d1d6bc3f524286d86e46b65211f2c87477a164d9247bf77b7b5bfdf81604051613a3791815260200190565b60405180910390a1509392505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461372f5760405162461bcd60e51b815260206004820152601760248201527f4e6f74204c69717569646174696f6e204d616e616765720000000000000000006044820152606401611092565b6001600160a01b038116600090815260216020526040902060020154601354613ae9908290615769565b601355506001600160a01b0316600090815260216020526040812060020155565b6024546001600160a01b038316600090815260216020526040902060038101805484919060ff19166001836004811115613b4657613b46615545565b0217905550600060018083018290558183556007546001600160a01b038781168452602260205260408420848155830193909355919091169083118015613bee57506001816001600160a01b031663de8fa4316040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec91906157d0565b115b15613d2757600382015461010090046fffffffffffffffffffffffffffffffff1660006024613c1e600187615769565b81548110613c2e57613c2e61583f565b600091825260209091200154602480546001600160a01b03909216925082916fffffffffffffffffffffffffffffffff8516908110613c6f57613c6f61583f565b6000918252602080832091909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0394851617905591831680825260218352604091829020600301805470ffffffffffffffffffffffffffffffff0019166101006fffffffffffffffffffffffffffffffff8816908102919091179091558251918252928101929092527f02b04ae5f7be9ca7c103293a2aa15f3c339d15d6eda53b721fef7b0e609c831a910160405180910390a150505b6024805480613d3857613d386158a2565b6000828152602090206000199082018101805473ffffffffffffffffffffffffffffffffffffffff191690550190556040517f29092d0e0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528216906329092d0e90602401600060405180830381600087803b158015613dc357600080fd5b505af1158015613dd7573d6000803e3d6000fd5b5050506003909201805470ffffffffffffffffffffffffffffffff00191690555050505050565b600061125082600a54613e1191906157bd565b600b54614dba565b6000670de0b6b3a76400006116e5838561577c565b600080603c60125442613e419190615769565b613e4b91906157a9565b90506000613e5b60095483614dd0565b9050670de0b6b3a764000081601154613e74919061577c565b61211a91906157a9565b600061125082600c54613e9191906157bd565b600d54614dba565b81600003613ea5575050565b601854600090613ebd670de0b6b3a76400008461577c565b613ec791906157bd565b90506000601954670de0b6b3a764000085613ee2919061577c565b613eec91906157bd565b6013549091506000613efe82856157a9565b90506000613f0c83856157a9565b9050613f18838361577c565b613f229086615769565b601855613f2f838261577c565b613f399085615769565b601955601654600090613f4d9084906157bd565b9050600082601754613f5f91906157bd565b6016839055601781905560408051848152602081018390529192507f9f8bc8ab0daf5bceef75ecfd2085d1fcc6548c657ea970d9a23a60610d0737e3910160405180910390a188601b6000828254613fb79190615769565b9250508190555088601e6000828254613fd091906157bd565b9250508190555087601d6000828254613fe991906157bd565b9250508190555087601a60008282546140029190615769565b9091555050505050505050505050565b80600160008282546140249190615769565b909155505050565b801561135f5780601a546140409190615769565b601a55604080516001600160a01b0384168152602081018390527f342693d2465f6f44931e41128424a0227e0cbc69d1c3917a839e6de71696d44c910160405180910390a160065461135f906001600160a01b0316838361438f565b60165460175460028054604080516060808201835286825260208083018781528385018681526001600160a01b038b166000908152602284528690209451855590516001850155519290950191909155815186815293840185905290830182905290917fe083b7310cc9f9afc538d812522bbf1964db34ca10a6a4ffa9713025f4b3297191015b60405180910390a150505050565b6000806141418360010154614e7b565b60028401805490829055601354919250906000908390614162908490615769565b61416c91906157bd565b60138190556040518181529091507f6bac5e0eb3c44eb03a60ab11ec3a2c051771616aecadbcfff2630aabae5203829060200160405180910390a150909392505050565b60006141bc83836116a3565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291925082917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015614240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061426491906157d0565b106142f057604051632770a7eb60e21b81526001600160a01b038581166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b1580156142d357600080fd5b505af11580156142e7573d6000803e3d6000fd5b50505050614335565b80601b600082825461430291906157bd565b90915550506001600160a01b0383166000908152602160205260408120805483929061432f9084906157bd565b90915550505b61433e81614012565b6143478361409c565b604080516001600160a01b038087168252851660208201529081018290527f9354b8667251c59add7ab06f5ee968ec12dd3768ab329ee3f26f90a142e23ba390606001614123565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613051908490614ec2565b60008061441a613e2e565b60118190556040518181529091507fc454ee9b76c52f782a256af821b857ca6e125d1e3333bcede402fec2bed9600c9060200160405180910390a161445d614faa565b919050565b60245460000361372f5760006003819055601381905560148190556015819055601681905560178190556002819055600481905560188190556019819055601a819055601b819055601d819055601e819055600155565b600081156144e657816144d568056bc75e2d631000008561577c565b6144df91906157a9565b9050611250565b50600019611250565b6000821561451757600083614504848761577c565b61450e91906157a9565b91506116ef9050565b506000199392505050565b60006001600160a01b03841615806145ba57506040517f5dbe47e80000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152861690635dbe47e890602401602060405180830381865afa158015614594573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145b891906158b8565b155b806145cd5750816145cb858561260f565b105b156145da57506000614685565b6040517f765e01590000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301526000919087169063765e015990602401602060405180830381865afa15801561463d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061466191906157e9565b90506001600160a01b038116158061468157508261467f828661260f565b105b9150505b949350505050565b6146ba60405180608001604052806000815260200160008152602001600081526020016000151581525090565b6001600160a01b038716600090815260216020526040812080549091906146e2908a906116a3565b9050808810156146fa57505060016060820152614a38565b6040830181905261474061470e828a615769565b835461473b907f000000000000000000000000000000000000000000000000000000000000000090615769565b614dba565b80845260408401518891670de0b6b3a76400009161475d916157bd565b614767919061577c565b61477191906157a9565b60208401528251825460009161478691615769565b905060008460200151846001015461479e9190615769565b90507f00000000000000000000000000000000000000000000000000000000000000008203614855576147d08b613abf565b6147db8b6004613b0a565b6148068b7f000000000000000000000000000000000000000000000000000000000000000083615000565b8a6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b600080600060036040516148489493929190615880565b60405180910390a2614a33565b600061486182846144b9565b9050600081881161487b576148768883615769565b614885565b6148858289615769565b90506601c6bf5263400081118061492457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663969c24526040518163ffffffff1660e01b8152600401602060405180830381865afa1580156148f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491991906157d0565b614922856150fe565b105b1561493c5750506001606086015250614a3892505050565b506040517f2be212600000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018390528a8116604483015289811660648301528e1690632be2126090608401600060405180830381600087803b1580156149b057600080fd5b505af11580156149c4573d6000803e3d6000fd5b50505083865550600185018290556149db85614131565b506149e58c61409c565b8b6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b848488600201546003604051614a299493929190615880565b60405180910390a2505b505050505b979650505050505050565b600080614a4e613e2e565b9050600083614a5d868861577c565b614a6791906157a9565b90506000614a766002836157a9565b614a8090846157bd565b9050614a9481670de0b6b3a7640000614dba565b60118190556040518181529091507fc454ee9b76c52f782a256af821b857ca6e125d1e3333bcede402fec2bed9600c9060200160405180910390a161262e614faa565b600080670de0b6b3a7640000614aed848661577c565b614af791906157a9565b90508281106116ef5760405162461bcd60e51b815260206004820152601f60248201527f46656520657863656564732072657475726e656420636f6c6c61746572616c006044820152606401611092565b600082614b5d670de0b6b3a76400008661577c565b614b6791906157a9565b9050818111156131265760405162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d0000006044820152606401611092565b604051632770a7eb60e21b81526001600160a01b038381166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b158015614c2357600080fd5b505af1158015614c37573d6000803e3d6000fd5b5050505080601b54614c499190615769565b601b555050565b81601e6000828254614c629190615769565b9250508190555081601b6000828254614c7b91906157bd565b9250508190555080601d6000828254614c949190615769565b9250508190555080601a600082825461196391906157bd565b600082601b54614cbd91906157bd565b9050600e54601e5482614cd091906157bd565b1115614d1e5760405162461bcd60e51b815260206004820152601d60248201527f436f6c6c61746572616c2064656274206c696d697420726561636865640000006044820152606401611092565b601b8190556040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018490527f000000000000000000000000000000000000000000000000000000000000000016906340c10f1990604401600060405180830381600087803b158015614da657600080fd5b505af11580156118ff573d6000803e3d6000fd5b6000818310614dc957816116ef565b5090919050565b6000631f540500821115614de657631f54050091505b81600003614dfd5750670de0b6b3a7640000611250565b670de0b6b3a764000083835b6001811115614e7157614e1d6002826158d5565b600003614e4257614e2e828361512a565b9150614e3b6002826157a9565b9050614e09565b614e4c828461512a565b9250614e58828361512a565b91506002614e67600183615769565b614e3b91906157a9565b61262e828461512a565b6015546000908190808203614e9257839150614ebb565b60145480614ea257614ea2615806565b81614ead828761577c565b614eb791906157a9565b9250505b5092915050565b6000614f17826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166151619092919063ffffffff16565b9050805160001480614f38575080806020019051810190614f3891906158b8565b6130515760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611092565b600060125442614fba9190615769565b9050603c8110611272574260128190556040519081527f860f8d2f0c74dd487e89e2883e3b25b8159ce1e1b3433a291cba7b82c508f3bc9060200160405180910390a150565b604051632770a7eb60e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac90604401600060405180830381600087803b15801561508a57600080fd5b505af115801561509e573d6000803e3d6000fd5b5050505081601b546150b09190615769565b601b556001600160a01b038316600090815260236020526040812080548392906150db9084906157bd565b9250508190555080601a60008282546150f49190615769565b9091555050505050565b60006112507f000000000000000000000000000000000000000000000000000000000000000083615769565b600080615137838561577c565b9050670de0b6b3a764000061514d6002826157a9565b61515790836157bd565b61468591906157a9565b6060614685848460008585600080866001600160a01b03168587604051615188919061590d565b60006040518083038185875af1925050503d80600081146151c5576040519150601f19603f3d011682016040523d82523d6000602084013e6151ca565b606091505b5091509150614a38878383876060831561524557825160000361523e576001600160a01b0385163b61523e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611092565b5081614685565b614685838381511561525a5781518083602001fd5b8060405162461bcd60e51b81526004016110929190615929565b6040518060a00160405280600081526020016000815260200160008152602001600060048111156152a7576152a7615545565b8152600060209091015290565b6001600160a01b038116811461127257600080fd5b6000602082840312156152db57600080fd5b81356116ef816152b4565b801515811461127257600080fd5b60006020828403121561530657600080fd5b81356116ef816152e6565b60008060006060848603121561532657600080fd5b8335615331816152b4565b92506020840135615341816152b4565b91506040840135615351816152b4565b809150509250925092565b60006020828403121561536e57600080fd5b5035919050565b6000806040838503121561538857600080fd5b8235615393816152b4565b946020939093013593505050565b600080600080600080600060e0888a0312156153bc57600080fd5b87356153c7816152b4565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b60008060008060008060c0878903121561540f57600080fd5b863561541a816152b4565b9550602087013594506040870135935060608701359250608087013561543f816152b4565b915060a087013561544f816152b4565b809150509295509295509295565b803563ffffffff8116811461445d57600080fd5b600080600080600080600080610100898b03121561548e57600080fd5b883597506020890135965060408901359550606089013594506080890135935060a0890135925060c089013591506154c860e08a0161545d565b90509295985092959890939650565b600080600080600080600060e0888a0312156154f257600080fd5b873596506020880135615504816152b4565b95506040880135615514816152b4565b94506060880135615524816152b4565b9699959850939660808101359560a0820135955060c0909101359350915050565b634e487b7160e01b600052602160045260246000fd5b600060a08201905082518252602083015160208301526040830151604083015260608301516005811061559057615590615545565b806060840152506fffffffffffffffffffffffffffffffff608084015116608083015292915050565b600080600080608085870312156155cf57600080fd5b84356155da816152b4565b935060208501356155ea816152b4565b93969395505050506040820135916060013590565b60006020828403121561561157600080fd5b6116ef8261545d565b60008060006060848603121561562f57600080fd5b833561563a816152b4565b95602085013595506040909401359392505050565b6000806040838503121561566257600080fd5b50508035926020909101359150565b60008060008060008060008060006101208a8c03121561569057600080fd5b893561569b816152e6565b985060208a0135975060408a0135965060608a01356156b9816152e6565b955060808a0135945060a08a01356156d0816152b4565b935060c08a01356156e0816152b4565b925060e08a01356156f0816152b4565b91506101008a0135615701816152b4565b809150509295985092959850929598565b60008060006060848603121561572757600080fd5b8335615732816152b4565b92506020840135615742816152b4565b929592945050506040919091013590565b634e487b7160e01b600052601160045260246000fd5b8181038181111561125057611250615753565b808202811582820484141761125057611250615753565b634e487b7160e01b600052601260045260246000fd5b6000826157b8576157b8615793565b500490565b8082018082111561125057611250615753565b6000602082840312156157e257600080fd5b5051919050565b6000602082840312156157fb57600080fd5b81516116ef816152b4565b634e487b7160e01b600052600160045260246000fd5b600063ffffffff8084168061583357615833615793565b92169190910492915050565b634e487b7160e01b600052603260045260246000fd5b60008161586457615864615753565b506000190190565b6004811061587c5761587c615545565b9052565b84815260208101849052604081018390526080810161252c606083018461586c565b634e487b7160e01b600052603160045260246000fd5b6000602082840312156158ca57600080fd5b81516116ef816152e6565b6000826158e4576158e4615793565b500690565b60005b838110156159045781810151838201526020016158ec565b50506000910152565b6000825161591f8184602087016158e9565b9190910192915050565b60208152600082518060208401526159488160408501602087016158e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fea2646970667358221220b03b8793918e3250da9cd822642cf4508b703a17c543726c000c9a06b413161e64736f6c63430008130033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "getEntireDebtAndColl(address)": {
        "details": "Used by the liquidation manager"
      },
      "getTroveCollAndDebt(address)": {
        "details": "Also includes pending rewards from redistribution"
      },
      "setPaused(bool)": {
        "params": {
          "_paused": "If true the protocol is paused"
        }
      },
      "setPriceFeed(address)": {
        "params": {
          "_priceFeedAddress": "Price feed address"
        }
      }
    },
    "title": "Propel Trove Manager",
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "claimCollateral(address)": {
        "notice": "Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode"
      },
      "getEntireDebtAndColl(address)": {
        "notice": "Get the total and pending collateral and debt amounts for a trove"
      },
      "getTroveCollAndDebt(address)": {
        "notice": "Get the current total collateral and debt amounts for a trove"
      },
      "setPaused(bool)": {
        "notice": "Sets the pause state for this trove manager         Pausing is used to mitigate risks in exceptional circumstances         Functionalities affected by pausing are:         - New borrowing is not possible         - New collateral deposits are not possible"
      },
      "setPriceFeed(address)": {
        "notice": "Sets a custom price feed for this trove manager"
      }
    },
    "notice": "Based on Liquity's `TroveManager` https://github.com/liquity/dev/blob/main/packages/contracts/contracts/TroveManager.sol Propel's implementation is modified so that multiple `TroveManager` and `SortedTroves` contracts are deployed in tandem, with each pair managing troves of a single collateral type. Functionality related to liquidations has been moved to `LiquidationManager`. This was necessary to avoid the restriction on deployed bytecode size.",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 9555,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "interestRate",
        "offset": 0,
        "slot": "0",
        "type": "t_uint32"
      },
      {
        "astId": 9557,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "outstandingInterestDebt",
        "offset": 0,
        "slot": "1",
        "type": "t_uint256"
      },
      {
        "astId": 9559,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "L_Interest_Debt",
        "offset": 0,
        "slot": "2",
        "type": "t_uint256"
      },
      {
        "astId": 9561,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "lastInterestDebtUpdateTime",
        "offset": 0,
        "slot": "3",
        "type": "t_uint256"
      },
      {
        "astId": 9563,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "lastInterestDebtError_Redistribution",
        "offset": 0,
        "slot": "4",
        "type": "t_uint256"
      },
      {
        "astId": 15362,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "priceFeed",
        "offset": 0,
        "slot": "5",
        "type": "t_contract(IPriceFeed)31045"
      },
      {
        "astId": 15365,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "collateralToken",
        "offset": 0,
        "slot": "6",
        "type": "t_contract(IERC20)1439"
      },
      {
        "astId": 15369,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "sortedTroves",
        "offset": 0,
        "slot": "7",
        "type": "t_contract(ISortedTroves)31980"
      },
      {
        "astId": 15371,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "MCR",
        "offset": 0,
        "slot": "8",
        "type": "t_uint256"
      },
      {
        "astId": 15385,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "minuteDecayFactor",
        "offset": 0,
        "slot": "9",
        "type": "t_uint256"
      },
      {
        "astId": 15387,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "redemptionFeeFloor",
        "offset": 0,
        "slot": "10",
        "type": "t_uint256"
      },
      {
        "astId": 15389,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "maxRedemptionFee",
        "offset": 0,
        "slot": "11",
        "type": "t_uint256"
      },
      {
        "astId": 15391,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "borrowingFeeFloor",
        "offset": 0,
        "slot": "12",
        "type": "t_uint256"
      },
      {
        "astId": 15393,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "maxBorrowingFee",
        "offset": 0,
        "slot": "13",
        "type": "t_uint256"
      },
      {
        "astId": 15395,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "maxSystemDebt",
        "offset": 0,
        "slot": "14",
        "type": "t_uint256"
      },
      {
        "astId": 15397,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "systemDeploymentTime",
        "offset": 0,
        "slot": "15",
        "type": "t_uint256"
      },
      {
        "astId": 15399,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "paused",
        "offset": 0,
        "slot": "16",
        "type": "t_bool"
      },
      {
        "astId": 15401,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "sunsetting",
        "offset": 1,
        "slot": "16",
        "type": "t_bool"
      },
      {
        "astId": 15403,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "baseRate",
        "offset": 0,
        "slot": "17",
        "type": "t_uint256"
      },
      {
        "astId": 15405,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "lastFeeOperationTime",
        "offset": 0,
        "slot": "18",
        "type": "t_uint256"
      },
      {
        "astId": 15407,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "totalStakes",
        "offset": 0,
        "slot": "19",
        "type": "t_uint256"
      },
      {
        "astId": 15409,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "totalStakesSnapshot",
        "offset": 0,
        "slot": "20",
        "type": "t_uint256"
      },
      {
        "astId": 15411,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "totalCollateralSnapshot",
        "offset": 0,
        "slot": "21",
        "type": "t_uint256"
      },
      {
        "astId": 15413,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "L_collateral",
        "offset": 0,
        "slot": "22",
        "type": "t_uint256"
      },
      {
        "astId": 15415,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "L_debt",
        "offset": 0,
        "slot": "23",
        "type": "t_uint256"
      },
      {
        "astId": 15417,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "lastCollateralError_Redistribution",
        "offset": 0,
        "slot": "24",
        "type": "t_uint256"
      },
      {
        "astId": 15419,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "lastDebtError_Redistribution",
        "offset": 0,
        "slot": "25",
        "type": "t_uint256"
      },
      {
        "astId": 15421,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "totalActiveCollateral",
        "offset": 0,
        "slot": "26",
        "type": "t_uint256"
      },
      {
        "astId": 15423,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "totalActiveDebt",
        "offset": 0,
        "slot": "27",
        "type": "t_uint256"
      },
      {
        "astId": 15425,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "interestPayable",
        "offset": 0,
        "slot": "28",
        "type": "t_uint256"
      },
      {
        "astId": 15427,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "defaultedCollateral",
        "offset": 0,
        "slot": "29",
        "type": "t_uint256"
      },
      {
        "astId": 15429,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "defaultedDebt",
        "offset": 0,
        "slot": "30",
        "type": "t_uint256"
      },
      {
        "astId": 15431,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "rewardIntegral",
        "offset": 0,
        "slot": "31",
        "type": "t_uint256"
      },
      {
        "astId": 15433,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "rewardRate",
        "offset": 0,
        "slot": "32",
        "type": "t_uint128"
      },
      {
        "astId": 15435,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "periodFinish",
        "offset": 16,
        "slot": "32",
        "type": "t_uint32"
      },
      {
        "astId": 15440,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "Troves",
        "offset": 0,
        "slot": "33",
        "type": "t_mapping(t_address,t_struct(Trove)32224_storage)"
      },
      {
        "astId": 15445,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "rewardSnapshots",
        "offset": 0,
        "slot": "34",
        "type": "t_mapping(t_address,t_struct(RewardSnapshot)32259_storage)"
      },
      {
        "astId": 15449,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "surplusBalances",
        "offset": 0,
        "slot": "35",
        "type": "t_mapping(t_address,t_uint256)"
      },
      {
        "astId": 15452,
        "contract": "contracts/core/TroveManager.sol:TroveManager",
        "label": "TroveOwners",
        "offset": 0,
        "slot": "36",
        "type": "t_array(t_address)dyn_storage"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_array(t_address)dyn_storage": {
        "base": "t_address",
        "encoding": "dynamic_array",
        "label": "address[]",
        "numberOfBytes": "32"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_contract(IERC20)1439": {
        "encoding": "inplace",
        "label": "contract IERC20",
        "numberOfBytes": "20"
      },
      "t_contract(IPriceFeed)31045": {
        "encoding": "inplace",
        "label": "contract IPriceFeed",
        "numberOfBytes": "20"
      },
      "t_contract(ISortedTroves)31980": {
        "encoding": "inplace",
        "label": "contract ISortedTroves",
        "numberOfBytes": "20"
      },
      "t_enum(Status)32270": {
        "encoding": "inplace",
        "label": "enum ITroveManager.Status",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_struct(RewardSnapshot)32259_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct ITroveManager.RewardSnapshot)",
        "numberOfBytes": "32",
        "value": "t_struct(RewardSnapshot)32259_storage"
      },
      "t_mapping(t_address,t_struct(Trove)32224_storage)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => struct ITroveManager.Trove)",
        "numberOfBytes": "32",
        "value": "t_struct(Trove)32224_storage"
      },
      "t_mapping(t_address,t_uint256)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => uint256)",
        "numberOfBytes": "32",
        "value": "t_uint256"
      },
      "t_struct(RewardSnapshot)32259_storage": {
        "encoding": "inplace",
        "label": "struct ITroveManager.RewardSnapshot",
        "members": [
          {
            "astId": 32254,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "collateral",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 32256,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "debt",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 32258,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "interest",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          }
        ],
        "numberOfBytes": "96"
      },
      "t_struct(Trove)32224_storage": {
        "encoding": "inplace",
        "label": "struct ITroveManager.Trove",
        "members": [
          {
            "astId": 32214,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "debt",
            "offset": 0,
            "slot": "0",
            "type": "t_uint256"
          },
          {
            "astId": 32216,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "coll",
            "offset": 0,
            "slot": "1",
            "type": "t_uint256"
          },
          {
            "astId": 32218,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "stake",
            "offset": 0,
            "slot": "2",
            "type": "t_uint256"
          },
          {
            "astId": 32221,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "status",
            "offset": 0,
            "slot": "3",
            "type": "t_enum(Status)32270"
          },
          {
            "astId": 32223,
            "contract": "contracts/core/TroveManager.sol:TroveManager",
            "label": "arrayIndex",
            "offset": 1,
            "slot": "3",
            "type": "t_uint128"
          }
        ],
        "numberOfBytes": "128"
      },
      "t_uint128": {
        "encoding": "inplace",
        "label": "uint128",
        "numberOfBytes": "16"
      },
      "t_uint256": {
        "encoding": "inplace",
        "label": "uint256",
        "numberOfBytes": "32"
      },
      "t_uint32": {
        "encoding": "inplace",
        "label": "uint32",
        "numberOfBytes": "4"
      }
    }
  }
}