{
  "address": "0xB92FCffb30fB16517439e667e045EEF041d5a48F",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IPropelCore",
          "name": "_propelCore",
          "type": "address"
        },
        {
          "internalType": "contract IStabilityPool",
          "name": "_stabilityPoolAddress",
          "type": "address"
        },
        {
          "internalType": "contract IBorrowerOperations",
          "name": "_borrowerOperations",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_factory",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_gasCompensation",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_liquidatedDebt",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_liquidatedColl",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_collGasCompensation",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_debtGasCompensation",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_interest",
          "type": "uint256"
        }
      ],
      "name": "Liquidation",
      "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": "_interest",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "enum LiquidationManager.TroveManagerOperation",
          "name": "_operation",
          "type": "uint8"
        }
      ],
      "name": "TroveLiquidated",
      "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": "uint8",
          "name": "operation",
          "type": "uint8"
        }
      ],
      "name": "TroveLiquidated",
      "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 LiquidationManager.TroveManagerOperation",
          "name": "_operation",
          "type": "uint8"
        }
      ],
      "name": "TroveUpdated",
      "type": "event"
    },
    {
      "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": "PropelCore",
      "outputs": [
        {
          "internalType": "contract IPropelCore",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "WETH",
      "outputs": [
        {
          "internalType": "contract IWETH",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ITroveManager",
          "name": "troveManager",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "_troveArray",
          "type": "address[]"
        }
      ],
      "name": "batchLiquidateTroves",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "blast",
      "outputs": [
        {
          "internalType": "contract IBlast",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "borrowerOperations",
      "outputs": [
        {
          "internalType": "contract IBorrowerOperations",
          "name": "",
          "type": "address"
        }
      ],
      "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": "contract ITroveManager",
          "name": "_troveManager",
          "type": "address"
        }
      ],
      "name": "enableTroveManager",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "factory",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getClaimableWETH",
      "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": "contract ITroveManager",
          "name": "troveManager",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "borrower",
          "type": "address"
        }
      ],
      "name": "liquidate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ITroveManager",
          "name": "troveManager",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "maxTrovesToLiquidate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "maxICR",
          "type": "uint256"
        }
      ],
      "name": "liquidateTroves",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stabilityPool",
      "outputs": [
        {
          "internalType": "contract IStabilityPool",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0xaff89b6dcf29c3991a9ac3ede4f8ea08457fea2bb98944314acbb66a8d58fb16",
  "receipt": {
    "to": null,
    "from": "0xF1658C608708172655A8e70a1624c29F956Ee63D",
    "contractAddress": "0xB92FCffb30fB16517439e667e045EEF041d5a48F",
    "transactionIndex": 2,
    "gasUsed": "2852760",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000200000000008000000000000000000000000000002080000000000000000080000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xd56a256fd74dae2ca14cda9a4b28906c0e0648048772dfd42d869e690a1cc12b",
    "transactionHash": "0xaff89b6dcf29c3991a9ac3ede4f8ea08457fea2bb98944314acbb66a8d58fb16",
    "logs": [
      {
        "transactionIndex": 2,
        "blockNumber": 2166445,
        "transactionHash": "0xaff89b6dcf29c3991a9ac3ede4f8ea08457fea2bb98944314acbb66a8d58fb16",
        "address": "0x4200000000000000000000000000000000000023",
        "topics": [
          "0xcaa97ab28bae75adcb5a02786c64b44d0d3139aa521bf831cdfbe280ef246e36",
          "0x000000000000000000000000b92fcffb30fb16517439e667e045eef041d5a48f"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000002",
        "logIndex": 0,
        "blockHash": "0xd56a256fd74dae2ca14cda9a4b28906c0e0648048772dfd42d869e690a1cc12b"
      }
    ],
    "blockNumber": 2166445,
    "cumulativeGasUsed": "2937781",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x8E92506660a9e523FE144e21d2A50B43045fdEFd",
    "0xd09713b05410d353d12E35D678c51540F5097a67",
    "0xc5ED6Bd52c5Fb9C716Ef6Caf6a35b4f4B858bab5",
    "0x3ee1d388d4b7d5f0798f4720a4bb382ed3beee0b",
    "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\":\"contract IStabilityPool\",\"name\":\"_stabilityPoolAddress\",\"type\":\"address\"},{\"internalType\":\"contract IBorrowerOperations\",\"name\":\"_borrowerOperations\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_factory\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasCompensation\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_liquidatedDebt\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_liquidatedColl\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_collGasCompensation\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_debtGasCompensation\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_interest\",\"type\":\"uint256\"}],\"name\":\"Liquidation\",\"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\":\"_interest\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"enum LiquidationManager.TroveManagerOperation\",\"name\":\"_operation\",\"type\":\"uint8\"}],\"name\":\"TroveLiquidated\",\"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\":\"uint8\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"TroveLiquidated\",\"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 LiquidationManager.TroveManagerOperation\",\"name\":\"_operation\",\"type\":\"uint8\"}],\"name\":\"TroveUpdated\",\"type\":\"event\"},{\"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\":\"PropelCore\",\"outputs\":[{\"internalType\":\"contract IPropelCore\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITroveManager\",\"name\":\"troveManager\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_troveArray\",\"type\":\"address[]\"}],\"name\":\"batchLiquidateTroves\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"blast\",\"outputs\":[{\"internalType\":\"contract IBlast\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"borrowerOperations\",\"outputs\":[{\"internalType\":\"contract IBorrowerOperations\",\"name\":\"\",\"type\":\"address\"}],\"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\":\"contract ITroveManager\",\"name\":\"_troveManager\",\"type\":\"address\"}],\"name\":\"enableTroveManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getClaimableWETH\",\"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\":\"contract ITroveManager\",\"name\":\"troveManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"borrower\",\"type\":\"address\"}],\"name\":\"liquidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITroveManager\",\"name\":\"troveManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxTrovesToLiquidate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxICR\",\"type\":\"uint256\"}],\"name\":\"liquidateTroves\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stabilityPool\",\"outputs\":[{\"internalType\":\"contract IStabilityPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"batchLiquidateTroves(address,address[])\":{\"details\":\"Reverts if there is not a single trove that can be liquidated\",\"params\":{\"_troveArray\":\"List of borrower addresses to liquidate. Troves that were already liquidated, or cannot be liquidated, are ignored.\"}},\"liquidate(address,address)\":{\"details\":\"Reverts if the trove is not active, or cannot be liquidated\",\"params\":{\"borrower\":\"Borrower address to liquidate\"}},\"liquidateTroves(address,uint256,uint256)\":{\"details\":\"Iterates through troves starting with the lowest ICR\",\"params\":{\"maxICR\":\"Maximum ICR to liquidate. Should be set to MCR if the system is not in recovery mode, to minimize gas costs for this call.\",\"maxTrovesToLiquidate\":\"The maximum number of troves to liquidate\"}}},\"title\":\"Propel Liquidation Manager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"batchLiquidateTroves(address,address[])\":{\"notice\":\"Liquidate a custom list of troves\"},\"liquidate(address,address)\":{\"notice\":\"Liquidate a single trove\"},\"liquidateTroves(address,uint256,uint256)\":{\"notice\":\"Liquidate a sequence of troves\"}},\"notice\":\"Based on Liquity's `TroveManager` https://github.com/liquity/dev/blob/main/packages/contracts/contracts/TroveManager.sol This contract has a 1:n relationship with `TroveManager`, handling liquidations for every active collateral within the system. Anyone can call to liquidate an eligible trove at any time. There is no requirement that liquidations happen in order according to trove ICRs. There are three ways that a liquidation can occur: 1. ICR <= 100 The trove's entire debt and collateral is redistributed between remaining active troves. 2. 100 < ICR < MCR The trove is liquidated using stability pool deposits. The collateral is distributed amongst stability pool depositors. If the stability pool's balance is insufficient to completely repay the trove, the remaining debt and collateral is redistributed between the remaining active troves. 3. MCR <= ICR < TCR && TCR < CCR The trove is liquidated using stability pool deposits. Collateral equal to MCR of the value of the debt is distributed between stability pool depositors. The remaining collateral is left claimable by the trove owner.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/core/LiquidationManager.sol\":\"LiquidationManager\"},\"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/core/LiquidationManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\nimport \\\"../interfaces/IStabilityPool.sol\\\";\\nimport \\\"../interfaces/ISortedTroves.sol\\\";\\nimport \\\"../interfaces/IBorrowerOperations.sol\\\";\\nimport \\\"../interfaces/ITroveManager.sol\\\";\\nimport \\\"../dependencies/PropelMath.sol\\\";\\nimport \\\"../dependencies/PropelBase.sol\\\";\\nimport \\\"../dependencies/BlastWrapper.sol\\\";\\nimport \\\"../dependencies/console.sol\\\";\\n\\n/**\\n    @title Propel Liquidation Manager\\n    @notice Based on Liquity's `TroveManager`\\n            https://github.com/liquity/dev/blob/main/packages/contracts/contracts/TroveManager.sol\\n\\n            This contract has a 1:n relationship with `TroveManager`, handling liquidations\\n            for every active collateral within the system.\\n\\n            Anyone can call to liquidate an eligible trove at any time. There is no requirement\\n            that liquidations happen in order according to trove ICRs. There are three ways that\\n            a liquidation can occur:\\n\\n            1. ICR <= 100\\n               The trove's entire debt and collateral is redistributed between remaining active troves.\\n\\n            2. 100 < ICR < MCR\\n               The trove is liquidated using stability pool deposits. The collateral is distributed\\n               amongst stability pool depositors. If the stability pool's balance is insufficient to\\n               completely repay the trove, the remaining debt and collateral is redistributed between\\n               the remaining active troves.\\n\\n            3. MCR <= ICR < TCR && TCR < CCR\\n               The trove is liquidated using stability pool deposits. Collateral equal to MCR of\\n               the value of the debt is distributed between stability pool depositors. The remaining\\n               collateral is left claimable by the trove owner.\\n */\\ncontract LiquidationManager is PropelBase, BlastWrapper {\\n\\tIStabilityPool public immutable stabilityPool;\\n\\tIBorrowerOperations public immutable borrowerOperations;\\n\\taddress public immutable factory;\\n\\n\\tuint256 private constant _100pct = 1000000000000000000; // 1e18 == 100%\\n\\n\\tmapping(ITroveManager => bool) internal _enabledTroveManagers;\\n\\n\\t/*\\n\\t * --- Variable container structs for liquidations ---\\n\\t *\\n\\t * These structs are used to hold, return and assign variables inside the liquidation functions,\\n\\t * in order to avoid the error: \\\"CompilerError: Stack too deep\\\".\\n\\t **/\\n\\n\\tstruct TroveManagerValues {\\n\\t\\tuint256 price;\\n\\t\\tuint256 MCR;\\n\\t\\tbool sunsetting;\\n\\t}\\n\\n\\tstruct LiquidationValues {\\n\\t\\tuint256 entireTroveDebt;\\n\\t\\tuint256 entireTroveColl;\\n\\t\\tuint256 interest;\\n\\t\\tuint256 collGasCompensation;\\n\\t\\tuint256 debtGasCompensation;\\n\\t\\tuint256 debtToOffset;\\n\\t\\tuint256 collToSendToSP;\\n\\t\\tuint256 debtToRedistribute;\\n\\t\\tuint256 collToRedistribute;\\n\\t\\tuint256 collSurplus;\\n\\t}\\n\\n\\tstruct LiquidationTotals {\\n\\t\\tuint256 totalCollInSequence;\\n\\t\\tuint256 totalDebtInSequence;\\n\\t\\tuint256 totalInterest;\\n\\t\\tuint256 totalCollGasCompensation;\\n\\t\\tuint256 totalDebtGasCompensation;\\n\\t\\tuint256 totalDebtToOffset;\\n\\t\\tuint256 totalCollToSendToSP;\\n\\t\\tuint256 totalDebtToRedistribute;\\n\\t\\tuint256 totalCollToRedistribute;\\n\\t\\tuint256 totalCollSurplus;\\n\\t}\\n\\n\\tevent TroveUpdated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 _stake, TroveManagerOperation _operation);\\n\\tevent TroveLiquidated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 _interest, TroveManagerOperation _operation);\\n\\tevent Liquidation(uint256 _liquidatedDebt, uint256 _liquidatedColl, uint256 _collGasCompensation, uint256 _debtGasCompensation, uint256 _interest);\\n\\tevent TroveUpdated(address indexed _borrower, uint256 _debt, uint256 _coll, uint256 stake, uint8 operation);\\n\\tevent TroveLiquidated(address indexed _borrower, uint256 _debt, uint256 _coll, uint8 operation);\\n\\n\\tenum TroveManagerOperation {\\n\\t\\tapplyPendingRewards,\\n\\t\\tliquidateInNormalMode,\\n\\t\\tliquidateInRecoveryMode,\\n\\t\\tredeemCollateral\\n\\t}\\n\\n\\tconstructor(IPropelCore _propelCore, IStabilityPool _stabilityPoolAddress, IBorrowerOperations _borrowerOperations, address _factory, uint256 _gasCompensation) BlastWrapper(_propelCore) PropelBase(_gasCompensation) {\\n\\t\\tstabilityPool = _stabilityPoolAddress;\\n\\t\\tborrowerOperations = _borrowerOperations;\\n\\t\\tfactory = _factory;\\n\\t}\\n\\n\\tfunction enableTroveManager(ITroveManager _troveManager) external {\\n\\t\\trequire(msg.sender == factory, \\\"Not factory\\\");\\n\\t\\t_enabledTroveManagers[_troveManager] = true;\\n\\t}\\n\\n\\t// --- Trove Liquidation functions ---\\n\\n\\t/**\\n        @notice Liquidate a single trove\\n        @dev Reverts if the trove is not active, or cannot be liquidated\\n        @param borrower Borrower address to liquidate\\n     */\\n\\tfunction liquidate(ITroveManager troveManager, address borrower) external {\\n\\t\\trequire(troveManager.getTroveStatus(borrower) == 1, \\\"TroveManager: Trove does not exist or is closed\\\");\\n\\n\\t\\taddress[] memory borrowers = new address[](1);\\n\\t\\tborrowers[0] = borrower;\\n\\t\\tbatchLiquidateTroves(troveManager, borrowers);\\n\\t}\\n\\n\\t/**\\n        @notice Liquidate a sequence of troves\\n        @dev Iterates through troves starting with the lowest ICR\\n        @param maxTrovesToLiquidate The maximum number of troves to liquidate\\n        @param maxICR Maximum ICR to liquidate. Should be set to MCR if the system\\n                      is not in recovery mode, to minimize gas costs for this call.\\n     */\\n\\tfunction liquidateTroves(ITroveManager troveManager, uint256 maxTrovesToLiquidate, uint256 maxICR) external {\\n\\t\\trequire(_enabledTroveManagers[troveManager], \\\"TroveManager not approved\\\");\\n\\t\\tIStabilityPool stabilityPoolCached = stabilityPool;\\n\\t\\ttroveManager.distributeInterestDebt();\\n\\n\\t\\tISortedTroves sortedTrovesCached = ISortedTroves(troveManager.sortedTroves());\\n\\n\\t\\tLiquidationValues memory singleLiquidation;\\n\\t\\tLiquidationTotals memory totals;\\n\\t\\tTroveManagerValues memory troveManagerValues;\\n\\n\\t\\tuint256 trovesRemaining = maxTrovesToLiquidate;\\n\\t\\tuint256 troveCount = troveManager.getTroveOwnersCount();\\n\\t\\ttroveManagerValues.price = troveManager.fetchPrice();\\n\\t\\ttroveManagerValues.sunsetting = troveManager.sunsetting();\\n\\t\\ttroveManagerValues.MCR = troveManager.MCR();\\n\\t\\tuint debtInStabPool = stabilityPoolCached.getTotalPropelUSDDeposits();\\n\\n\\t\\twhile (trovesRemaining > 0 && troveCount > 1) {\\n\\t\\t\\taddress account = sortedTrovesCached.getLast();\\n\\t\\t\\tuint ICR = troveManager.getCurrentICR(account, troveManagerValues.price);\\n\\t\\t\\tif (ICR > maxICR) {\\n\\t\\t\\t\\t// set to 0 to ensure the next if block evaluates false\\n\\t\\t\\t\\ttrovesRemaining = 0;\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\tif (ICR <= _100pct) {\\n\\t\\t\\t\\tsingleLiquidation = _liquidateWithoutSP(troveManager, account);\\n\\t\\t\\t\\t_applyLiquidationValuesToTotals(totals, singleLiquidation);\\n\\t\\t\\t} else if (ICR < troveManagerValues.MCR) {\\n\\t\\t\\t\\tsingleLiquidation = _liquidateNormalMode(troveManager, account, debtInStabPool, troveManagerValues.sunsetting);\\n\\t\\t\\t\\tdebtInStabPool -= singleLiquidation.debtToOffset;\\n\\t\\t\\t\\t_applyLiquidationValuesToTotals(totals, singleLiquidation);\\n\\t\\t\\t} else break; // break if the loop reaches a Trove with ICR >= MCR\\n\\t\\t\\tunchecked {\\n\\t\\t\\t\\t--trovesRemaining;\\n\\t\\t\\t\\t--troveCount;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tif (trovesRemaining > 0 && !troveManagerValues.sunsetting && troveCount > 1) {\\n\\t\\t\\t(uint entireSystemColl, uint entireSystemDebt) = borrowerOperations.getGlobalSystemBalances();\\n\\t\\t\\tentireSystemColl -= totals.totalCollToSendToSP * troveManagerValues.price;\\n\\t\\t\\tentireSystemDebt -= totals.totalDebtToOffset;\\n\\t\\t\\taddress nextAccount = sortedTrovesCached.getLast();\\n\\t\\t\\tITroveManager _troveManager = troveManager; //stack too deep workaround\\n\\t\\t\\twhile (trovesRemaining > 0 && troveCount > 1) {\\n\\t\\t\\t\\tuint ICR = troveManager.getCurrentICR(nextAccount, troveManagerValues.price);\\n\\t\\t\\t\\tif (ICR > maxICR) break;\\n\\t\\t\\t\\tunchecked {\\n\\t\\t\\t\\t\\t--trovesRemaining;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\taddress account = nextAccount;\\n\\t\\t\\t\\tnextAccount = sortedTrovesCached.getPrev(account);\\n\\n\\t\\t\\t\\tuint256 TCR = PropelMath._computeCR(entireSystemColl, entireSystemDebt);\\n\\t\\t\\t\\tif (TCR >= CCR || ICR >= TCR) break;\\n\\t\\t\\t\\tsingleLiquidation = _tryLiquidateWithCap(_troveManager, account, debtInStabPool, troveManagerValues.MCR, troveManagerValues.price);\\n\\t\\t\\t\\tif (singleLiquidation.debtToOffset == 0) continue;\\n\\t\\t\\t\\tdebtInStabPool -= singleLiquidation.debtToOffset;\\n\\t\\t\\t\\tentireSystemColl -= (singleLiquidation.collToSendToSP + singleLiquidation.collSurplus) * troveManagerValues.price;\\n\\t\\t\\t\\tentireSystemDebt -= singleLiquidation.debtToOffset;\\n\\t\\t\\t\\t_applyLiquidationValuesToTotals(totals, singleLiquidation);\\n\\t\\t\\t\\tunchecked {\\n\\t\\t\\t\\t\\t--troveCount;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\trequire(totals.totalDebtInSequence > 0, \\\"nothing to liquidate\\\");\\n\\t\\tif (totals.totalDebtToOffset > 0 || totals.totalCollToSendToSP > 0) {\\n\\t\\t\\t// Move liquidated collateral and Debt to the appropriate pools\\n\\t\\t\\tstabilityPoolCached.offset(troveManager.collateralToken(), totals.totalDebtToOffset, totals.totalCollToSendToSP);\\n\\t\\t\\ttroveManager.decreaseDebtAndSendCollateral(address(stabilityPoolCached), totals.totalDebtToOffset, totals.totalCollToSendToSP);\\n\\t\\t}\\n\\t\\ttroveManager.finalizeLiquidation(msg.sender, totals.totalDebtToRedistribute, totals.totalCollToRedistribute, totals.totalCollSurplus, totals.totalDebtGasCompensation, totals.totalCollGasCompensation, totals.totalInterest);\\n\\n\\t\\temit Liquidation(totals.totalDebtInSequence, totals.totalCollInSequence - totals.totalCollGasCompensation - totals.totalCollSurplus, totals.totalCollGasCompensation, totals.totalDebtGasCompensation, totals.totalInterest);\\n\\t}\\n\\n\\t/**\\n        @notice Liquidate a custom list of troves\\n        @dev Reverts if there is not a single trove that can be liquidated\\n        @param _troveArray List of borrower addresses to liquidate. Troves that were already\\n                           liquidated, or cannot be liquidated, are ignored.\\n     */\\n\\t/*\\n\\t * Attempt to liquidate a custom list of troves provided by the caller.\\n\\t */\\n\\tfunction batchLiquidateTroves(ITroveManager troveManager, address[] memory _troveArray) public {\\n\\t\\trequire(_enabledTroveManagers[troveManager], \\\"TroveManager not approved\\\");\\n\\t\\trequire(_troveArray.length != 0, \\\"TroveManager: Calldata address array must not be empty\\\");\\n\\t\\ttroveManager.distributeInterestDebt();\\n\\n\\t\\tLiquidationValues memory singleLiquidation;\\n\\t\\tLiquidationTotals memory totals;\\n\\t\\tTroveManagerValues memory troveManagerValues;\\n\\n\\t\\tIStabilityPool stabilityPoolCached = stabilityPool;\\n\\t\\tuint debtInStabPool = stabilityPoolCached.getTotalPropelUSDDeposits();\\n\\t\\ttroveManagerValues.price = troveManager.fetchPrice();\\n\\t\\ttroveManagerValues.sunsetting = troveManager.sunsetting();\\n\\t\\ttroveManagerValues.MCR = troveManager.MCR();\\n\\t\\tuint troveCount = troveManager.getTroveOwnersCount();\\n\\t\\tuint length = _troveArray.length;\\n\\t\\tuint troveIter;\\n\\t\\twhile (troveIter < length && troveCount > 1) {\\n\\t\\t\\t// first iteration round, when all liquidated troves have ICR < MCR we do not need to track TCR\\n\\t\\t\\taddress account = _troveArray[troveIter];\\n\\n\\t\\t\\t// closed / non-existent troves return an ICR of type(uint).max and are ignored\\n\\t\\t\\tuint ICR = troveManager.getCurrentICR(account, troveManagerValues.price);\\n\\t\\t\\tif (ICR <= _100pct) {\\n\\t\\t\\t\\tsingleLiquidation = _liquidateWithoutSP(troveManager, account);\\n\\t\\t\\t} else if (ICR < troveManagerValues.MCR) {\\n\\t\\t\\t\\tsingleLiquidation = _liquidateNormalMode(troveManager, account, debtInStabPool, troveManagerValues.sunsetting);\\n\\t\\t\\t\\tdebtInStabPool -= singleLiquidation.debtToOffset;\\n\\t\\t\\t} else {\\n\\t\\t\\t\\t// As soon as we find a trove with ICR >= MCR we need to start tracking the global TCR with the next loop\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\t\\t\\t_applyLiquidationValuesToTotals(totals, singleLiquidation);\\n\\t\\t\\tunchecked {\\n\\t\\t\\t\\t++troveIter;\\n\\t\\t\\t\\t--troveCount;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\tif (troveIter < length && troveCount > 1) {\\n\\t\\t\\t// second iteration round, if we receive a trove with ICR > MCR and need to track TCR\\n\\t\\t\\t(uint256 entireSystemColl, uint256 entireSystemDebt) = borrowerOperations.getGlobalSystemBalances();\\n\\t\\t\\tentireSystemColl -= totals.totalCollToSendToSP * troveManagerValues.price;\\n\\t\\t\\tentireSystemDebt -= totals.totalDebtToOffset;\\n\\t\\t\\twhile (troveIter < length && troveCount > 1) {\\n\\t\\t\\t\\taddress account = _troveArray[troveIter];\\n\\t\\t\\t\\tuint ICR = troveManager.getCurrentICR(account, troveManagerValues.price);\\n\\t\\t\\t\\tunchecked {\\n\\t\\t\\t\\t\\t++troveIter;\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tif (ICR <= _100pct) {\\n\\t\\t\\t\\t\\tsingleLiquidation = _liquidateWithoutSP(troveManager, account);\\n\\t\\t\\t\\t} else if (ICR < troveManagerValues.MCR) {\\n\\t\\t\\t\\t\\tsingleLiquidation = _liquidateNormalMode(troveManager, account, debtInStabPool, troveManagerValues.sunsetting);\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tuint256 TCR = PropelMath._computeCR(entireSystemColl, entireSystemDebt);\\n\\t\\t\\t\\t\\tif (TCR >= CCR || ICR >= TCR || troveManagerValues.sunsetting) continue;\\n\\t\\t\\t\\t\\tsingleLiquidation = _tryLiquidateWithCap(troveManager, account, debtInStabPool, troveManagerValues.MCR, troveManagerValues.price);\\n\\t\\t\\t\\t\\tif (singleLiquidation.debtToOffset == 0) continue;\\n\\t\\t\\t\\t}\\n\\n\\t\\t\\t\\tdebtInStabPool -= singleLiquidation.debtToOffset;\\n\\t\\t\\t\\tentireSystemColl -= (singleLiquidation.collToSendToSP + singleLiquidation.collSurplus) * troveManagerValues.price;\\n\\t\\t\\t\\tentireSystemDebt -= singleLiquidation.debtToOffset;\\n\\t\\t\\t\\t_applyLiquidationValuesToTotals(totals, singleLiquidation);\\n\\t\\t\\t\\tunchecked {\\n\\t\\t\\t\\t\\t--troveCount;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\trequire(totals.totalDebtInSequence > 0, \\\"TroveManager: nothing to liquidate\\\");\\n\\n\\t\\tif (totals.totalDebtToOffset > 0 || totals.totalCollToSendToSP > 0) {\\n\\t\\t\\t// Move liquidated collateral and Debt to the appropriate pools\\n\\t\\t\\tstabilityPoolCached.offset(troveManager.collateralToken(), totals.totalDebtToOffset, totals.totalCollToSendToSP);\\n\\t\\t\\ttroveManager.decreaseDebtAndSendCollateral(address(stabilityPoolCached), totals.totalDebtToOffset, totals.totalCollToSendToSP);\\n\\t\\t}\\n\\t\\ttroveManager.finalizeLiquidation(msg.sender, totals.totalDebtToRedistribute, totals.totalCollToRedistribute, totals.totalCollSurplus, totals.totalDebtGasCompensation, totals.totalCollGasCompensation, totals.totalInterest);\\n\\n\\t\\temit Liquidation(totals.totalDebtInSequence, totals.totalCollInSequence - totals.totalCollGasCompensation - totals.totalCollSurplus, totals.totalCollGasCompensation, totals.totalDebtGasCompensation, totals.totalInterest);\\n\\t}\\n\\n\\t/**\\n        @dev Perform a \\\"normal\\\" liquidation, where 100% < ICR < MCR. The trove\\n             is liquidated as much as possible using the stability pool. Any\\n             remaining debt and collateral are redistributed between active troves.\\n     */\\n\\tfunction _liquidateNormalMode(ITroveManager troveManager, address _borrower, uint256 _debtInStabPool, bool sunsetting) internal returns (LiquidationValues memory singleLiquidation) {\\n\\t\\tuint pendingDebtReward;\\n\\t\\tuint pendingCollReward;\\n\\n\\t\\t(singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, pendingDebtReward, pendingCollReward) = troveManager.getEntireDebtAndColl(_borrower);\\n\\t\\tsingleLiquidation.interest = troveManager.getTroveInterest(_borrower, singleLiquidation.entireTroveDebt);\\n\\t\\tsingleLiquidation.entireTroveDebt = singleLiquidation.entireTroveDebt + singleLiquidation.interest;\\n\\t\\ttroveManager.movePendingTroveRewardsToActiveBalances(pendingDebtReward, pendingCollReward);\\n\\n\\t\\tsingleLiquidation.collGasCompensation = _getCollGasCompensation(singleLiquidation.entireTroveColl);\\n\\t\\tsingleLiquidation.debtGasCompensation = DEBT_GAS_COMPENSATION;\\n\\t\\tuint256 collToLiquidate = singleLiquidation.entireTroveColl - singleLiquidation.collGasCompensation;\\n\\n\\t\\t(singleLiquidation.debtToOffset, singleLiquidation.collToSendToSP, singleLiquidation.debtToRedistribute, singleLiquidation.collToRedistribute) = _getOffsetAndRedistributionVals(singleLiquidation.entireTroveDebt, collToLiquidate, _debtInStabPool, sunsetting);\\n\\n\\t\\ttroveManager.closeTroveByLiquidation(_borrower);\\n\\t\\temit TroveLiquidated(_borrower, singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, singleLiquidation.interest, TroveManagerOperation.liquidateInNormalMode);\\n\\t\\temit TroveUpdated(_borrower, 0, 0, 0, TroveManagerOperation.liquidateInNormalMode);\\n\\t\\treturn singleLiquidation;\\n\\t}\\n\\n\\t/**\\n        @dev Attempt to liquidate a single trove in recovery mode.\\n             If MCR <= ICR < current TCR (accounting for the preceding liquidations in the current sequence)\\n             and there is Debt in the Stability Pool, only offset, with no redistribution,\\n             but at a capped rate of 1.1 and only if the whole debt can be liquidated.\\n             The remainder due to the capped rate will be claimable as collateral surplus.\\n     */\\n\\tfunction _tryLiquidateWithCap(ITroveManager troveManager, address _borrower, uint256 _debtInStabPool, uint256 _MCR, uint256 _price) internal returns (LiquidationValues memory singleLiquidation) {\\n\\t\\tuint entireTroveDebt;\\n\\t\\tuint entireTroveColl;\\n\\t\\tuint pendingDebtReward;\\n\\t\\tuint pendingCollReward;\\n\\n\\t\\t(entireTroveDebt, entireTroveColl, pendingDebtReward, pendingCollReward) = troveManager.getEntireDebtAndColl(_borrower);\\n\\t\\tuint256 interest = troveManager.getTroveInterest(_borrower, entireTroveDebt);\\n\\t\\tentireTroveDebt = entireTroveDebt + interest;\\n\\t\\tif (entireTroveDebt > _debtInStabPool) {\\n\\t\\t\\t// do not liquidate if the entire trove cannot be liquidated via SP\\n\\t\\t\\treturn singleLiquidation;\\n\\t\\t}\\n\\n\\t\\ttroveManager.movePendingTroveRewardsToActiveBalances(pendingDebtReward, pendingCollReward);\\n\\n\\t\\tsingleLiquidation.entireTroveDebt = entireTroveDebt + interest;\\n\\t\\tsingleLiquidation.interest = interest;\\n\\t\\tsingleLiquidation.entireTroveColl = entireTroveColl;\\n\\t\\tuint256 collToOffset = (singleLiquidation.entireTroveDebt * _MCR) / _price;\\n\\n\\t\\tsingleLiquidation.collGasCompensation = _getCollGasCompensation(collToOffset);\\n\\t\\tsingleLiquidation.debtGasCompensation = DEBT_GAS_COMPENSATION;\\n\\n\\t\\tsingleLiquidation.debtToOffset = singleLiquidation.entireTroveDebt;\\n\\t\\tsingleLiquidation.collToSendToSP = collToOffset - singleLiquidation.collGasCompensation;\\n\\n\\t\\ttroveManager.closeTroveByLiquidation(_borrower);\\n\\n\\t\\tuint256 collSurplus = entireTroveColl - collToOffset;\\n\\t\\tif (collSurplus > 0) {\\n\\t\\t\\tsingleLiquidation.collSurplus = collSurplus;\\n\\t\\t\\ttroveManager.addCollateralSurplus(_borrower, collSurplus);\\n\\t\\t}\\n\\n\\t\\temit TroveLiquidated(_borrower, entireTroveDebt, singleLiquidation.collToSendToSP, interest, TroveManagerOperation.liquidateInRecoveryMode);\\n\\t\\temit TroveUpdated(_borrower, 0, 0, 0, TroveManagerOperation.liquidateInRecoveryMode);\\n\\n\\t\\treturn singleLiquidation;\\n\\t}\\n\\n\\t/**\\n        @dev Liquidate a trove without using the stability pool. All debt and collateral\\n             are distributed porportionally between the remaining active troves.\\n     */\\n\\tfunction _liquidateWithoutSP(ITroveManager troveManager, address _borrower) internal returns (LiquidationValues memory singleLiquidation) {\\n\\t\\tuint pendingDebtReward;\\n\\t\\tuint pendingCollReward;\\n\\n\\t\\t(singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, pendingDebtReward, pendingCollReward) = troveManager.getEntireDebtAndColl(_borrower);\\n\\t\\tsingleLiquidation.interest = troveManager.getTroveInterest(_borrower, singleLiquidation.entireTroveDebt);\\n\\t\\tsingleLiquidation.entireTroveDebt = singleLiquidation.entireTroveDebt + singleLiquidation.interest;\\n\\t\\tsingleLiquidation.collGasCompensation = _getCollGasCompensation(singleLiquidation.entireTroveColl);\\n\\t\\tsingleLiquidation.debtGasCompensation = DEBT_GAS_COMPENSATION;\\n\\t\\ttroveManager.movePendingTroveRewardsToActiveBalances(pendingDebtReward, pendingCollReward);\\n\\n\\t\\tsingleLiquidation.debtToOffset = 0;\\n\\t\\tsingleLiquidation.collToSendToSP = 0;\\n\\t\\tsingleLiquidation.debtToRedistribute = singleLiquidation.entireTroveDebt;\\n\\t\\tsingleLiquidation.collToRedistribute = singleLiquidation.entireTroveColl - singleLiquidation.collGasCompensation;\\n\\n\\t\\ttroveManager.closeTroveByLiquidation(_borrower);\\n\\t\\temit TroveLiquidated(_borrower, singleLiquidation.entireTroveDebt, singleLiquidation.entireTroveColl, singleLiquidation.interest, TroveManagerOperation.liquidateInRecoveryMode);\\n\\t\\temit TroveUpdated(_borrower, 0, 0, 0, TroveManagerOperation.liquidateInRecoveryMode);\\n\\t\\treturn singleLiquidation;\\n\\t}\\n\\n\\t/* In a full liquidation, returns the values for a trove's coll and debt to be offset, and coll and debt to be\\n\\t * redistributed to active troves.\\n\\t */\\n\\tfunction _getOffsetAndRedistributionVals(uint256 _debt, uint256 _coll, uint256 _debtInStabPool, bool sunsetting) internal pure returns (uint256 debtToOffset, uint256 collToSendToSP, uint256 debtToRedistribute, uint256 collToRedistribute) {\\n\\t\\tif (_debtInStabPool > 0 && !sunsetting) {\\n\\t\\t\\t/*\\n\\t\\t\\t * Offset as much debt & collateral as possible against the Stability Pool, and redistribute the remainder\\n\\t\\t\\t * between all active troves.\\n\\t\\t\\t *\\n\\t\\t\\t *  If the trove's debt is larger than the deposited Debt in the Stability Pool:\\n\\t\\t\\t *\\n\\t\\t\\t *  - Offset an amount of the trove's debt equal to the Debt in the Stability Pool\\n\\t\\t\\t *  - Send a fraction of the trove's collateral to the Stability Pool, equal to the fraction of its offset debt\\n\\t\\t\\t *\\n\\t\\t\\t */\\n\\t\\t\\tdebtToOffset = PropelMath._min(_debt, _debtInStabPool);\\n\\t\\t\\tcollToSendToSP = (_coll * debtToOffset) / _debt;\\n\\t\\t\\tdebtToRedistribute = _debt - debtToOffset;\\n\\t\\t\\tcollToRedistribute = _coll - collToSendToSP;\\n\\t\\t} else {\\n\\t\\t\\tdebtToOffset = 0;\\n\\t\\t\\tcollToSendToSP = 0;\\n\\t\\t\\tdebtToRedistribute = _debt;\\n\\t\\t\\tcollToRedistribute = _coll;\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n        @dev Adds values from `singleLiquidation` to `totals`\\n             Calling this function mutates `totals`, the change is done in-place\\n             to avoid needless expansion of memory\\n     */\\n\\tfunction _applyLiquidationValuesToTotals(LiquidationTotals memory totals, LiquidationValues memory singleLiquidation) internal pure {\\n\\t\\t// Tally all the values with their respective running totals\\n\\t\\ttotals.totalCollGasCompensation = totals.totalCollGasCompensation + singleLiquidation.collGasCompensation;\\n\\t\\ttotals.totalDebtGasCompensation = totals.totalDebtGasCompensation + singleLiquidation.debtGasCompensation;\\n\\t\\ttotals.totalDebtInSequence = totals.totalDebtInSequence + singleLiquidation.entireTroveDebt;\\n\\t\\ttotals.totalInterest = totals.totalInterest + singleLiquidation.interest;\\n\\t\\ttotals.totalCollInSequence = totals.totalCollInSequence + singleLiquidation.entireTroveColl;\\n\\t\\ttotals.totalDebtToOffset = totals.totalDebtToOffset + singleLiquidation.debtToOffset;\\n\\t\\ttotals.totalCollToSendToSP = totals.totalCollToSendToSP + singleLiquidation.collToSendToSP;\\n\\t\\ttotals.totalDebtToRedistribute = totals.totalDebtToRedistribute + singleLiquidation.debtToRedistribute;\\n\\t\\ttotals.totalCollToRedistribute = totals.totalCollToRedistribute + singleLiquidation.collToRedistribute;\\n\\t\\ttotals.totalCollSurplus = totals.totalCollSurplus + singleLiquidation.collSurplus;\\n\\t}\\n}\\n\",\"keccak256\":\"0xc1ea45d9a1049f61f8a5ef7d59b9baa529383107b5a4689d1d38b061063c92de\",\"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/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/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/IStabilityPool.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.19;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/IERC20.sol\\\";\\n\\ninterface IStabilityPool {\\n\\tevent CollateralGainWithdrawn(address indexed _depositor, uint256[] _collateral);\\n\\tevent CollateralOverwritten(address oldCollateral, address newCollateral);\\n\\tevent DepositSnapshotUpdated(address indexed _depositor, uint256 _P, uint256 _G);\\n\\tevent EpochUpdated(uint128 _currentEpoch);\\n\\tevent G_Updated(uint256 _G, uint128 _epoch, uint128 _scale);\\n\\tevent P_Updated(uint256 _P);\\n\\tevent RewardClaimed(address indexed account, address indexed recipient, uint256 claimed);\\n\\tevent S_Updated(uint256 idx, uint256 _S, uint128 _epoch, uint128 _scale);\\n\\tevent ScaleUpdated(uint128 _currentScale);\\n\\tevent StabilityPoolPropelUSDBalanceUpdated(uint256 _newBalance);\\n\\tevent UserDepositChanged(address indexed _depositor, uint256 _newDeposit);\\n\\n\\t// function claimCollateralGains(address recipient, uint256[] calldata collateralIndexes) external;\\n\\n\\t// function claimReward(address recipient) external returns (uint256 amount);\\n\\n\\tfunction enableCollateral(IERC20 _collateral) external;\\n\\n\\tfunction offset(IERC20 collateral, uint256 _debtToOffset, uint256 _collToAdd) external;\\n\\n\\tfunction provideToSP(uint256 _amount) external;\\n\\n\\tfunction startCollateralSunset(IERC20 collateral) external;\\n\\n\\tfunction withdrawFromSP(uint256 _amount) external;\\n\\n\\tfunction DECIMAL_PRECISION() external view returns (uint256);\\n\\n\\tfunction P() external view returns (uint256);\\n\\n\\tfunction SCALE_FACTOR() external view returns (uint256);\\n\\n\\tfunction SUNSET_DURATION() external view returns (uint128);\\n\\n\\tfunction claimableReward(address _depositor) external view returns (uint256);\\n\\n\\tfunction currentEpoch() external view returns (uint128);\\n\\n\\tfunction currentScale() external view returns (uint128);\\n\\n\\tfunction depositSnapshots(address) external view returns (uint256 P, uint256 G, uint128 scale, uint128 epoch);\\n\\n\\tfunction depositSums(address, uint256) external view returns (uint256);\\n\\n\\tfunction epochToScaleToG(uint128, uint128) external view returns (uint256);\\n\\n\\tfunction epochToScaleToSums(uint128, uint128, uint256) external view returns (uint256);\\n\\n\\tfunction factory() external view returns (address);\\n\\n\\tfunction getCompoundedDeposit(address _depositor) external view returns (uint256);\\n\\n\\tfunction getDepositorCollateralGain(address _depositor) external view returns (uint256[] memory collateralGains);\\n\\n\\tfunction getTotalPropelUSDDeposits() external view returns (uint256);\\n\\n\\tfunction lastDebtLossError_Offset() external view returns (uint256);\\n\\n\\tfunction lastEsPropelError() external view returns (uint256);\\n\\n\\tfunction liquidationManager() external view returns (address);\\n}\\n\",\"keccak256\":\"0x1fcbdf3288009aff76361862f1c0b0131d4c338c04781ece3a6cab426dbc3946\",\"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": "0x6101206040523480156200001257600080fd5b506040516200348c3803806200348c833981016040819052620000359162000217565b60808190526001600160a01b03851660a05284620000526200014d565b6001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200008d57600080fd5b505af1158015620000a2573d6000803e3d6000fd5b50505050620000b6620001bb60201b60201c565b6001600160a01b0316631a33757d60026040518263ffffffff1660e01b8152600401620000e491906200028b565b6020604051808303816000875af115801562000104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012a9190620002b4565b5050506001600160a01b0392831660c05290821660e052166101005250620002f5565b600060a0516001600160a01b031663175e1a7d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000190573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b69190620002ce565b905090565b600060a0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000190573d6000803e3d6000fd5b6001600160a01b03811681146200021457600080fd5b50565b600080600080600060a086880312156200023057600080fd5b85516200023d81620001fe565b60208701519095506200025081620001fe565b60408701519094506200026381620001fe565b60608701519093506200027681620001fe565b80925050608086015190509295509295909350565b6020810160038310620002ae57634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215620002c757600080fd5b5051919050565b600060208284031215620002e157600080fd5b8151620002ee81620001fe565b9392505050565b60805160a05160c05160e051610100516130fe6200038e600039600081816102bd015261039a01526000818161022301528181610ba2015261179e01526000818161015b0152818161061b01526114230152600081816102e40152818161030a0152818161055301528181611f700152611fd00152600081816101ed015281816122f9015281816127800152612b1a01526130fe6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80637b5031b2116100cd578063a20baee611610081578063c2d94aec11610066578063c2d94aec146102a5578063c45a0155146102b8578063f2b6db51146102df57600080fd5b8063a20baee61461028e578063ad5c46481461029d57600080fd5b806386ad29aa116100b257806386ad29aa1461026b57806386b9d81f146102735780638da5cb5b1461028657600080fd5b80637b5031b2146102455780637c92590f1461025857600080fd5b8063452a9320116101245780634ba4a28b116101095780634ba4a28b146101e85780635733d58f1461020f57806377553ad41461021e57600080fd5b8063452a9320146101ca5780634870dd9a146101d257600080fd5b8063048c661d14610156578063175e1a7d1461019a57806317dd676d146101a2578063272b1323146101b7575b600080fd5b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61017d610306565b6101b56101b0366004612d9e565b61038f565b005b6101b56101c5366004612d9e565b61044e565b61017d61054f565b6101da60c881565b604051908152602001610191565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6101da6714d1120d7b16000081565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6101b5610253366004612dcb565b6105af565b6101b5610266366004612e16565b611209565b6101da611d82565b6101b5610281366004612f0e565b611e0f565b61017d611f6c565b6101da670de0b6b3a764000081565b61017d611fcc565b6101b56102b3366004612d9e565b61202c565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663175e1a7d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038a9190612f47565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461040c5760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420666163746f727900000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0316600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610456611f6c565b6001600160a01b0316336001600160a01b0316146104b65760405162461bcd60e51b815260206004820152600a60248201527f4f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610403565b6104be610306565b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038381166024830152919091169063954fa5ee906044016020604051808303816000875af1158015610527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054b9190612f64565b5050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b6001600160a01b03831660009081526020819052604090205460ff166106175760405162461bcd60e51b815260206004820152601960248201527f54726f76654d616e61676572206e6f7420617070726f766564000000000000006044820152606401610403565b60007f00000000000000000000000000000000000000000000000000000000000000009050836001600160a01b0316631e8979016040518163ffffffff1660e01b81526004016020604051808303816000875af115801561067c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a09190612f64565b506000846001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107059190612f47565b905061075d604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6107b3604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6107d9604051806060016040528060008152602001600081526020016000151581525090565b60008790506000896001600160a01b03166349eefeee6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108429190612f64565b9050896001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190612f64565b836000018181525050896001600160a01b0316639484fb8e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109139190612f7d565b836040019015159081151581525050896001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610960573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109849190612f64565b8360200181815250506000876001600160a01b0316622dade96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f09190612f64565b90505b600083118015610a035750600182115b15610b7a576000876001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c9190612f47565b8551604051630d293c7160e41b81526001600160a01b0380841660048301526024820192909252919250600091908e169063d293c71090604401602060405180830381865afa158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190612f64565b90508a811115610afc57600094505050610b7a565b670de0b6b3a76400008111610b2657610b158d83612186565b9750610b2187896124af565b610b67565b8560200151811015610b6057610b428d838589604001516125ab565b97508760a0015183610b549190612fb5565b9250610b2187896124af565b5050610b7a565b50506000199283019291909101906109f3565b600083118015610b8c57508360400151155b8015610b985750600182115b15610ecb576000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663716c53c26040518163ffffffff1660e01b815260040160408051808303816000875af1158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c239190612fc8565b875160c08a0151929450909250610c3991612fec565b610c439083612fb5565b91508660a0015181610c559190612fb5565b90506000896001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb9190612f47565b90508d5b600087118015610ccf5750600186115b15610ec65760008f6001600160a01b031663d293c710848b600001516040518363ffffffff1660e01b8152600401610d1c9291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015610d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5d9190612f64565b90508d811115610d6d5750610ec6565b6040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015260001999909901988491908e169063b72703ac90602401602060405180830381865afa158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb9190612f47565b93506000610e0987876128e0565b90506714d1120d7b16000081101580610e225750808310155b15610e2f57505050610ec6565b610e4484838a8e602001518f60000151612906565b9c508c60a00151600003610e5a57505050610cbf565b60a08d0151610e699089612fb5565b97508a600001518d61012001518e60c00151610e859190613003565b610e8f9190612fec565b610e999088612fb5565b96508c60a0015186610eab9190612fb5565b9550610eb78c8e6124af565b50506000199096019550610cbf565b505050505b6000856020015111610f1f5760405162461bcd60e51b815260206004820152601460248201527f6e6f7468696e6720746f206c69717569646174650000000000000000000000006044820152606401610403565b60008560a001511180610f36575060008560c00151115b156110c457876001600160a01b031663e66667338c6001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac9190612f47565b60a088015160c08901516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381600087803b15801561101c57600080fd5b505af1158015611030573d6000803e3d6000fd5b5050505060a085015160c08601516040517fe9186c940000000000000000000000000000000000000000000000000000000081526001600160a01b038b8116600483015260248201939093526044810191909152908c169063e9186c9490606401600060405180830381600087803b1580156110ab57600080fd5b505af11580156110bf573d6000803e3d6000fd5b505050505b60e0850151610100860151610120870151608088015160608901516040808b015190517f7541ae1b000000000000000000000000000000000000000000000000000000008152336004820152602481019690965260448601949094526064850192909252608484015260a483015260c48201526001600160a01b038c1690637541ae1b9060e401600060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b5050506020860151610120870151606088015188517f5823f33ee3da2874398138f21ff2fcd7078180caf18ccb37ac445d9a5abfa75f94506111bb9190612fb5565b6111c59190612fb5565b6060808901516080808b01516040808d0151815197885260208801969096528601929092529184015282015260a00160405180910390a15050505050505050505050565b6001600160a01b03821660009081526020819052604090205460ff166112715760405162461bcd60e51b815260206004820152601960248201527f54726f76654d616e61676572206e6f7420617070726f766564000000000000006044820152606401610403565b80516000036112e85760405162461bcd60e51b815260206004820152603660248201527f54726f76654d616e616765723a2043616c6c646174612061646472657373206160448201527f72726179206d757374206e6f7420626520656d707479000000000000000000006064820152608401610403565b816001600160a01b0316631e8979016040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190612f64565b506113a3604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6113f9604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61141f604051806060016040528060008152602001600081526020016000151581525090565b60007f000000000000000000000000000000000000000000000000000000000000000090506000816001600160a01b0316622dade96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190612f64565b9050866001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156114e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150d9190612f64565b836000018181525050866001600160a01b0316639484fb8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190612f7d565b836040019015159081151581525050866001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190612f64565b8360200181815250506000876001600160a01b03166349eefeee6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611632573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116569190612f64565b875190915060005b818110801561166d5750600183115b1561178557600089828151811061168657611686613016565b60209081029190910101518751604051630d293c7160e41b81526001600160a01b0380841660048301526024820192909252919250600091908d169063d293c71090604401602060405180830381865afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c9190612f64565b9050670de0b6b3a7640000811161172e576117278c83612186565b995061176a565b87602001518110156117635761174a8c83888b604001516125ab565b99508960a001518661175c9190612fb5565b955061176a565b5050611785565b611774898b6124af565b50506000199092019160010161165e565b81811080156117945750600183115b15611a1f576000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663716c53c26040518163ffffffff1660e01b815260040160408051808303816000875af11580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f9190612fc8565b895160c08c015192945090925061183591612fec565b61183f9083612fb5565b91508860a00151816118519190612fb5565b90505b83831080156118635750600185115b15611a1c5760008b848151811061187c5761187c613016565b60209081029190910101518951604051630d293c7160e41b81526001600160a01b0380841660048301526024820192909252919250600091908f169063d293c71090604401602060405180830381865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190612f64565b9050846001019450670de0b6b3a7640000811161192a576119238e83612186565b9b506119b1565b8960200151811015611946576119238e838a8d604001516125ab565b600061195285856128e0565b90506714d1120d7b1600008110158061196b5750808210155b8061197757508a604001515b1561198457505050611854565b6119998f848b8e602001518f60000151612906565b9c508c60a001516000036119af57505050611854565b505b60a08c01516119c09089612fb5565b975089600001518c61012001518d60c001516119dc9190613003565b6119e69190612fec565b6119f09085612fb5565b93508b60a0015183611a029190612fb5565b9250611a0e8b8d6124af565b505060001990940193611854565b50505b6000876020015111611a995760405162461bcd60e51b815260206004820152602260248201527f54726f76654d616e616765723a206e6f7468696e6720746f206c69717569646160448201527f74650000000000000000000000000000000000000000000000000000000000006064820152608401610403565b60008760a001511180611ab0575060008760c00151115b15611c3e57846001600160a01b031663e66667338b6001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190612f47565b60a08a015160c08b01516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381600087803b158015611b9657600080fd5b505af1158015611baa573d6000803e3d6000fd5b5050505060a087015160c08801516040517fe9186c940000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201939093526044810191909152908b169063e9186c9490606401600060405180830381600087803b158015611c2557600080fd5b505af1158015611c39573d6000803e3d6000fd5b505050505b60e087015161010088015161012089015160808a015160608b01516040808d015190517f7541ae1b000000000000000000000000000000000000000000000000000000008152336004820152602481019690965260448601949094526064850192909252608484015260a483015260c48201526001600160a01b038b1690637541ae1b9060e401600060405180830381600087803b158015611cdf57600080fd5b505af1158015611cf3573d6000803e3d6000fd5b505050602088015161012089015160608a01518a517f5823f33ee3da2874398138f21ff2fcd7078180caf18ccb37ac445d9a5abfa75f9450611d359190612fb5565b611d3f9190612fb5565b6060808b01516080808d01516040808f0151815197885260208801969096528601929092529184015282015260a00160405180910390a150505050505050505050565b6000611d8c611fcc565b6040517fe12f3a610000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063e12f3a6190602401602060405180830381865afa158015611deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038a9190612f64565b6040517f21e378010000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906321e3780190602401602060405180830381865afa158015611e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e929190612f64565b600114611f075760405162461bcd60e51b815260206004820152602f60248201527f54726f76654d616e616765723a2054726f766520646f6573206e6f742065786960448201527f7374206f7220697320636c6f73656400000000000000000000000000000000006064820152608401610403565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110611f3d57611f3d613016565b60200260200101906001600160a01b031690816001600160a01b031681525050611f678382611209565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b612034611f6c565b6001600160a01b0316336001600160a01b0316146120945760405162461bcd60e51b815260206004820152600a60248201527f4f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610403565b600061209e611d82565b9050600081116120f05760405162461bcd60e51b815260206004820152601360248201527f6e6f20636c61696d61626c6520616d6f756e74000000000000000000000000006044820152606401610403565b6120f8611fcc565b6040517faad3ec960000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063aad3ec96906044016020604051808303816000875af1158015612162573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f679190612f64565b6121dc604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051632e46be5f60e21b81526001600160a01b038381166004830152600091829186169063b91af97c90602401608060405180830381865afa158015612227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224b919061302c565b60208701929092528286526040516355ca38cf60e01b81526001600160a01b0388811660048301526024820194909452909450909250908616906355ca38cf90604401602060405180830381865afa1580156122ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cf9190612f64565b6040840181905283516122e29190613003565b835260208301516122f290612cf0565b60608401527f0000000000000000000000000000000000000000000000000000000000000000608084015260405163eb3007fd60e01b815260048101839052602481018290526001600160a01b0386169063eb3007fd90604401600060405180830381600087803b15801561236657600080fd5b505af115801561237a573d6000803e3d6000fd5b5050600060a0860181905260c08601525050825160e0840152606083015160208401516123a79190612fb5565b6101008401526040516325019ee960e01b81526001600160a01b0385811660048301528616906325019ee990602401600060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b50505050836001600160a01b03167fcb54d78ab66bd48ff5a1a1018e8826bc0df893b94b4d3945b3922e586eaa048a84600001518560200151866040015160026040516124549493929190613084565b60405180910390a2836001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b6000806000600260405161249e9493929190613084565b60405180910390a250505b92915050565b806060015182606001516124c39190613003565b6060830152608080820151908301516124dc9190613003565b6080830152805160208301516124f29190613003565b60208301526040808201519083015161250b9190613003565b6040830152602081015182516125219190613003565b825260a080820151908301516125379190613003565b60a083015260c080820151908301516125509190613003565b60c083015260e080820151908301516125699190613003565b60e083015261010080820151908301516125839190613003565b610100830152610120808201519083015161259e9190613003565b6101209092019190915250565b612601604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051632e46be5f60e21b81526001600160a01b038581166004830152600091829188169063b91af97c90602401608060405180830381865afa15801561264c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612670919061302c565b60208701929092528286526040516355ca38cf60e01b81526001600160a01b038a811660048301526024820194909452909450909250908816906355ca38cf90604401602060405180830381865afa1580156126d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f49190612f64565b6040840181905283516127079190613003565b835260405163eb3007fd60e01b815260048101839052602481018290526001600160a01b0388169063eb3007fd90604401600060405180830381600087803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506127778360200151612cf0565b606084018190527f0000000000000000000000000000000000000000000000000000000000000000608085015260208401516000916127b591612fb5565b90506127c78460000151828888612cfd565b61010088015260e087015260c086015260a08501526040516325019ee960e01b81526001600160a01b0388811660048301528916906325019ee990602401600060405180830381600087803b15801561281f57600080fd5b505af1158015612833573d6000803e3d6000fd5b50505050866001600160a01b03167fcb54d78ab66bd48ff5a1a1018e8826bc0df893b94b4d3945b3922e586eaa048a85600001518660200151876040015160016040516128839493929190613084565b60405180910390a2866001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b600080600060016040516128cd9493929190613084565b60405180910390a2505050949350505050565b600081156128fd5760006128f483856130a6565b91506124a99050565b506000196124a9565b61295c604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051632e46be5f60e21b81526001600160a01b0386811660048301526000918291829182918b169063b91af97c90602401608060405180830381865afa1580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf919061302c565b6040516355ca38cf60e01b81526001600160a01b038e811660048301526024820186905294985092965090945092506000918c16906355ca38cf90604401602060405180830381865afa158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190612f64565b9050612a5a8186613003565b945088851115612a6e575050505050612ce7565b60405163eb3007fd60e01b815260048101849052602481018390526001600160a01b038c169063eb3007fd90604401600060405180830381600087803b158015612ab757600080fd5b505af1158015612acb573d6000803e3d6000fd5b505050508085612adb9190613003565b80875260408701829052602087018590526000908890612afc908b90612fec565b612b0691906130a6565b9050612b1181612cf0565b606088018190527f00000000000000000000000000000000000000000000000000000000000000006080890152875160a0890152612b4f9082612fb5565b60c08801526040516325019ee960e01b81526001600160a01b038c811660048301528d16906325019ee990602401600060405180830381600087803b158015612b9757600080fd5b505af1158015612bab573d6000803e3d6000fd5b5050505060008186612bbd9190612fb5565b90508015612c495761012088018190526040517f789c6b930000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018390528e169063789c6b9390604401600060405180830381600087803b158015612c3057600080fd5b505af1158015612c44573d6000803e3d6000fd5b505050505b8b6001600160a01b03167fcb54d78ab66bd48ff5a1a1018e8826bc0df893b94b4d3945b3922e586eaa048a888a60c00151866002604051612c8d9493929190613084565b60405180910390a28b6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b60008060006002604051612cd79493929190613084565b60405180910390a2505050505050505b95945050505050565b60006124a960c8836130a6565b600080600080600086118015612d11575084155b15612d5657612d208887612d6e565b935087612d2d8589612fec565b612d3791906130a6565b9250612d438489612fb5565b9150612d4f8388612fb5565b9050612d63565b5060009250829150869050855b945094509450949050565b6000818310612d7d5781612d7f565b825b9392505050565b6001600160a01b0381168114612d9b57600080fd5b50565b600060208284031215612db057600080fd5b8135612d7f81612d86565b8035612dc681612d86565b919050565b600080600060608486031215612de057600080fd5b8335612deb81612d86565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215612e2957600080fd5b8235612e3481612d86565b915060208381013567ffffffffffffffff80821115612e5257600080fd5b818601915086601f830112612e6657600080fd5b813581811115612e7857612e78612e00565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715612ebb57612ebb612e00565b604052918252848201925083810185019189831115612ed957600080fd5b938501935b82851015612efe57612eef85612dbb565b84529385019392850192612ede565b8096505050505050509250929050565b60008060408385031215612f2157600080fd5b8235612f2c81612d86565b91506020830135612f3c81612d86565b809150509250929050565b600060208284031215612f5957600080fd5b8151612d7f81612d86565b600060208284031215612f7657600080fd5b5051919050565b600060208284031215612f8f57600080fd5b81518015158114612d7f57600080fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156124a9576124a9612f9f565b60008060408385031215612fdb57600080fd5b505080516020909101519092909150565b80820281158282048414176124a9576124a9612f9f565b808201808211156124a9576124a9612f9f565b634e487b7160e01b600052603260045260246000fd5b6000806000806080858703121561304257600080fd5b505082516020840151604085015160609095015191969095509092509050565b6004811061308057634e487b7160e01b600052602160045260246000fd5b9052565b848152602081018490526040810183905260808101612ce76060830184613062565b6000826130c357634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c0e1edd114090163b5ee8ad98dbc7e3c8292b2edbba32edfa8840de0a6bfe16364736f6c63430008130033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101515760003560e01c80637b5031b2116100cd578063a20baee611610081578063c2d94aec11610066578063c2d94aec146102a5578063c45a0155146102b8578063f2b6db51146102df57600080fd5b8063a20baee61461028e578063ad5c46481461029d57600080fd5b806386ad29aa116100b257806386ad29aa1461026b57806386b9d81f146102735780638da5cb5b1461028657600080fd5b80637b5031b2146102455780637c92590f1461025857600080fd5b8063452a9320116101245780634ba4a28b116101095780634ba4a28b146101e85780635733d58f1461020f57806377553ad41461021e57600080fd5b8063452a9320146101ca5780634870dd9a146101d257600080fd5b8063048c661d14610156578063175e1a7d1461019a57806317dd676d146101a2578063272b1323146101b7575b600080fd5b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61017d610306565b6101b56101b0366004612d9e565b61038f565b005b6101b56101c5366004612d9e565b61044e565b61017d61054f565b6101da60c881565b604051908152602001610191565b6101da7f000000000000000000000000000000000000000000000000000000000000000081565b6101da6714d1120d7b16000081565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6101b5610253366004612dcb565b6105af565b6101b5610266366004612e16565b611209565b6101da611d82565b6101b5610281366004612f0e565b611e0f565b61017d611f6c565b6101da670de0b6b3a764000081565b61017d611fcc565b6101b56102b3366004612d9e565b61202c565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663175e1a7d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038a9190612f47565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461040c5760405162461bcd60e51b815260206004820152600b60248201527f4e6f7420666163746f727900000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b0316600090815260208190526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610456611f6c565b6001600160a01b0316336001600160a01b0316146104b65760405162461bcd60e51b815260206004820152600a60248201527f4f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610403565b6104be610306565b6040517f954fa5ee0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038381166024830152919091169063954fa5ee906044016020604051808303816000875af1158015610527573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054b9190612f64565b5050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663452a93206040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b6001600160a01b03831660009081526020819052604090205460ff166106175760405162461bcd60e51b815260206004820152601960248201527f54726f76654d616e61676572206e6f7420617070726f766564000000000000006044820152606401610403565b60007f00000000000000000000000000000000000000000000000000000000000000009050836001600160a01b0316631e8979016040518163ffffffff1660e01b81526004016020604051808303816000875af115801561067c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a09190612f64565b506000846001600160a01b031663ae9187546040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107059190612f47565b905061075d604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6107b3604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6107d9604051806060016040528060008152602001600081526020016000151581525090565b60008790506000896001600160a01b03166349eefeee6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561081e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108429190612f64565b9050896001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a89190612f64565b836000018181525050896001600160a01b0316639484fb8e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109139190612f7d565b836040019015159081151581525050896001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa158015610960573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109849190612f64565b8360200181815250506000876001600160a01b0316622dade96040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f09190612f64565b90505b600083118015610a035750600182115b15610b7a576000876001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6c9190612f47565b8551604051630d293c7160e41b81526001600160a01b0380841660048301526024820192909252919250600091908e169063d293c71090604401602060405180830381865afa158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190612f64565b90508a811115610afc57600094505050610b7a565b670de0b6b3a76400008111610b2657610b158d83612186565b9750610b2187896124af565b610b67565b8560200151811015610b6057610b428d838589604001516125ab565b97508760a0015183610b549190612fb5565b9250610b2187896124af565b5050610b7a565b50506000199283019291909101906109f3565b600083118015610b8c57508360400151155b8015610b985750600182115b15610ecb576000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663716c53c26040518163ffffffff1660e01b815260040160408051808303816000875af1158015610bff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c239190612fc8565b875160c08a0151929450909250610c3991612fec565b610c439083612fb5565b91508660a0015181610c559190612fb5565b90506000896001600160a01b0316634d6228316040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbb9190612f47565b90508d5b600087118015610ccf5750600186115b15610ec65760008f6001600160a01b031663d293c710848b600001516040518363ffffffff1660e01b8152600401610d1c9291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015610d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5d9190612f64565b90508d811115610d6d5750610ec6565b6040517fb72703ac0000000000000000000000000000000000000000000000000000000081526001600160a01b03808516600483015260001999909901988491908e169063b72703ac90602401602060405180830381865afa158015610dd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfb9190612f47565b93506000610e0987876128e0565b90506714d1120d7b16000081101580610e225750808310155b15610e2f57505050610ec6565b610e4484838a8e602001518f60000151612906565b9c508c60a00151600003610e5a57505050610cbf565b60a08d0151610e699089612fb5565b97508a600001518d61012001518e60c00151610e859190613003565b610e8f9190612fec565b610e999088612fb5565b96508c60a0015186610eab9190612fb5565b9550610eb78c8e6124af565b50506000199096019550610cbf565b505050505b6000856020015111610f1f5760405162461bcd60e51b815260206004820152601460248201527f6e6f7468696e6720746f206c69717569646174650000000000000000000000006044820152606401610403565b60008560a001511180610f36575060008560c00151115b156110c457876001600160a01b031663e66667338c6001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fac9190612f47565b60a088015160c08901516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381600087803b15801561101c57600080fd5b505af1158015611030573d6000803e3d6000fd5b5050505060a085015160c08601516040517fe9186c940000000000000000000000000000000000000000000000000000000081526001600160a01b038b8116600483015260248201939093526044810191909152908c169063e9186c9490606401600060405180830381600087803b1580156110ab57600080fd5b505af11580156110bf573d6000803e3d6000fd5b505050505b60e0850151610100860151610120870151608088015160608901516040808b015190517f7541ae1b000000000000000000000000000000000000000000000000000000008152336004820152602481019690965260448601949094526064850192909252608484015260a483015260c48201526001600160a01b038c1690637541ae1b9060e401600060405180830381600087803b15801561116557600080fd5b505af1158015611179573d6000803e3d6000fd5b5050506020860151610120870151606088015188517f5823f33ee3da2874398138f21ff2fcd7078180caf18ccb37ac445d9a5abfa75f94506111bb9190612fb5565b6111c59190612fb5565b6060808901516080808b01516040808d0151815197885260208801969096528601929092529184015282015260a00160405180910390a15050505050505050505050565b6001600160a01b03821660009081526020819052604090205460ff166112715760405162461bcd60e51b815260206004820152601960248201527f54726f76654d616e61676572206e6f7420617070726f766564000000000000006044820152606401610403565b80516000036112e85760405162461bcd60e51b815260206004820152603660248201527f54726f76654d616e616765723a2043616c6c646174612061646472657373206160448201527f72726179206d757374206e6f7420626520656d707479000000000000000000006064820152608401610403565b816001600160a01b0316631e8979016040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134c9190612f64565b506113a3604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6113f9604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b61141f604051806060016040528060008152602001600081526020016000151581525090565b60007f000000000000000000000000000000000000000000000000000000000000000090506000816001600160a01b0316622dade96040518163ffffffff1660e01b8152600401602060405180830381865afa158015611483573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a79190612f64565b9050866001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156114e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150d9190612f64565b836000018181525050866001600160a01b0316639484fb8e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190612f7d565b836040019015159081151581525050866001600160a01b031663794e57246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e99190612f64565b8360200181815250506000876001600160a01b03166349eefeee6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611632573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116569190612f64565b875190915060005b818110801561166d5750600183115b1561178557600089828151811061168657611686613016565b60209081029190910101518751604051630d293c7160e41b81526001600160a01b0380841660048301526024820192909252919250600091908d169063d293c71090604401602060405180830381865afa1580156116e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170c9190612f64565b9050670de0b6b3a7640000811161172e576117278c83612186565b995061176a565b87602001518110156117635761174a8c83888b604001516125ab565b99508960a001518661175c9190612fb5565b955061176a565b5050611785565b611774898b6124af565b50506000199092019160010161165e565b81811080156117945750600183115b15611a1f576000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663716c53c26040518163ffffffff1660e01b815260040160408051808303816000875af11580156117fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181f9190612fc8565b895160c08c015192945090925061183591612fec565b61183f9083612fb5565b91508860a00151816118519190612fb5565b90505b83831080156118635750600185115b15611a1c5760008b848151811061187c5761187c613016565b60209081029190910101518951604051630d293c7160e41b81526001600160a01b0380841660048301526024820192909252919250600091908f169063d293c71090604401602060405180830381865afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190612f64565b9050846001019450670de0b6b3a7640000811161192a576119238e83612186565b9b506119b1565b8960200151811015611946576119238e838a8d604001516125ab565b600061195285856128e0565b90506714d1120d7b1600008110158061196b5750808210155b8061197757508a604001515b1561198457505050611854565b6119998f848b8e602001518f60000151612906565b9c508c60a001516000036119af57505050611854565b505b60a08c01516119c09089612fb5565b975089600001518c61012001518d60c001516119dc9190613003565b6119e69190612fec565b6119f09085612fb5565b93508b60a0015183611a029190612fb5565b9250611a0e8b8d6124af565b505060001990940193611854565b50505b6000876020015111611a995760405162461bcd60e51b815260206004820152602260248201527f54726f76654d616e616765723a206e6f7468696e6720746f206c69717569646160448201527f74650000000000000000000000000000000000000000000000000000000000006064820152608401610403565b60008760a001511180611ab0575060008760c00151115b15611c3e57846001600160a01b031663e66667338b6001600160a01b031663b2016bd46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190612f47565b60a08a015160c08b01516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03909316600484015260248301919091526044820152606401600060405180830381600087803b158015611b9657600080fd5b505af1158015611baa573d6000803e3d6000fd5b5050505060a087015160c08801516040517fe9186c940000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201939093526044810191909152908b169063e9186c9490606401600060405180830381600087803b158015611c2557600080fd5b505af1158015611c39573d6000803e3d6000fd5b505050505b60e087015161010088015161012089015160808a015160608b01516040808d015190517f7541ae1b000000000000000000000000000000000000000000000000000000008152336004820152602481019690965260448601949094526064850192909252608484015260a483015260c48201526001600160a01b038b1690637541ae1b9060e401600060405180830381600087803b158015611cdf57600080fd5b505af1158015611cf3573d6000803e3d6000fd5b505050602088015161012089015160608a01518a517f5823f33ee3da2874398138f21ff2fcd7078180caf18ccb37ac445d9a5abfa75f9450611d359190612fb5565b611d3f9190612fb5565b6060808b01516080808d01516040808f0151815197885260208801969096528601929092529184015282015260a00160405180910390a150505050505050505050565b6000611d8c611fcc565b6040517fe12f3a610000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03919091169063e12f3a6190602401602060405180830381865afa158015611deb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038a9190612f64565b6040517f21e378010000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906321e3780190602401602060405180830381865afa158015611e6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e929190612f64565b600114611f075760405162461bcd60e51b815260206004820152602f60248201527f54726f76654d616e616765723a2054726f766520646f6573206e6f742065786960448201527f7374206f7220697320636c6f73656400000000000000000000000000000000006064820152608401610403565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110611f3d57611f3d613016565b60200260200101906001600160a01b031690816001600160a01b031681525050611f678382611209565b505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610366573d6000803e3d6000fd5b612034611f6c565b6001600160a01b0316336001600160a01b0316146120945760405162461bcd60e51b815260206004820152600a60248201527f4f6e6c79206f776e6572000000000000000000000000000000000000000000006044820152606401610403565b600061209e611d82565b9050600081116120f05760405162461bcd60e51b815260206004820152601360248201527f6e6f20636c61696d61626c6520616d6f756e74000000000000000000000000006044820152606401610403565b6120f8611fcc565b6040517faad3ec960000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260248201849052919091169063aad3ec96906044016020604051808303816000875af1158015612162573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f679190612f64565b6121dc604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051632e46be5f60e21b81526001600160a01b038381166004830152600091829186169063b91af97c90602401608060405180830381865afa158015612227573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224b919061302c565b60208701929092528286526040516355ca38cf60e01b81526001600160a01b0388811660048301526024820194909452909450909250908616906355ca38cf90604401602060405180830381865afa1580156122ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cf9190612f64565b6040840181905283516122e29190613003565b835260208301516122f290612cf0565b60608401527f0000000000000000000000000000000000000000000000000000000000000000608084015260405163eb3007fd60e01b815260048101839052602481018290526001600160a01b0386169063eb3007fd90604401600060405180830381600087803b15801561236657600080fd5b505af115801561237a573d6000803e3d6000fd5b5050600060a0860181905260c08601525050825160e0840152606083015160208401516123a79190612fb5565b6101008401526040516325019ee960e01b81526001600160a01b0385811660048301528616906325019ee990602401600060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b50505050836001600160a01b03167fcb54d78ab66bd48ff5a1a1018e8826bc0df893b94b4d3945b3922e586eaa048a84600001518560200151866040015160026040516124549493929190613084565b60405180910390a2836001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b6000806000600260405161249e9493929190613084565b60405180910390a250505b92915050565b806060015182606001516124c39190613003565b6060830152608080820151908301516124dc9190613003565b6080830152805160208301516124f29190613003565b60208301526040808201519083015161250b9190613003565b6040830152602081015182516125219190613003565b825260a080820151908301516125379190613003565b60a083015260c080820151908301516125509190613003565b60c083015260e080820151908301516125699190613003565b60e083015261010080820151908301516125839190613003565b610100830152610120808201519083015161259e9190613003565b6101209092019190915250565b612601604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051632e46be5f60e21b81526001600160a01b038581166004830152600091829188169063b91af97c90602401608060405180830381865afa15801561264c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612670919061302c565b60208701929092528286526040516355ca38cf60e01b81526001600160a01b038a811660048301526024820194909452909450909250908816906355ca38cf90604401602060405180830381865afa1580156126d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f49190612f64565b6040840181905283516127079190613003565b835260405163eb3007fd60e01b815260048101839052602481018290526001600160a01b0388169063eb3007fd90604401600060405180830381600087803b15801561275257600080fd5b505af1158015612766573d6000803e3d6000fd5b505050506127778360200151612cf0565b606084018190527f0000000000000000000000000000000000000000000000000000000000000000608085015260208401516000916127b591612fb5565b90506127c78460000151828888612cfd565b61010088015260e087015260c086015260a08501526040516325019ee960e01b81526001600160a01b0388811660048301528916906325019ee990602401600060405180830381600087803b15801561281f57600080fd5b505af1158015612833573d6000803e3d6000fd5b50505050866001600160a01b03167fcb54d78ab66bd48ff5a1a1018e8826bc0df893b94b4d3945b3922e586eaa048a85600001518660200151876040015160016040516128839493929190613084565b60405180910390a2866001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b600080600060016040516128cd9493929190613084565b60405180910390a2505050949350505050565b600081156128fd5760006128f483856130a6565b91506124a99050565b506000196124a9565b61295c604051806101400160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051632e46be5f60e21b81526001600160a01b0386811660048301526000918291829182918b169063b91af97c90602401608060405180830381865afa1580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf919061302c565b6040516355ca38cf60e01b81526001600160a01b038e811660048301526024820186905294985092965090945092506000918c16906355ca38cf90604401602060405180830381865afa158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190612f64565b9050612a5a8186613003565b945088851115612a6e575050505050612ce7565b60405163eb3007fd60e01b815260048101849052602481018390526001600160a01b038c169063eb3007fd90604401600060405180830381600087803b158015612ab757600080fd5b505af1158015612acb573d6000803e3d6000fd5b505050508085612adb9190613003565b80875260408701829052602087018590526000908890612afc908b90612fec565b612b0691906130a6565b9050612b1181612cf0565b606088018190527f00000000000000000000000000000000000000000000000000000000000000006080890152875160a0890152612b4f9082612fb5565b60c08801526040516325019ee960e01b81526001600160a01b038c811660048301528d16906325019ee990602401600060405180830381600087803b158015612b9757600080fd5b505af1158015612bab573d6000803e3d6000fd5b5050505060008186612bbd9190612fb5565b90508015612c495761012088018190526040517f789c6b930000000000000000000000000000000000000000000000000000000081526001600160a01b038d81166004830152602482018390528e169063789c6b9390604401600060405180830381600087803b158015612c3057600080fd5b505af1158015612c44573d6000803e3d6000fd5b505050505b8b6001600160a01b03167fcb54d78ab66bd48ff5a1a1018e8826bc0df893b94b4d3945b3922e586eaa048a888a60c00151866002604051612c8d9493929190613084565b60405180910390a28b6001600160a01b03167fc3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b60008060006002604051612cd79493929190613084565b60405180910390a2505050505050505b95945050505050565b60006124a960c8836130a6565b600080600080600086118015612d11575084155b15612d5657612d208887612d6e565b935087612d2d8589612fec565b612d3791906130a6565b9250612d438489612fb5565b9150612d4f8388612fb5565b9050612d63565b5060009250829150869050855b945094509450949050565b6000818310612d7d5781612d7f565b825b9392505050565b6001600160a01b0381168114612d9b57600080fd5b50565b600060208284031215612db057600080fd5b8135612d7f81612d86565b8035612dc681612d86565b919050565b600080600060608486031215612de057600080fd5b8335612deb81612d86565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215612e2957600080fd5b8235612e3481612d86565b915060208381013567ffffffffffffffff80821115612e5257600080fd5b818601915086601f830112612e6657600080fd5b813581811115612e7857612e78612e00565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715612ebb57612ebb612e00565b604052918252848201925083810185019189831115612ed957600080fd5b938501935b82851015612efe57612eef85612dbb565b84529385019392850192612ede565b8096505050505050509250929050565b60008060408385031215612f2157600080fd5b8235612f2c81612d86565b91506020830135612f3c81612d86565b809150509250929050565b600060208284031215612f5957600080fd5b8151612d7f81612d86565b600060208284031215612f7657600080fd5b5051919050565b600060208284031215612f8f57600080fd5b81518015158114612d7f57600080fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156124a9576124a9612f9f565b60008060408385031215612fdb57600080fd5b505080516020909101519092909150565b80820281158282048414176124a9576124a9612f9f565b808201808211156124a9576124a9612f9f565b634e487b7160e01b600052603260045260246000fd5b6000806000806080858703121561304257600080fd5b505082516020840151604085015160609095015191969095509092509050565b6004811061308057634e487b7160e01b600052602160045260246000fd5b9052565b848152602081018490526040810183905260808101612ce76060830184613062565b6000826130c357634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220c0e1edd114090163b5ee8ad98dbc7e3c8292b2edbba32edfa8840de0a6bfe16364736f6c63430008130033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "batchLiquidateTroves(address,address[])": {
        "details": "Reverts if there is not a single trove that can be liquidated",
        "params": {
          "_troveArray": "List of borrower addresses to liquidate. Troves that were already liquidated, or cannot be liquidated, are ignored."
        }
      },
      "liquidate(address,address)": {
        "details": "Reverts if the trove is not active, or cannot be liquidated",
        "params": {
          "borrower": "Borrower address to liquidate"
        }
      },
      "liquidateTroves(address,uint256,uint256)": {
        "details": "Iterates through troves starting with the lowest ICR",
        "params": {
          "maxICR": "Maximum ICR to liquidate. Should be set to MCR if the system is not in recovery mode, to minimize gas costs for this call.",
          "maxTrovesToLiquidate": "The maximum number of troves to liquidate"
        }
      }
    },
    "title": "Propel Liquidation Manager",
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "batchLiquidateTroves(address,address[])": {
        "notice": "Liquidate a custom list of troves"
      },
      "liquidate(address,address)": {
        "notice": "Liquidate a single trove"
      },
      "liquidateTroves(address,uint256,uint256)": {
        "notice": "Liquidate a sequence of troves"
      }
    },
    "notice": "Based on Liquity's `TroveManager` https://github.com/liquity/dev/blob/main/packages/contracts/contracts/TroveManager.sol This contract has a 1:n relationship with `TroveManager`, handling liquidations for every active collateral within the system. Anyone can call to liquidate an eligible trove at any time. There is no requirement that liquidations happen in order according to trove ICRs. There are three ways that a liquidation can occur: 1. ICR <= 100 The trove's entire debt and collateral is redistributed between remaining active troves. 2. 100 < ICR < MCR The trove is liquidated using stability pool deposits. The collateral is distributed amongst stability pool depositors. If the stability pool's balance is insufficient to completely repay the trove, the remaining debt and collateral is redistributed between the remaining active troves. 3. MCR <= ICR < TCR && TCR < CCR The trove is liquidated using stability pool deposits. Collateral equal to MCR of the value of the debt is distributed between stability pool depositors. The remaining collateral is left claimable by the trove owner.",
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 9884,
        "contract": "contracts/core/LiquidationManager.sol:LiquidationManager",
        "label": "_enabledTroveManagers",
        "offset": 0,
        "slot": "0",
        "type": "t_mapping(t_contract(ITroveManager)32888,t_bool)"
      }
    ],
    "types": {
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_contract(ITroveManager)32888": {
        "encoding": "inplace",
        "label": "contract ITroveManager",
        "numberOfBytes": "20"
      },
      "t_mapping(t_contract(ITroveManager)32888,t_bool)": {
        "encoding": "mapping",
        "key": "t_contract(ITroveManager)32888",
        "label": "mapping(contract ITroveManager => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      }
    }
  }
}