{
  "address": "0x88978150c55Ea48b9EefFf78c240FCfA8F55dc87",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_borrowerOperationsAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasCompensation",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "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": "PERCENT_DIVISOR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "borrowerOperations",
      "outputs": [
        {
          "internalType": "contract IBorrowerOperations",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_coll",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "computeCR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_coll",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_debt",
          "type": "uint256"
        }
      ],
      "name": "computeNominalCR",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ITroveManager",
          "name": "troveManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_CR",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_numTrials",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_inputRandomSeed",
          "type": "uint256"
        }
      ],
      "name": "getApproxHint",
      "outputs": [
        {
          "internalType": "address",
          "name": "hintAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "diff",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "latestRandomSeed",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ITroveManager",
          "name": "troveManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_debtAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_maxIterations",
          "type": "uint256"
        }
      ],
      "name": "getRedemptionHints",
      "outputs": [
        {
          "internalType": "address",
          "name": "firstRedemptionHint",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "partialRedemptionHintNICR",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "truncatedDebtAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xbe00f7df5bb16ceaad078b69828498e32e43a342ccb6c653431da6da20c82aa6",
  "receipt": {
    "to": null,
    "from": "0xF1658C608708172655A8e70a1624c29F956Ee63D",
    "contractAddress": "0x88978150c55Ea48b9EefFf78c240FCfA8F55dc87",
    "transactionIndex": 3,
    "gasUsed": "850822",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x29c64635cc2a72224748ef081ea49b34880504b5079b38db3587431231e5918d",
    "transactionHash": "0xbe00f7df5bb16ceaad078b69828498e32e43a342ccb6c653431da6da20c82aa6",
    "logs": [],
    "blockNumber": 2166511,
    "cumulativeGasUsed": "1017858",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0xc5ED6Bd52c5Fb9C716Ef6Caf6a35b4f4B858bab5",
    "200000000000000000000"
  ],
  "numDeployments": 1,
  "solcInputHash": "a6d939c7ac4bb59822edb24b0d925d24",
  "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_borrowerOperationsAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasCompensation\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"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\":\"PERCENT_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"borrowerOperations\",\"outputs\":[{\"internalType\":\"contract IBorrowerOperations\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"}],\"name\":\"computeCR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_coll\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_debt\",\"type\":\"uint256\"}],\"name\":\"computeNominalCR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITroveManager\",\"name\":\"troveManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_CR\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numTrials\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_inputRandomSeed\",\"type\":\"uint256\"}],\"name\":\"getApproxHint\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"hintAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"diff\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"latestRandomSeed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITroveManager\",\"name\":\"troveManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_debtAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxIterations\",\"type\":\"uint256\"}],\"name\":\"getRedemptionHints\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"firstRedemptionHint\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"partialRedemptionHintNICR\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"truncatedDebtAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/helpers/MultiCollateralHintHelpers.sol\":\"MultiCollateralHintHelpers\"},\"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\"},\"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/helpers/MultiCollateralHintHelpers.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"../interfaces/IBorrowerOperations.sol\\\";\\nimport \\\"../interfaces/ITroveManager.sol\\\";\\nimport \\\"../interfaces/ISortedTroves.sol\\\";\\nimport \\\"../interfaces/IFactory.sol\\\";\\nimport \\\"../dependencies/PropelBase.sol\\\";\\nimport \\\"../dependencies/PropelMath.sol\\\";\\n\\ncontract MultiCollateralHintHelpers is PropelBase {\\n\\tIBorrowerOperations public immutable borrowerOperations;\\n\\n\\tconstructor(address _borrowerOperationsAddress, uint256 _gasCompensation) PropelBase(_gasCompensation) {\\n\\t\\tborrowerOperations = IBorrowerOperations(_borrowerOperationsAddress);\\n\\t}\\n\\n\\t// --- Functions ---\\n\\n\\t/* getRedemptionHints() - Helper function for finding the right hints to pass to redeemCollateral().\\n\\t *\\n\\t * It simulates a redemption of `_debtAmount` to figure out where the redemption sequence will start and what state the final Trove\\n\\t * of the sequence will end up in.\\n\\t *\\n\\t * Returns three hints:\\n\\t *  - `firstRedemptionHint` is the address of the first Trove with ICR >= MCR (i.e. the first Trove that will be redeemed).\\n\\t *  - `partialRedemptionHintNICR` is the final nominal ICR of the last Trove of the sequence after being hit by partial redemption,\\n\\t *     or zero in case of no partial redemption.\\n\\t *  - `truncatedDebtAmount` is the maximum amount that can be redeemed out of the the provided `_debtAmount`. This can be lower than\\n\\t *    `_debtAmount` when redeeming the full amount would leave the last Trove of the redemption sequence with less net debt than the\\n\\t *    minimum allowed value (i.e. MIN_NET_DEBT).\\n\\t *\\n\\t * The number of Troves to consider for redemption can be capped by passing a non-zero value as `_maxIterations`, while passing zero\\n\\t * will leave it uncapped.\\n\\t */\\n\\n\\tfunction getRedemptionHints(ITroveManager troveManager, uint256 _debtAmount, uint256 _price, uint256 _maxIterations) external view returns (address firstRedemptionHint, uint256 partialRedemptionHintNICR, uint256 truncatedDebtAmount) {\\n\\t\\tISortedTroves sortedTrovesCached = ISortedTroves(troveManager.sortedTroves());\\n\\n\\t\\tuint256 remainingDebt = _debtAmount;\\n\\t\\taddress currentTroveuser = sortedTrovesCached.getLast();\\n\\t\\tuint256 MCR = troveManager.MCR();\\n\\n\\t\\twhile (currentTroveuser != address(0) && troveManager.getRedemptionICR(currentTroveuser, _price) < MCR) {\\n\\t\\t\\tcurrentTroveuser = sortedTrovesCached.getPrev(currentTroveuser);\\n\\t\\t}\\n\\n\\t\\tfirstRedemptionHint = currentTroveuser;\\n\\n\\t\\tif (_maxIterations == 0) {\\n\\t\\t\\t_maxIterations = type(uint256).max;\\n\\t\\t}\\n\\n\\t\\tuint256 minNetDebt = borrowerOperations.minNetDebt();\\n\\t\\twhile (currentTroveuser != address(0) && remainingDebt > 0 && _maxIterations-- > 0) {\\n\\t\\t\\t(uint256 debt, uint256 coll, , ) = troveManager.getEntireDebtAndColl(currentTroveuser);\\n\\t\\t\\tuint256 interest = troveManager.getTroveInterest(currentTroveuser, debt);\\n\\t\\t\\tif (remainingDebt < interest) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tuint256 netDebt = _getNetDebt(debt);\\n\\t\\t\\tif (netDebt > remainingDebt - interest) {\\n\\t\\t\\t\\tif (netDebt > minNetDebt) {\\n\\t\\t\\t\\t\\tuint256 maxRedeemableDebt = PropelMath._min(remainingDebt - interest, netDebt - minNetDebt);\\n\\n\\t\\t\\t\\t\\tuint256 newColl = coll - (((maxRedeemableDebt + interest) * DECIMAL_PRECISION) / _price);\\n\\t\\t\\t\\t\\tuint256 newDebt = netDebt - maxRedeemableDebt;\\n\\n\\t\\t\\t\\t\\tuint256 compositeDebt = _getCompositeDebt(newDebt);\\n\\t\\t\\t\\t\\tpartialRedemptionHintNICR = PropelMath._computeNominalCR(newColl, compositeDebt);\\n\\n\\t\\t\\t\\t\\tremainingDebt = remainingDebt - maxRedeemableDebt;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tremainingDebt = remainingDebt - netDebt;\\n\\t\\t\\t}\\n\\n\\t\\t\\tcurrentTroveuser = sortedTrovesCached.getPrev(currentTroveuser);\\n\\t\\t}\\n\\n\\t\\ttruncatedDebtAmount = _debtAmount - remainingDebt;\\n\\t}\\n\\n\\t/* getApproxHint() - return address of a Trove that is, on average, (length / numTrials) positions away in the\\n    sortedTroves list from the correct insert position of the Trove to be inserted.\\n\\n    Note: The output address is worst-case O(n) positions away from the correct insert position, however, the function\\n    is probabilistic. Input can be tuned to guarantee results to a high degree of confidence, e.g:\\n\\n    Submitting numTrials = k * sqrt(length), with k = 15 makes it very, very likely that the ouput address will\\n    be <= sqrt(length) positions away from the correct insert position.\\n    */\\n\\tfunction getApproxHint(ITroveManager troveManager, uint256 _CR, uint256 _numTrials, uint256 _inputRandomSeed) external view returns (address hintAddress, uint256 diff, uint256 latestRandomSeed) {\\n\\t\\tISortedTroves sortedTroves = ISortedTroves(troveManager.sortedTroves());\\n\\t\\tuint256 arrayLength = troveManager.getTroveOwnersCount();\\n\\n\\t\\tif (arrayLength == 0) {\\n\\t\\t\\treturn (address(0), 0, _inputRandomSeed);\\n\\t\\t}\\n\\n\\t\\thintAddress = sortedTroves.getLast();\\n\\t\\tdiff = PropelMath._getAbsoluteDifference(_CR, troveManager.getNominalICR(hintAddress));\\n\\t\\tlatestRandomSeed = _inputRandomSeed;\\n\\n\\t\\tuint256 i = 1;\\n\\n\\t\\twhile (i < _numTrials) {\\n\\t\\t\\tlatestRandomSeed = uint256(keccak256(abi.encodePacked(latestRandomSeed)));\\n\\n\\t\\t\\tuint256 arrayIndex = latestRandomSeed % arrayLength;\\n\\t\\t\\taddress currentAddress = troveManager.getTroveFromTroveOwnersArray(arrayIndex);\\n\\t\\t\\tuint256 currentNICR = troveManager.getNominalICR(currentAddress);\\n\\n\\t\\t\\t// check if abs(current - CR) > abs(closest - CR), and update closest if current is closer\\n\\t\\t\\tuint256 currentDiff = PropelMath._getAbsoluteDifference(currentNICR, _CR);\\n\\n\\t\\t\\tif (currentDiff < diff) {\\n\\t\\t\\t\\tdiff = currentDiff;\\n\\t\\t\\t\\thintAddress = currentAddress;\\n\\t\\t\\t}\\n\\t\\t\\ti++;\\n\\t\\t}\\n\\t}\\n\\n\\tfunction computeNominalCR(uint256 _coll, uint256 _debt) external pure returns (uint256) {\\n\\t\\treturn PropelMath._computeNominalCR(_coll, _debt);\\n\\t}\\n\\n\\tfunction computeCR(uint256 _coll, uint256 _debt, uint256 _price) external pure returns (uint256) {\\n\\t\\treturn PropelMath._computeCR(_coll, _debt, _price);\\n\\t}\\n}\\n\",\"keccak256\":\"0x5a45978f0073d5984c1344152abebe2b5e7eca1dc0ac52ed2043b1052bb1a2a8\",\"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/IFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\ninterface IFactory {\\n\\t// commented values are suggested default parameters\\n\\tstruct DeploymentParams {\\n\\t\\tuint256 minuteDecayFactor; // 999037758833783000  (half life of 12 hours)\\n\\t\\tuint256 redemptionFeeFloor; // 1e18 / 1000 * 5  (0.5%)\\n\\t\\tuint256 maxRedemptionFee; // 1e18  (100%)\\n\\t\\tuint256 borrowingFeeFloor; // 1e18 / 1000 * 5  (0.5%)\\n\\t\\tuint256 maxBorrowingFee; // 1e18 / 100 * 5  (5%)\\n\\t\\tuint256 interestRateInBps; // 100 (1%)\\n\\t\\tuint256 maxDebt;\\n\\t\\tuint256 MCR; // 12 * 1e17  (120%)\\n\\t}\\n\\n\\tevent NewDeployment(address collateral, address priceFeed, address troveManager, address sortedTroves);\\n\\n\\tfunction deployNewInstance(address collateral, address priceFeed, address customTroveManagerImpl, address customSortedTrovesImpl, DeploymentParams calldata params) external;\\n\\n\\tfunction setImplementations(address _troveManagerImpl, address _sortedTrovesImpl) external;\\n\\n\\tfunction Propel_CORE() external view returns (address);\\n\\n\\tfunction borrowerOperations() external view returns (address);\\n\\n\\tfunction debtToken() external view returns (address);\\n\\n\\tfunction guardian() external view returns (address);\\n\\n\\tfunction liquidationManager() external view returns (address);\\n\\n\\tfunction owner() external view returns (address);\\n\\n\\tfunction sortedTrovesImpl() external view returns (address);\\n\\n\\tfunction stabilityPool() external view returns (address);\\n\\n\\tfunction troveManagerCount() external view returns (uint256);\\n\\n\\tfunction troveManagerImpl() external view returns (address);\\n\\n\\tfunction troveManagers(uint256) external view returns (address);\\n}\\n\",\"keccak256\":\"0x2e6c41a32d40629a0f5d4128b01a5801842010d1c10b509b686f788ff44a607d\",\"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/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\"}},\"version\":1}",
  "bytecode": "0x60c060405234801561001057600080fd5b50604051610f2d380380610f2d83398101604081905261002f91610043565b6080526001600160a01b031660a05261007d565b6000806040838503121561005657600080fd5b82516001600160a01b038116811461006d57600080fd5b6020939093015192949293505050565b60805160a051610e766100b76000396000818161015c015261043a01526000818161010001528181610b4e0152610b900152610e766000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c80635733d58f1161007657806377553ad41161005b57806377553ad414610157578063a20baee614610196578063c394a7fa146101a557600080fd5b80635733d58f14610135578063701526b41461014457600080fd5b8063301be459146100a85780634870dd9a146100e55780634ba4a28b146100fb578063525acdbb14610122575b600080fd5b6100bb6100b6366004610c57565b6101b8565b604080516001600160a01b0390941684526020840192909252908201526060015b60405180910390f35b6100ed60c881565b6040519081526020016100dc565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed610130366004610c92565b61078a565b6100ed6714d1120d7b16000081565b6100bb610152366004610c57565b6107a1565b61017e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100dc565b6100ed670de0b6b3a764000081565b6100ed6101b3366004610cbe565b610b32565b600080600080876001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102209190610ce0565b905060008790506000826001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028b9190610ce0565b905060008a6001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f19190610cfd565b90505b6001600160a01b0382161580159061039657506040517fba8dd5620000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018b90528291908d169063ba8dd56290604401602060405180830381865afa158015610370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103949190610cfd565b105b15610425576040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015285169063b72703ac90602401602060405180830381865afa1580156103fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041e9190610ce0565b91506102f4565b819650876000036104365760001997505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663969c24526040518163ffffffff1660e01b8152600401602060405180830381865afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba9190610cfd565b90505b6001600160a01b038316158015906104d55750600084115b80156104ec57506000896104e881610d45565b9a50115b1561076f576040517fb91af97c0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009182918f169063b91af97c90602401608060405180830381865afa158015610555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105799190610d5c565b50509150915060008e6001600160a01b03166355ca38cf87856040518363ffffffff1660e01b81526004016105c39291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa1580156105e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106049190610cfd565b9050808710156106165750505061076f565b600061062184610b47565b905061062d8289610d92565b8111156106d357848111156106ca57600061065a61064b848b610d92565b6106558885610d92565b610b73565b905060008f670de0b6b3a76400006106728685610da5565b61067c9190610db8565b6106869190610dfe565b6106909086610d92565b9050600061069e8385610d92565b905060006106ab82610b89565b90506106b78382610bb5565b9e506106c3848d610d92565b9b50505050505b5050505061076f565b6106dd8189610d92565b6040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152919950908a169063b72703ac90602401602060405180830381865afa158015610740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107649190610ce0565b9650505050506104bd565b610779848c610d92565b955050505050509450945094915050565b6000610797848484610beb565b90505b9392505050565b600080600080876001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190610ce0565b90506000886001600160a01b03166349eefeee6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f9190610cfd565b90508060000361088a57600080879450945094505050610b28565b816001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190610ce0565b6040517fb0d8e1810000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015291965061097e918a91908c169063b0d8e18190602401602060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190610cfd565b610c1c565b935085925060015b87811015610b2457604080516020810186905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120935060006109de8386610e12565b6040517fd9a72444000000000000000000000000000000000000000000000000000000008152600481018290529091506000906001600160a01b038d169063d9a7244490602401602060405180830381865afa158015610a42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a669190610ce0565b6040517fb0d8e1810000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000918e169063b0d8e18190602401602060405180830381865afa158015610acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aef9190610cfd565b90506000610afd828e610c1c565b905088811015610b0e578098508299505b84610b1881610e26565b95505050505050610986565b5050505b9450945094915050565b6000610b3e8383610bb5565b90505b92915050565b6000610b417f000000000000000000000000000000000000000000000000000000000000000083610d92565b6000818310610b825781610b3e565b5090919050565b6000610b417f000000000000000000000000000000000000000000000000000000000000000083610da5565b60008115610be25781610bd168056bc75e2d6310000085610db8565b610bdb9190610dfe565b9050610b41565b50600019610b41565b60008215610c1357600083610c008487610db8565b610c0a9190610dfe565b915061079a9050565b5060001961079a565b600081831015610c3557610c308383610d92565b610b3e565b610b3e8284610d92565b6001600160a01b0381168114610c5457600080fd5b50565b60008060008060808587031215610c6d57600080fd5b8435610c7881610c3f565b966020860135965060408601359560600135945092505050565b600080600060608486031215610ca757600080fd5b505081359360208301359350604090920135919050565b60008060408385031215610cd157600080fd5b50508035926020909101359150565b600060208284031215610cf257600080fd5b815161079a81610c3f565b600060208284031215610d0f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600081610d5457610d54610d16565b506000190190565b60008060008060808587031215610d7257600080fd5b505082516020840151604085015160609095015191969095509092509050565b81810381811115610b4157610b41610d16565b80820180821115610b4157610b41610d16565b8082028115828204841417610b4157610b41610d16565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610e0d57610e0d610dcf565b500490565b600082610e2157610e21610dcf565b500690565b60006000198203610e3957610e39610d16565b506001019056fea264697066735822122065e7ca56822670fca3beb59584b46536d99330a702fac5e77a4f3ddb06c7713e64736f6c63430008130033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a35760003560e01c80635733d58f1161007657806377553ad41161005b57806377553ad414610157578063a20baee614610196578063c394a7fa146101a557600080fd5b80635733d58f14610135578063701526b41461014457600080fd5b8063301be459146100a85780634870dd9a146100e55780634ba4a28b146100fb578063525acdbb14610122575b600080fd5b6100bb6100b6366004610c57565b6101b8565b604080516001600160a01b0390941684526020840192909252908201526060015b60405180910390f35b6100ed60c881565b6040519081526020016100dc565b6100ed7f000000000000000000000000000000000000000000000000000000000000000081565b6100ed610130366004610c92565b61078a565b6100ed6714d1120d7b16000081565b6100bb610152366004610c57565b6107a1565b61017e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100dc565b6100ed670de0b6b3a764000081565b6100ed6101b3366004610cbe565b610b32565b600080600080876001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102209190610ce0565b905060008790506000826001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028b9190610ce0565b905060008a6001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102f19190610cfd565b90505b6001600160a01b0382161580159061039657506040517fba8dd5620000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018b90528291908d169063ba8dd56290604401602060405180830381865afa158015610370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103949190610cfd565b105b15610425576040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015285169063b72703ac90602401602060405180830381865afa1580156103fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041e9190610ce0565b91506102f4565b819650876000036104365760001997505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663969c24526040518163ffffffff1660e01b8152600401602060405180830381865afa158015610496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ba9190610cfd565b90505b6001600160a01b038316158015906104d55750600084115b80156104ec57506000896104e881610d45565b9a50115b1561076f576040517fb91af97c0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009182918f169063b91af97c90602401608060405180830381865afa158015610555573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105799190610d5c565b50509150915060008e6001600160a01b03166355ca38cf87856040518363ffffffff1660e01b81526004016105c39291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa1580156105e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106049190610cfd565b9050808710156106165750505061076f565b600061062184610b47565b905061062d8289610d92565b8111156106d357848111156106ca57600061065a61064b848b610d92565b6106558885610d92565b610b73565b905060008f670de0b6b3a76400006106728685610da5565b61067c9190610db8565b6106869190610dfe565b6106909086610d92565b9050600061069e8385610d92565b905060006106ab82610b89565b90506106b78382610bb5565b9e506106c3848d610d92565b9b50505050505b5050505061076f565b6106dd8189610d92565b6040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152919950908a169063b72703ac90602401602060405180830381865afa158015610740573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107649190610ce0565b9650505050506104bd565b610779848c610d92565b955050505050509450945094915050565b6000610797848484610beb565b90505b9392505050565b600080600080876001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190610ce0565b90506000886001600160a01b03166349eefeee6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561084b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086f9190610cfd565b90508060000361088a57600080879450945094505050610b28565b816001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190610ce0565b6040517fb0d8e1810000000000000000000000000000000000000000000000000000000081526001600160a01b03808316600483015291965061097e918a91908c169063b0d8e18190602401602060405180830381865afa158015610955573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109799190610cfd565b610c1c565b935085925060015b87811015610b2457604080516020810186905201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120935060006109de8386610e12565b6040517fd9a72444000000000000000000000000000000000000000000000000000000008152600481018290529091506000906001600160a01b038d169063d9a7244490602401602060405180830381865afa158015610a42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a669190610ce0565b6040517fb0d8e1810000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000918e169063b0d8e18190602401602060405180830381865afa158015610acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aef9190610cfd565b90506000610afd828e610c1c565b905088811015610b0e578098508299505b84610b1881610e26565b95505050505050610986565b5050505b9450945094915050565b6000610b3e8383610bb5565b90505b92915050565b6000610b417f000000000000000000000000000000000000000000000000000000000000000083610d92565b6000818310610b825781610b3e565b5090919050565b6000610b417f000000000000000000000000000000000000000000000000000000000000000083610da5565b60008115610be25781610bd168056bc75e2d6310000085610db8565b610bdb9190610dfe565b9050610b41565b50600019610b41565b60008215610c1357600083610c008487610db8565b610c0a9190610dfe565b915061079a9050565b5060001961079a565b600081831015610c3557610c308383610d92565b610b3e565b610b3e8284610d92565b6001600160a01b0381168114610c5457600080fd5b50565b60008060008060808587031215610c6d57600080fd5b8435610c7881610c3f565b966020860135965060408601359560600135945092505050565b600080600060608486031215610ca757600080fd5b505081359360208301359350604090920135919050565b60008060408385031215610cd157600080fd5b50508035926020909101359150565b600060208284031215610cf257600080fd5b815161079a81610c3f565b600060208284031215610d0f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600081610d5457610d54610d16565b506000190190565b60008060008060808587031215610d7257600080fd5b505082516020840151604085015160609095015191969095509092509050565b81810381811115610b4157610b41610d16565b80820180821115610b4157610b41610d16565b8082028115828204841417610b4157610b41610d16565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082610e0d57610e0d610dcf565b500490565b600082610e2157610e21610dcf565b500690565b60006000198203610e3957610e39610d16565b506001019056fea264697066735822122065e7ca56822670fca3beb59584b46536d99330a702fac5e77a4f3ddb06c7713e64736f6c63430008130033",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [],
    "types": null
  }
}