{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract Currency",
          "name": "_currencyToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_baseRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_debtCeiling",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "BadCollateralRatio",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CollateralAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CollateralDebtCeilingExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CollateralDoesNotExist",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "CollateralRatioNotImproved",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EthTransferFailed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "GlobalDebtCeilingExceeded",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientCurrencyAmountToPay",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidStabilityModule",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NewOwnerIsZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoHandoverRequest",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotEnoughCollateralToPay",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotFeedContract",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotOwnerOrReliedUpon",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotPaused",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Paused",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "PositionIsSafe",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TotalUserCollateralBelowFloor",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnrecognizedParam",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroCollateral",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "CollateralDeposited",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "collateralAddress",
          "type": "address"
        }
      ],
      "name": "CollateralTypeAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "CollateralWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "CurrencyBurned",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "CurrencyMinted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "FeesPaid",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "liquidator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "currencyAmountPaid",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "collateralAmountCovered",
          "type": "uint256"
        }
      ],
      "name": "Liquidated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "CURRENCY_TOKEN",
      "outputs": [
        {
          "internalType": "contract Currency",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "baseRateInfo",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "rate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "accumulatedRate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastUpdateTime",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "burnCurrency",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cancelOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "",
          "type": "address"
        }
      ],
      "name": "collateralMapping",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "totalDepositedCollateral",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "totalBorrowedAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "liquidationThreshold",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "liquidationBonus",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "rate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accumulatedRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lastUpdateTime",
              "type": "uint256"
            }
          ],
          "internalType": "struct IVault.RateInfo",
          "name": "rateInfo",
          "type": "tuple"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "debtCeiling",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "collateralFloorPerPosition",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "additionalCollateralPrecision",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "completeOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_rate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_liquidationThreshold",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_liquidationBonus",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_debtCeiling",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_collateralFloorPerPosition",
          "type": "uint256"
        }
      ],
      "name": "createCollateralType",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "debt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "debtCeiling",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_reliedUpon",
          "type": "address"
        }
      ],
      "name": "deny",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "depositCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feedModule",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_currencyAmountToPay",
          "type": "uint256"
        }
      ],
      "name": "liquidate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "mintCurrency",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "result",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "ownershipHandoverExpiresAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paidFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rateModule",
      "outputs": [
        {
          "internalType": "contract IRate",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_tokenAddress",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        }
      ],
      "name": "recoverToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_relyUpon",
          "type": "address"
        }
      ],
      "name": "rely",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "relyMapping",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "requestOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "stabilityModule",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "status",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_baseRate",
          "type": "uint256"
        }
      ],
      "name": "updateBaseRate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "enum IVault.ModifiableParameters",
          "name": "_param",
          "type": "uint8"
        },
        {
          "internalType": "uint256",
          "name": "_data",
          "type": "uint256"
        }
      ],
      "name": "updateCollateralData",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_debtCeiling",
          "type": "uint256"
        }
      ],
      "name": "updateDebtCeiling",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_feedModule",
          "type": "address"
        }
      ],
      "name": "updateFeedModule",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "updatePrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IRate",
          "name": "_rateModule",
          "type": "address"
        }
      ],
      "name": "updateRateModule",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_stabilityModule",
          "type": "address"
        }
      ],
      "name": "updateStabilityModule",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "vaultMapping",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "depositedCollateral",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "borrowedAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "accruedFees",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastTotalAccumulatedRate",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ERC20Token",
          "name": "_collateralToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        }
      ],
      "name": "withdrawCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdrawFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": {
    "object": "0x60a06040523480156200001157600080fd5b50604051620031bc380380620031bc83398101604081905262000034916200009e565b6002600055620000443362000062565b6001600160a01b0390921660805242600655600455600755620000e3565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b600080600060608486031215620000b457600080fd5b83516001600160a01b0381168114620000cc57600080fd5b602085015160409095015190969495509392505050565b60805161308c62000130600039600081816107b801528181610d4201528181611d4c01528181611de30152818161215b015281816122ff015281816124470152612abe015261308c6000f3fe6080604052600436106102855760003560e01c806365fae35e11610153578063d707eed5116100cb578063f04e283e1161007f578063f970c3b711610064578063f970c3b71461082d578063feaea5861461084d578063fee81cf41461086d57600080fd5b8063f04e283e14610807578063f2fde38b1461081a57600080fd5b8063e2c7283f116100b0578063e2c7283f14610739578063e72531c8146107a6578063ea061ad4146107da57600080fd5b8063d707eed514610703578063e1c84ea41461072357600080fd5b80639c52a7f111610122578063aab3f86811610107578063aab3f868146105da578063b80a0a77146105fa578063c665471f1461061057600080fd5b80639c52a7f11461058d578063a12ad552146105ad57600080fd5b806365fae35e1461051c578063715018a61461053c5780638456cb59146105445780638da5cb5b1461055957600080fd5b80633f4ba83a1161020157806354d1f13d116101b55780635820ba631161019a5780635820ba63146104915780635881fc33146104b1578063645ba425146104fc57600080fd5b806354d1f13d1461046957806357b35a781461047157600080fd5b8063476343ee116101e6578063476343ee1461041457806349a66ca3146104295780634fa739191461044957600080fd5b80633f4ba83a146103df578063457972de146103f457600080fd5b806313f60c9a11610258578063256929621161023d5780632569296214610365578063330283aa1461036d578063336d391e1461038d57600080fd5b806313f60c9a14610315578063200d2ed21461034f57600080fd5b80630408ccd61461028a5780630ae5ccab146102ac5780630dca59c1146102cc5780631218c5fd146102f5575b600080fd5b34801561029657600080fd5b506102aa6102a5366004612c22565b6108a0565b005b3480156102b857600080fd5b506102aa6102c7366004612c22565b61092b565b3480156102d857600080fd5b506102e260085481565b6040519081526020015b60405180910390f35b34801561030157600080fd5b506102aa610310366004612c3f565b6109b6565b34801561032157600080fd5b5060045460055460065461033492919083565b604080519384526020840192909252908201526060016102ec565b34801561035b57600080fd5b506102e260005481565b6102aa6109ff565b34801561037957600080fd5b506102aa610388366004612c3f565b610a4f565b34801561039957600080fd5b506003546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ec565b3480156103eb57600080fd5b506102aa610b36565b34801561040057600080fd5b506102aa61040f366004612c58565b610b45565b34801561042057600080fd5b506102aa610c61565b34801561043557600080fd5b506102aa610444366004612c84565b610db4565b34801561045557600080fd5b506102aa610464366004612cd5565b61111f565b6102aa6111df565b34801561047d57600080fd5b506102aa61048c366004612d16565b61121b565b34801561049d57600080fd5b506102aa6104ac366004612c84565b61142c565b3480156104bd57600080fd5b506104ec6104cc366004612d4a565b600c60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ec565b34801561050857600080fd5b506102aa610517366004612d83565b6115c5565b34801561052857600080fd5b506102aa610537366004612c22565b611786565b6102aa61181e565b34801561055057600080fd5b506102aa611826565b34801561056557600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927546103ba565b34801561059957600080fd5b506102aa6105a8366004612c22565b611835565b3480156105b957600080fd5b506002546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105e657600080fd5b506102aa6105f5366004612c84565b6118ca565b34801561060657600080fd5b506102e260095481565b34801561061c57600080fd5b506106a161062b366004612c22565b600a6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160405180606001604052908160008201548152602001600182015481526020016002820154815250509080600701549080600801549080600901549080600a0154905089565b60408051998a526020808b0199909952898101979097526060890195909552835160808901529583015160a0880152919093015160c086015260e0850192909252610100840191909152610120830191909152610140820152610160016102ec565b34801561070f57600080fd5b506102aa61071e366004612c22565b611b1d565b34801561072f57600080fd5b506102e260075481565b34801561074557600080fd5b50610786610754366004612d4a565b600b60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102ec565b3480156107b257600080fd5b506103ba7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107e657600080fd5b506001546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6102aa610815366004612c22565b611ba8565b6102aa610828366004612c22565b611be8565b34801561083957600080fd5b506102aa610848366004612cd5565b611c0f565b34801561085957600080fd5b506102aa610868366004612d4a565b611d0e565b34801561087957600080fd5b506102e2610888366004612c22565b63389a75e1600c908152600091909152602090205490565b6001600054036108dc576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e4612043565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600160005403610967576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61096f612043565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6001600054036109f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109fa612043565b600755565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600160005403610a8b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a93612043565b6003546040517fd14a27fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d14a27fd90610ae9906004908101612dcf565b602060405180830381865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a9190612df0565b60055542600655600455565b610b3e612043565b6002600055565b600160005403610b81576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a6020526040812060040154839103610be3576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff163314610c34576040517f16ee083800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff9091166000908152600a6020526040902060070155565b600160005403610c9d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff1680610ced576040517fd389b01000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009805460009091556040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daf9190612e09565b505050565b600160005403610df0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a6020526040812060040154859103610e52576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff81163314801590610eaa575073ffffffffffffffffffffffffffffffffffffffff81166000908152600c6020908152604080832033845290915290205460ff16155b15610ee1576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600b60209081526040808320948a168352938152838220928252600a905291909120815460098201541115610f5f576040517f8464610300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075485600854610f709190612e5a565b1115610fa8576040517fdd0b23bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060080154858260010154610fbd9190612e5a565b1115610ff5576040517fa99870f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018201541561100e57611009818361207b565b6110af565b6003546040517fcf5696cb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cf5696cb9061106890600490858201908201612e6d565b602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190612df0565b60038301555b8673ffffffffffffffffffffffffffffffffffffffff167f2794e993350ecd3e426a1d6ba9554613ee597988342e95658e5e97a121565852866040516110f791815260200190565b60405180910390a261110b818388886120c2565b61111581836121c9565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040812060040154849103611181576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168352938152838220928252600a9052919091206111ca818361207b565b6111d78183873388612210565b505050505050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b600160005403611257576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61125f612043565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260408120600401548491036112c1576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a60205260408120908460048111156112f9576112f9612ea9565b036113ae576003546040517fd14a27fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d14a27fd906113569060048086019101612dcf565b602060405180830381865afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190612df0565b600582015542600682015560048101839055611425565b60018460048111156113c2576113c2612ea9565b036113d35760088101839055611425565b60028460048111156113e7576113e7612ea9565b036113f85760098101839055611425565b600384600481111561140c5761140c612ea9565b0361141d5760038101839055611425565b600281018390555b5050505050565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604081206004015485910361148e576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff811633148015906114e6575073ffffffffffffffffffffffffffffffffffffffff81166000908152600c6020908152604080832033845290915290205460ff16155b1561151d576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600b60209081526040808320948a168352938152838220928252600a905291909120611566818361207b565b6040805173ffffffffffffffffffffffffffffffffffffffff8881168252602082018890528916917f45892a46e6cef329bb642da6d69846d324db43d19008edc141ed82382eda1bee910160405180910390a261110b888888886124ca565b600160005403611601576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611609612043565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600a6020526040902060048101541561166a576040517fbf508dc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480820187905542600683015560028201869055600382018590556008820184905560098201839055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff8a169263313ce567928082019260209290918290030181865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117219190612ed8565b61172f9060ff166012612efb565b600a82015560405173ffffffffffffffffffffffffffffffffffffffff881681527f8abd6b05a86c62b0ddaec80e50ab0326ee89a599589d4b4126cf8f94ff3d0a879060200160405180910390a150505050505050565b6001600054036117c2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c6020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610285612043565b61182e612043565b6001600055565b600160005403611871576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c6020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604081206004015485910361192c576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8086166000818152600b602090815260408083209489168352938152838220928252600a905291909120611975818361207b565b6000611981828461257c565b9050816002015481116119c0576040517f819a066c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85036119fe57826002015483600101546119fb9190612e5a565b94505b6000611a0a838761261c565b90506000611a1a6012600a61302e565b611a2590606461303a565b6003850154611a34908461303a565b611a3e9190613051565b90506000611a4c8284612e5a565b8654909150811115611a5c575084545b60408051338152602081018a905290810182905273ffffffffffffffffffffffffffffffffffffffff8b16907f1f0c6615429d1cdae0dfa233abf91d3b31cdbdd82c8081389832a61e1072f1ea9060600160405180910390a2611ac18b8b8b846124ca565b611ace85878c338c612210565b611ad8858761257c565b8411611b10576040517f07af690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b600160005403611b59576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b61612043565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611bb0612043565b63389a75e1600c52806000526020600c208054421115611bd857636f5e88186000526004601cfd5b60009055611be581612680565b50565b611bf0612043565b8060601b611c0657637448fbae6000526004601cfd5b611be581612680565b600160005403611c4b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040812060040154849103611cad576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167fd7243f6f8212d5188fd054141cf6ea89cfc0d91facb8c3afe2f88a135848014283604051611cf591815260200190565b60405180910390a2611d088484846126e6565b50505050565b600160005403611d4a576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed3576009546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9184919084906370a0823190602401602060405180830381865afa158015611e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e599190612df0565b611e639190612efb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015610d8b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff8216611f885760008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b5050905080610daf576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600a6020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528492610daf9284928692906370a0823190602401602060405180830381865afa15801561200c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120309190612df0565b61203a9190612efb565b6128b1565b5050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314612079576382b429006000526004601cfd5b565b6000806120888484612900565b91509150808360030181905550816000036120a35750505050565b818360020160008282546120b79190612e5a565b909155505050505050565b808360010160008282546120d69190612e5a565b92505081905550808460010160008282546120f19190612e5a565b92505081905550806008600082825461210a9190612e5a565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b6020604051808303816000875af11580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114259190612e09565b81600201546121d8838361257c565b111561203f576040517f963c7ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600101548111612372578084600101600082825461222f9190612efb565b925050819055508085600101600082825461224a9190612efb565b9250508190555080600860008282546122639190612efb565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8416907fcb55e9f35638c4fdb4390d3a385ac1d72a8f72e4dcf0eb1f3c79d144b1023f859060200160405180910390a26040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac906044016020604051808303816000875af1158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190612e09565b50611425565b600180850180546000918290559187018054839290612392908490612efb565b9250508190555080600860008282546123ab9190612efb565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8516907fcb55e9f35638c4fdb4390d3a385ac1d72a8f72e4dcf0eb1f3c79d144b1023f859060200160405180910390a26040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac906044016020604051808303816000875af1158015612490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b49190612e09565b506111d78585856124c58587612efb565b6129ef565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600b602090815260408083209387168352929052908120805483929061250e908490612efb565b909155505073ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604081208054839290612548908490612efb565b909155505073ffffffffffffffffffffffffffffffffffffffff84163b60000361257157600080fd5b611d088483836128b1565b600080826002015483600101546125939190612e5a565b9050806000036125a7576000915050612616565b82546000036125d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050612616565b60006125e58585612aed565b90506126116125f66012600a61302e565b61260190606461303a565b61260b908461303a565b82612b46565b925050505b92915050565b600082600a0154600a61262f919061302e565b64e8d4a510008460070154612644919061303a565b61264e919061303a565b61265a6012600a61302e565b61266590600161303a565b61266f908461303a565b6126799190613051565b9392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015612753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127779190612df0565b905061278584333085612b86565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090829073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa1580156127f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128189190612df0565b6128229190612efb565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600b6020908152604080832093891683529290529081208054929350839290919061286b908490612e5a565b909155505073ffffffffffffffffffffffffffffffffffffffff85166000908152600a6020526040812080548392906128a5908490612e5a565b90915550505050505050565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d1560016000511417166128f6576390b8ec186000526004601cfd5b6000603452505050565b6003546040517fcf5696cb0000000000000000000000000000000000000000000000000000000081526000918291829173ffffffffffffffffffffffffffffffffffffffff169063cf5696cb9061295f90600490898201908201612e6d565b602060405180830381865afa15801561297c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a09190612df0565b905060006129b06012600a61302e565b6129bb90606461303a565b600186015460038701546129cf9085612efb565b6129d9919061303a565b6129e39190613051565b96919550909350505050565b80846002016000828254612a039190612efb565b925050819055508060096000828254612a1c9190612e5a565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8416907f6a41f86b2a18fe00e10a9bd078e790ae82c2627a6f940166bddc2db475194a5f9060200160405180910390a26040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401612186565b600080612afc6012600a61302e565b612b0790600161303a565b64e8d4a510008560070154612b20878760000154612be3565b612b2a919061303a565b612b34919061303a565b612b3e9190613051565b949350505050565b600081600003612b5557600080fd5b82600003612b6557506000612616565b81612b71600185612efb565b612b7b9190613051565b612679906001612e5a565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716612bd557637939f4246000526004601cfd5b600060605260405250505050565b600082600a0154600a612bf6919061302e565b612679908361303a565b73ffffffffffffffffffffffffffffffffffffffff81168114611be557600080fd5b600060208284031215612c3457600080fd5b813561267981612c00565b600060208284031215612c5157600080fd5b5035919050565b60008060408385031215612c6b57600080fd5b8235612c7681612c00565b946020939093013593505050565b60008060008060808587031215612c9a57600080fd5b8435612ca581612c00565b93506020850135612cb581612c00565b92506040850135612cc581612c00565b9396929550929360600135925050565b600080600060608486031215612cea57600080fd5b8335612cf581612c00565b92506020840135612d0581612c00565b929592945050506040919091013590565b600080600060608486031215612d2b57600080fd5b8335612d3681612c00565b9250602084013560058110612d0557600080fd5b60008060408385031215612d5d57600080fd5b8235612d6881612c00565b91506020830135612d7881612c00565b809150509250929050565b60008060008060008060c08789031215612d9c57600080fd5b8635612da781612c00565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b81548152600182015460208201526002820154604082015260608101612616565b600060208284031215612e0257600080fd5b5051919050565b600060208284031215612e1b57600080fd5b8151801515811461267957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561261657612616612e2b565b82548152600183015460208201526002830154604082015260c081018254606083015260018301546080830152600283015460a0830152612679565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215612eea57600080fd5b815160ff8116811461267957600080fd5b8181038181111561261657612616612e2b565b600181815b80851115612f6757817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612f4d57612f4d612e2b565b80851615612f5a57918102915b93841c9390800290612f13565b509250929050565b600082612f7e57506001612616565b81612f8b57506000612616565b8160018114612fa15760028114612fab57612fc7565b6001915050612616565b60ff841115612fbc57612fbc612e2b565b50506001821b612616565b5060208310610133831016604e8410600b8410161715612fea575081810a612616565b612ff48383612f0e565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561302657613026612e2b565b029392505050565b60006126798383612f6f565b808202811582820484141761261657612616612e2b565b600082613087577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056",
    "sourceMap": "506:35048:38:-:0;;;1859:296;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;203:1:29;280:6;:13;1947:28:38;1964:10;1947:16;:28::i;:::-;-1:-1:-1;;;;;1985:31:38;;;;;2057:15;2027:27;:45;:12;2082:29;2122:11;:26;506:35048;;4883:1190:22;-1:-1:-1;;;;;5793:26:22;-1:-1:-1;;5876:29:22;;;5793:26;6031:1;5991:38;6031:1;;5980:63;4883:1190;:::o;14:430:60:-;120:6;128;136;189:2;177:9;168:7;164:23;160:32;157:52;;;205:1;202;195:12;157:52;231:16;;-1:-1:-1;;;;;276:31:60;;266:42;;256:70;;322:1;319;312:12;256:70;390:2;375:18;;369:25;434:2;419:18;;;413:25;345:5;;369:25;;-1:-1:-1;413:25:60;14:430;-1:-1:-1;;;14:430:60:o;:::-;506:35048:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;",
    "linkReferences": {}
  },
  "deployedBytecode": {
    "object": "0x6080604052600436106102855760003560e01c806365fae35e11610153578063d707eed5116100cb578063f04e283e1161007f578063f970c3b711610064578063f970c3b71461082d578063feaea5861461084d578063fee81cf41461086d57600080fd5b8063f04e283e14610807578063f2fde38b1461081a57600080fd5b8063e2c7283f116100b0578063e2c7283f14610739578063e72531c8146107a6578063ea061ad4146107da57600080fd5b8063d707eed514610703578063e1c84ea41461072357600080fd5b80639c52a7f111610122578063aab3f86811610107578063aab3f868146105da578063b80a0a77146105fa578063c665471f1461061057600080fd5b80639c52a7f11461058d578063a12ad552146105ad57600080fd5b806365fae35e1461051c578063715018a61461053c5780638456cb59146105445780638da5cb5b1461055957600080fd5b80633f4ba83a1161020157806354d1f13d116101b55780635820ba631161019a5780635820ba63146104915780635881fc33146104b1578063645ba425146104fc57600080fd5b806354d1f13d1461046957806357b35a781461047157600080fd5b8063476343ee116101e6578063476343ee1461041457806349a66ca3146104295780634fa739191461044957600080fd5b80633f4ba83a146103df578063457972de146103f457600080fd5b806313f60c9a11610258578063256929621161023d5780632569296214610365578063330283aa1461036d578063336d391e1461038d57600080fd5b806313f60c9a14610315578063200d2ed21461034f57600080fd5b80630408ccd61461028a5780630ae5ccab146102ac5780630dca59c1146102cc5780631218c5fd146102f5575b600080fd5b34801561029657600080fd5b506102aa6102a5366004612c22565b6108a0565b005b3480156102b857600080fd5b506102aa6102c7366004612c22565b61092b565b3480156102d857600080fd5b506102e260085481565b6040519081526020015b60405180910390f35b34801561030157600080fd5b506102aa610310366004612c3f565b6109b6565b34801561032157600080fd5b5060045460055460065461033492919083565b604080519384526020840192909252908201526060016102ec565b34801561035b57600080fd5b506102e260005481565b6102aa6109ff565b34801561037957600080fd5b506102aa610388366004612c3f565b610a4f565b34801561039957600080fd5b506003546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ec565b3480156103eb57600080fd5b506102aa610b36565b34801561040057600080fd5b506102aa61040f366004612c58565b610b45565b34801561042057600080fd5b506102aa610c61565b34801561043557600080fd5b506102aa610444366004612c84565b610db4565b34801561045557600080fd5b506102aa610464366004612cd5565b61111f565b6102aa6111df565b34801561047d57600080fd5b506102aa61048c366004612d16565b61121b565b34801561049d57600080fd5b506102aa6104ac366004612c84565b61142c565b3480156104bd57600080fd5b506104ec6104cc366004612d4a565b600c60209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102ec565b34801561050857600080fd5b506102aa610517366004612d83565b6115c5565b34801561052857600080fd5b506102aa610537366004612c22565b611786565b6102aa61181e565b34801561055057600080fd5b506102aa611826565b34801561056557600080fd5b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927546103ba565b34801561059957600080fd5b506102aa6105a8366004612c22565b611835565b3480156105b957600080fd5b506002546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105e657600080fd5b506102aa6105f5366004612c84565b6118ca565b34801561060657600080fd5b506102e260095481565b34801561061c57600080fd5b506106a161062b366004612c22565b600a6020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040160405180606001604052908160008201548152602001600182015481526020016002820154815250509080600701549080600801549080600901549080600a0154905089565b60408051998a526020808b0199909952898101979097526060890195909552835160808901529583015160a0880152919093015160c086015260e0850192909252610100840191909152610120830191909152610140820152610160016102ec565b34801561070f57600080fd5b506102aa61071e366004612c22565b611b1d565b34801561072f57600080fd5b506102e260075481565b34801561074557600080fd5b50610786610754366004612d4a565b600b60209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102ec565b3480156107b257600080fd5b506103ba7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107e657600080fd5b506001546103ba9073ffffffffffffffffffffffffffffffffffffffff1681565b6102aa610815366004612c22565b611ba8565b6102aa610828366004612c22565b611be8565b34801561083957600080fd5b506102aa610848366004612cd5565b611c0f565b34801561085957600080fd5b506102aa610868366004612d4a565b611d0e565b34801561087957600080fd5b506102e2610888366004612c22565b63389a75e1600c908152600091909152602090205490565b6001600054036108dc576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108e4612043565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600160005403610967576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61096f612043565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6001600054036109f2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109fa612043565b600755565b60006202a30067ffffffffffffffff164201905063389a75e1600c5233600052806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b600160005403610a8b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a93612043565b6003546040517fd14a27fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d14a27fd90610ae9906004908101612dcf565b602060405180830381865afa158015610b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2a9190612df0565b60055542600655600455565b610b3e612043565b6002600055565b600160005403610b81576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a6020526040812060040154839103610be3576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff163314610c34576040517f16ee083800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5073ffffffffffffffffffffffffffffffffffffffff9091166000908152600a6020526040902060070155565b600160005403610c9d576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015473ffffffffffffffffffffffffffffffffffffffff1680610ced576040517fd389b01000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009805460009091556040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af1158015610d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610daf9190612e09565b505050565b600160005403610df0576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a6020526040812060040154859103610e52576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff81163314801590610eaa575073ffffffffffffffffffffffffffffffffffffffff81166000908152600c6020908152604080832033845290915290205460ff16155b15610ee1576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600b60209081526040808320948a168352938152838220928252600a905291909120815460098201541115610f5f576040517f8464610300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075485600854610f709190612e5a565b1115610fa8576040517fdd0b23bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060080154858260010154610fbd9190612e5a565b1115610ff5576040517fa99870f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018201541561100e57611009818361207b565b6110af565b6003546040517fcf5696cb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cf5696cb9061106890600490858201908201612e6d565b602060405180830381865afa158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190612df0565b60038301555b8673ffffffffffffffffffffffffffffffffffffffff167f2794e993350ecd3e426a1d6ba9554613ee597988342e95658e5e97a121565852866040516110f791815260200190565b60405180910390a261110b818388886120c2565b61111581836121c9565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040812060040154849103611181576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8085166000818152600b602090815260408083209488168352938152838220928252600a9052919091206111ca818361207b565b6111d78183873388612210565b505050505050565b63389a75e1600c523360005260006020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b600160005403611257576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61125f612043565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260408120600401548491036112c1576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a60205260408120908460048111156112f9576112f9612ea9565b036113ae576003546040517fd14a27fd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d14a27fd906113569060048086019101612dcf565b602060405180830381865afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190612df0565b600582015542600682015560048101839055611425565b60018460048111156113c2576113c2612ea9565b036113d35760088101839055611425565b60028460048111156113e7576113e7612ea9565b036113f85760098101839055611425565b600384600481111561140c5761140c612ea9565b0361141d5760038101839055611425565b600281018390555b5050505050565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604081206004015485910361148e576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff811633148015906114e6575073ffffffffffffffffffffffffffffffffffffffff81166000908152600c6020908152604080832033845290915290205460ff16155b1561151d576040517fed76312100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600b60209081526040808320948a168352938152838220928252600a905291909120611566818361207b565b6040805173ffffffffffffffffffffffffffffffffffffffff8881168252602082018890528916917f45892a46e6cef329bb642da6d69846d324db43d19008edc141ed82382eda1bee910160405180910390a261110b888888886124ca565b600160005403611601576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611609612043565b73ffffffffffffffffffffffffffffffffffffffff86166000908152600a6020526040902060048101541561166a576040517fbf508dc400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480820187905542600683015560028201869055600382018590556008820184905560098201839055604080517f313ce567000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff8a169263313ce567928082019260209290918290030181865afa1580156116fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117219190612ed8565b61172f9060ff166012612efb565b600a82015560405173ffffffffffffffffffffffffffffffffffffffff881681527f8abd6b05a86c62b0ddaec80e50ab0326ee89a599589d4b4126cf8f94ff3d0a879060200160405180910390a150505050505050565b6001600054036117c2576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c6020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610285612043565b61182e612043565b6001600055565b600160005403611871576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600c6020908152604080832073ffffffffffffffffffffffffffffffffffffffff9490941683529290522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604081206004015485910361192c576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8086166000818152600b602090815260408083209489168352938152838220928252600a905291909120611975818361207b565b6000611981828461257c565b9050816002015481116119c0576040517f819a066c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85036119fe57826002015483600101546119fb9190612e5a565b94505b6000611a0a838761261c565b90506000611a1a6012600a61302e565b611a2590606461303a565b6003850154611a34908461303a565b611a3e9190613051565b90506000611a4c8284612e5a565b8654909150811115611a5c575084545b60408051338152602081018a905290810182905273ffffffffffffffffffffffffffffffffffffffff8b16907f1f0c6615429d1cdae0dfa233abf91d3b31cdbdd82c8081389832a61e1072f1ea9060600160405180910390a2611ac18b8b8b846124ca565b611ace85878c338c612210565b611ad8858761257c565b8411611b10576040517f07af690800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b600160005403611b59576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b61612043565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611bb0612043565b63389a75e1600c52806000526020600c208054421115611bd857636f5e88186000526004601cfd5b60009055611be581612680565b50565b611bf0612043565b8060601b611c0657637448fbae6000526004601cfd5b611be581612680565b600160005403611c4b576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040812060040154849103611cad576040517f0d8b6eb700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167fd7243f6f8212d5188fd054141cf6ea89cfc0d91facb8c3afe2f88a135848014283604051611cf591815260200190565b60405180910390a2611d088484846126e6565b50505050565b600160005403611d4a576040517f9e87fac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611ed3576009546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163a9059cbb9184919084906370a0823190602401602060405180830381865afa158015611e35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e599190612df0565b611e639190612efb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303816000875af1158015610d8b573d6000803e3d6000fd5b73ffffffffffffffffffffffffffffffffffffffff8216611f885760008173ffffffffffffffffffffffffffffffffffffffff164760405160006040518083038185875af1925050503d8060008114611f48576040519150601f19603f3d011682016040523d82523d6000602084013e611f4d565b606091505b5050905080610daf576040517f6d963f8800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000818152600a6020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528492610daf9284928692906370a0823190602401602060405180830381865afa15801561200c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120309190612df0565b61203a9190612efb565b6128b1565b5050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927543314612079576382b429006000526004601cfd5b565b6000806120888484612900565b91509150808360030181905550816000036120a35750505050565b818360020160008282546120b79190612e5a565b909155505050505050565b808360010160008282546120d69190612e5a565b92505081905550808460010160008282546120f19190612e5a565b92505081905550806008600082825461210a9190612e5a565b90915550506040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906044015b6020604051808303816000875af11580156121a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114259190612e09565b81600201546121d8838361257c565b111561203f576040517f963c7ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600101548111612372578084600101600082825461222f9190612efb565b925050819055508085600101600082825461224a9190612efb565b9250508190555080600860008282546122639190612efb565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8416907fcb55e9f35638c4fdb4390d3a385ac1d72a8f72e4dcf0eb1f3c79d144b1023f859060200160405180910390a26040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac906044016020604051808303816000875af1158015612348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236c9190612e09565b50611425565b600180850180546000918290559187018054839290612392908490612efb565b9250508190555080600860008282546123ab9190612efb565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8516907fcb55e9f35638c4fdb4390d3a385ac1d72a8f72e4dcf0eb1f3c79d144b1023f859060200160405180910390a26040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f00000000000000000000000000000000000000000000000000000000000000001690639dc29fac906044016020604051808303816000875af1158015612490573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b49190612e09565b506111d78585856124c58587612efb565b6129ef565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600b602090815260408083209387168352929052908120805483929061250e908490612efb565b909155505073ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604081208054839290612548908490612efb565b909155505073ffffffffffffffffffffffffffffffffffffffff84163b60000361257157600080fd5b611d088483836128b1565b600080826002015483600101546125939190612e5a565b9050806000036125a7576000915050612616565b82546000036125d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff915050612616565b60006125e58585612aed565b90506126116125f66012600a61302e565b61260190606461303a565b61260b908461303a565b82612b46565b925050505b92915050565b600082600a0154600a61262f919061302e565b64e8d4a510008460070154612644919061303a565b61264e919061303a565b61265a6012600a61302e565b61266590600161303a565b61266f908461303a565b6126799190613051565b9392505050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927805473ffffffffffffffffffffffffffffffffffffffff9092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a355565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015612753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127779190612df0565b905061278584333085612b86565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152600090829073ffffffffffffffffffffffffffffffffffffffff8716906370a0823190602401602060405180830381865afa1580156127f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128189190612df0565b6128229190612efb565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600b6020908152604080832093891683529290529081208054929350839290919061286b908490612e5a565b909155505073ffffffffffffffffffffffffffffffffffffffff85166000908152600a6020526040812080548392906128a5908490612e5a565b90915550505050505050565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d1560016000511417166128f6576390b8ec186000526004601cfd5b6000603452505050565b6003546040517fcf5696cb0000000000000000000000000000000000000000000000000000000081526000918291829173ffffffffffffffffffffffffffffffffffffffff169063cf5696cb9061295f90600490898201908201612e6d565b602060405180830381865afa15801561297c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a09190612df0565b905060006129b06012600a61302e565b6129bb90606461303a565b600186015460038701546129cf9085612efb565b6129d9919061303a565b6129e39190613051565b96919550909350505050565b80846002016000828254612a039190612efb565b925050819055508060096000828254612a1c9190612e5a565b909155505060405181815273ffffffffffffffffffffffffffffffffffffffff8416907f6a41f86b2a18fe00e10a9bd078e790ae82c2627a6f940166bddc2db475194a5f9060200160405180910390a26040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152306024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90606401612186565b600080612afc6012600a61302e565b612b0790600161303a565b64e8d4a510008560070154612b20878760000154612be3565b612b2a919061303a565b612b34919061303a565b612b3e9190613051565b949350505050565b600081600003612b5557600080fd5b82600003612b6557506000612616565b81612b71600185612efb565b612b7b9190613051565b612679906001612e5a565b60405181606052826040528360601b602c526f23b872dd000000000000000000000000600c52602060006064601c6000895af13d156001600051141716612bd557637939f4246000526004601cfd5b600060605260405250505050565b600082600a0154600a612bf6919061302e565b612679908361303a565b73ffffffffffffffffffffffffffffffffffffffff81168114611be557600080fd5b600060208284031215612c3457600080fd5b813561267981612c00565b600060208284031215612c5157600080fd5b5035919050565b60008060408385031215612c6b57600080fd5b8235612c7681612c00565b946020939093013593505050565b60008060008060808587031215612c9a57600080fd5b8435612ca581612c00565b93506020850135612cb581612c00565b92506040850135612cc581612c00565b9396929550929360600135925050565b600080600060608486031215612cea57600080fd5b8335612cf581612c00565b92506020840135612d0581612c00565b929592945050506040919091013590565b600080600060608486031215612d2b57600080fd5b8335612d3681612c00565b9250602084013560058110612d0557600080fd5b60008060408385031215612d5d57600080fd5b8235612d6881612c00565b91506020830135612d7881612c00565b809150509250929050565b60008060008060008060c08789031215612d9c57600080fd5b8635612da781612c00565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b81548152600182015460208201526002820154604082015260608101612616565b600060208284031215612e0257600080fd5b5051919050565b600060208284031215612e1b57600080fd5b8151801515811461267957600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561261657612616612e2b565b82548152600183015460208201526002830154604082015260c081018254606083015260018301546080830152600283015460a0830152612679565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215612eea57600080fd5b815160ff8116811461267957600080fd5b8181038181111561261657612616612e2b565b600181815b80851115612f6757817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612f4d57612f4d612e2b565b80851615612f5a57918102915b93841c9390800290612f13565b509250929050565b600082612f7e57506001612616565b81612f8b57506000612616565b8160018114612fa15760028114612fab57612fc7565b6001915050612616565b60ff841115612fbc57612fbc612e2b565b50506001821b612616565b5060208310610133831016604e8410600b8410161715612fea575081810a612616565b612ff48383612f0e565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561302657613026612e2b565b029392505050565b60006126798383612f6f565b808202811582820484141761261657612616612e2b565b600082613087577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056",
    "sourceMap": "506:35048:38:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4617:141;;;;;;;;;;-1:-1:-1;4617:141:38;;;;;:::i;:::-;;:::i;:::-;;3973:121;;;;;;;;;;-1:-1:-1;3973:121:38;;;;;:::i;:::-;;:::i;1339:19::-;;;;;;;;;;;;;;;;;;;571:25:60;;;559:2;544:18;1339:19:38;;;;;;;;4958:125;;;;;;;;;;-1:-1:-1;4958:125:38;;;;;:::i;:::-;;:::i;1215:28::-;;;;;;;;;;-1:-1:-1;1215:28:38;;;;;;;;;;;;;;;;994:25:60;;;1050:2;1035:18;;1028:34;;;;1078:18;;;1071:34;982:2;967:18;1215:28:38;792:319:60;211:21:29;;;;;;;;;;;;;;;;9021:617:22;;;:::i;13001:274:38:-;;;;;;;;;;-1:-1:-1;13001:274:38;;;;;:::i;:::-;;:::i;1133:23::-;;;;;;;;;;-1:-1:-1;1133:23:38;;;;;;;;;;;1307:42:60;1295:55;;;1277:74;;1265:2;1250:18;1133:23:38;1116:241:60;3303:77:38;;;;;;;;;;;;;:::i;12002:289::-;;;;;;;;;;-1:-1:-1;12002:289:38;;;;;:::i;:::-;;:::i;13628:307::-;;;;;;;;;;;;;:::i;19470:1611::-;;;;;;;;;;-1:-1:-1;19470:1611:38;;;;;:::i;:::-;;:::i;21853:535::-;;;;;;;;;;-1:-1:-1;21853:535:38;;;;;:::i;:::-;;:::i;9720:456:22:-;;;:::i;10035:1528:38:-;;;;;;;;;;-1:-1:-1;10035:1528:38;;;;;:::i;:::-;;:::i;16914:727::-;;;;;;;;;;-1:-1:-1;16914:727:38;;;;;:::i;:::-;;:::i;1699:63::-;;;;;;;;;;-1:-1:-1;1699:63:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3880:14:60;;3873:22;3855:41;;3843:2;3828:18;1699:63:38;3715:187:60;8441:966:38;;;;;;;;;;-1:-1:-1;8441:966:38;;;;;:::i;:::-;;:::i;14184:114::-;;;;;;;;;;-1:-1:-1;14184:114:38;;;;;:::i;:::-;;:::i;2234:88::-;;;:::i;3698:76::-;;;;;;;;;;;;;:::i;11408:182:22:-;;;;;;;;;;-1:-1:-1;11562:11:22;11556:18;11408:182;;14558:119:38;;;;;;;;;;-1:-1:-1;14558:119:38;;;;;:::i;:::-;;:::i;1077:25::-;;;;;;;;;;-1:-1:-1;1077:25:38;;;;;;;;23502:2620;;;;;;;;;;-1:-1:-1;23502:2620:38;;;;;:::i;:::-;;:::i;1394:23::-;;;;;;;;;;;;;;;;1460:62;;;;;;;;;;-1:-1:-1;1460:62:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5450:25:60;;;5506:2;5491:18;;;5484:34;;;;5534:18;;;5527:34;;;;5592:2;5577:18;;5570:34;;;;5641:13;;5635:3;5620:19;;5613:42;5698:15;;;5692:22;5686:3;5671:19;;5664:51;5758:15;;;;5752:22;5746:3;5731:19;;5724:51;5806:3;5791:19;;5784:35;;;;5850:3;5835:19;;5828:35;;;;5894:3;5879:19;;5872:35;;;;5938:3;5923:19;;5916:35;5437:3;5422:19;1460:62:38;5025:932:60;4293:119:38;;;;;;;;;;-1:-1:-1;4293:119:38;;;;;:::i;:::-;;:::i;1267:26::-;;;;;;;;;;;;;;;;1569:72;;;;;;;;;;-1:-1:-1;1569:72:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6873:25:60;;;6929:2;6914:18;;6907:34;;;;6957:18;;;6950:34;7015:2;7000:18;;6993:34;6860:3;6845:19;1569:72:38;6642:391:60;937:40:38;;;;;;;;;;;;;;;1021:30;;;;;;;;;;-1:-1:-1;1021:30:38;;;;;;;;10363:708:22;;;;;;:::i;:::-;;:::i;8348:349::-;;;;;;:::i;:::-;;:::i;15290:331:38:-;;;;;;;;;;-1:-1:-1;15290:331:38;;;;;:::i;:::-;;:::i;6052:1230::-;;;;;;;;;;-1:-1:-1;6052:1230:38;;;;;:::i;:::-;;:::i;11693:435:22:-;;;;;;;;;;-1:-1:-1;11693:435:22;;;;;:::i;:::-;11963:19;11957:4;11950:33;;;11812:14;11996:26;;;;12106:4;12090:21;;12084:28;;11693:435;4617:141:38;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;4717:15:38::2;:34:::0;;;::::2;;::::0;;;::::2;::::0;;;::::2;::::0;;4617:141::o;3973:121::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;4063:10:38::2;:24:::0;;;::::2;;::::0;;;::::2;::::0;;;::::2;::::0;;3973:121::o;4958:125::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;5050:11:38::2;:26:::0;4958:125::o;9021:617:22:-;9114:15;7972:9;9132:46;;:15;:46;9114:64;;9346:19;9340:4;9333:33;9396:8;9390:4;9383:22;9452:7;9445:4;9439;9429:21;9422:38;9599:8;9552:45;9549:1;9546;9541:67;9248:374;9021:617::o;13001:274:38:-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;13118:10:38::2;::::0;:56:::2;::::0;;;;:10:::2;::::0;;::::2;::::0;:42:::2;::::0;:56:::2;::::0;13161:12:::2;::::0;13118:56;::::2;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13087:28:::0;:87;13214:15:::2;13184:27:::0;:45;13087:12:::2;13239:29:::0;13001:274::o;3303:77::-;12517:13:22;:11;:13::i;:::-;203:1:29::1;3360:6:38;:13:::0;3303:77::o;12002:289::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;2466:35:38::1;::::0;::::1;;::::0;;;:17:::1;:35;::::0;;;;:44:::1;;:49:::0;12134:18;;2466:54;2462:116:::1;;2543:24;;;;;;;;;;;;;;2462:116;12186:10:::2;::::0;::::2;;12172;:24;12168:54;;12205:17;;;;;;;;;;;;;;12168:54;-1:-1:-1::0;12232:37:38::2;::::0;;::::2;;::::0;;;:17:::2;:37;::::0;;;;:43:::2;;:52:::0;12002:289::o;13628:307::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;13712:15:38::1;::::0;::::1;;::::0;13737:67:::1;;13780:24;;;;;;;;;;;;;;13737:67;13835:8;::::0;;13815:17:::1;13853:12:::0;;;13876:52:::1;::::0;;;;:23:::1;8147:55:60::0;;;13876:52:38::1;::::0;::::1;8129:74:60::0;8219:18;;;8212:34;;;13876:14:38::1;:23;::::0;::::1;::::0;8102:18:60;;13876:52:38::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13675:260;;13628:307::o:0;19470:1611::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;2466:35:38::1;::::0;::::1;;::::0;;;:17:::1;:35;::::0;;;;:44:::1;;:49:::0;19631:16;;2466:54;2462:116:::1;;2543:24;;;;;;;;;;;;;;2462:116;19679:6:::0;2856:20:::2;::::0;::::2;2866:10;2856:20;::::0;::::2;::::0;:56:::2;;-1:-1:-1::0;2881:19:38::2;::::0;::::2;;::::0;;;:11:::2;:19;::::0;;;;;;;2901:10:::2;2881:31:::0;;;;;;;;::::2;;2880:32;2856:56;2852:116;;;2935:22;;;;;;;;;;;;;;2852:116;19728:30:::3;::::0;;::::3;19701:24;19728:30:::0;;;:12:::3;:30;::::0;;;;;;;:38;;::::3;::::0;;;;;;;;19813:35;;;:17:::3;:35:::0;;;;;;20041:26;;20000:38:::3;::::0;::::3;::::0;:67:::3;19996:136;;;20090:31;;;;;;;;;;;;;;19996:136;20239:11;;20229:7;20222:4;;:14;;;;:::i;:::-;:28;20218:68;;;20259:27;;;;;;;;;;;;;;20218:68;20344:11;:23;;;20334:7;20300:11;:31;;;:41;;;;:::i;:::-;:67;20296:136;;;20390:31;;;;;;;;;;;;;;20296:136;20638:21;::::0;::::3;::::0;:26;20634:253:::3;;20680:32;20692:11;20705:6;20680:11;:32::i;:::-;20634:253;;;20793:10;::::0;:83:::3;::::0;;;;:10:::3;::::0;;::::3;::::0;:47:::3;::::0;:83:::3;::::0;20841:12:::3;::::0;20855:20;;::::3;::::0;20793:83;::::3;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20743:31;::::0;::::3;:133:::0;20634:253:::3;20917:6;20902:31;;;20925:7;20902:31;;;;571:25:60::0;;559:2;544:18;;425:177;20902:31:38::3;;;;;;;;20943:48;20957:11;20970:6;20978:3;20983:7;20943:13;:48::i;:::-;21002:72;21054:11;21067:6;21002:51;:72::i;:::-;19691:1390;;2587:1:::2;387::29::1;19470:1611:38::0;;;;:::o;21853:535::-;2466:35;;;;;;;:17;:35;;;;;:44;;:49;21979:16;;2466:54;2462:116;;2543:24;;;;;;;;;;;;;;2462:116;22038:30:::1;::::0;;::::1;22011:24;22038:30:::0;;;:12:::1;:30;::::0;;;;;;;:38;;::::1;::::0;;;;;;;;22123:35;;;:17:::1;:35:::0;;;;;;22275:32:::1;22123:35:::0;22038:38;22275:11:::1;:32::i;:::-;22318:63;22332:11;22345:6;22353;22361:10;22373:7;22318:13;:63::i;:::-;22001:387;;21853:535:::0;;;;:::o;9720:456:22:-;9922:19;9916:4;9909:33;9968:8;9962:4;9955:22;10020:1;10013:4;10007;9997:21;9990:32;10151:8;10105:44;10102:1;10099;10094:66;9720:456::o;10035:1528:38:-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;2466:35:38::2;::::0;::::2;;::::0;;;:17:::2;:35;::::0;;;;:44:::2;;:49:::0;10220:16;;2466:54;2462:116:::2;;2543:24;;;;;;;;;;;;;;2462:116;10289:35:::3;::::0;::::3;10252:34;10289:35:::0;;;:17:::3;:35;::::0;;;;;10339:6:::3;:35;;;;;;;;:::i;:::-;::::0;10335:1222:::3;;10849:10;::::0;:64:::3;::::0;;;;:10:::3;::::0;;::::3;::::0;:42:::3;::::0;:64:::3;::::0;10892:20:::3;::::0;;::::3;::::0;10849:64:::3;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10810:36:::0;;;:103;10965:15:::3;10927:35:::0;;;:53;10810:20:::3;::::0;::::3;10994:33:::0;;;10335:1222:::3;;;11058:33;11048:6;:43;;;;;;;;:::i;:::-;::::0;11044:513:::3;;11107:23;::::0;::::3;:31:::0;;;11044:513:::3;;;11169:50;11159:6;:60;;;;;;;;:::i;:::-;::::0;11155:402:::3;;11235:38;::::0;::::3;:46:::0;;;11155:402:::3;;;11312:38;11302:6;:48;;;;;;;;:::i;:::-;::::0;11298:259:::3;;11366:28;::::0;::::3;:36:::0;;;11298:259:::3;;;11506:32;::::0;::::3;:40:::0;;;11298:259:::3;10242:1321;12540:1:22::2;10035:1528:38::0;;;:::o;16914:727::-;2466:35;;;;;;;:17;:35;;;;;:44;;:49;17059:16;;2466:54;2462:116;;2543:24;;;;;;;;;;;;;;2462:116;17107:6;2856:20:::1;::::0;::::1;2866:10;2856:20;::::0;::::1;::::0;:56:::1;;-1:-1:-1::0;2881:19:38::1;::::0;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;2901:10:::1;2881:31:::0;;;;;;;;::::1;;2880:32;2856:56;2852:116;;;2935:22;;;;;;;;;;;;;;2852:116;17156:30:::2;::::0;;::::2;17129:24;17156:30:::0;;;:12:::2;:30;::::0;;;;;;;:38;;::::2;::::0;;;;;;;;17241:35;;;:17:::2;:35:::0;;;;;;17392:32:::2;17241:35:::0;17156:38;17392:11:::2;:32::i;:::-;17440:41;::::0;;::::2;8147:55:60::0;;;8129:74;;8234:2;8219:18;;8212:34;;;17440:41:38;::::2;::::0;::::2;::::0;8102:18:60;17440:41:38::2;;;;;;;17492:59;17512:16;17530:6;17538:3;17543:7;17492:19;:59::i;8441:966::-:0;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;8766:35:38::2;::::0;::::2;8729:34;8766:35:::0;;;:17:::2;:35;::::0;;;;8815:20:::2;::::0;::::2;:25:::0;:30;8811:68:::2;;8854:25;;;;;;;;;;;;;;8811:68;8890:20;::::0;;::::2;:33:::0;;;8971:15:::2;8933:35:::0;;;:53;:35:::2;8996:32:::0;::::2;:56:::0;;;9062:28:::2;::::0;::::2;:48:::0;;;9120:23:::2;::::0;::::2;:38:::0;;;9168::::2;::::0;::::2;:68:::0;;;9311:27:::2;::::0;;;;;;;:25:::2;::::0;::::2;::::0;::::2;::::0;:27;;::::2;::::0;::::2;::::0;;;;;;;;:25;:27:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9290:48;::::0;::::2;;654:2;9290:48;:::i;:::-;9246:41;::::0;::::2;:92:::0;9354:46:::2;::::0;1307:42:60;1295:55;;1277:74;;9354:46:38::2;::::0;1265:2:60;1250:18;9354:46:38::2;;;;;;;8719:688;8441:966:::0;;;;;;:::o;14184:114::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;14262:10:38::1;14250:23;::::0;;;:11:::1;:23;::::0;;;;;;;::::1;:34:::0;;;::::1;::::0;;;;;;:41;;;::::1;14287:4;14250:41;::::0;;14184:114::o;2234:88::-;12517:13:22;:11;:13::i;3698:76:38:-;12517:13:22;:11;:13::i;:::-;163:1:29::1;3753:6:38;:14:::0;3698:76::o;14558:119::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;14638:10:38::1;14665:5;14626:23:::0;;;:11:::1;:23;::::0;;;;;;;::::1;:36:::0;;;::::1;::::0;;;;;;:44;;;::::1;::::0;;14558:119::o;23502:2620::-;2466:35;;;;;;;:17;:35;;;;;:44;;:49;23651:16;;2466:54;2462:116;;2543:24;;;;;;;;;;;;;;2462:116;23871:30:::1;::::0;;::::1;23844:24;23871:30:::0;;;:12:::1;:30;::::0;;;;;;;:38;;::::1;::::0;;;;;;;;23956:35;;;:17:::1;:35:::0;;;;;;24107:32:::1;23956:35:::0;23871:38;24107:11:::1;:32::i;:::-;24150:27;24180:40;24200:11;24213:6;24180:19;:40::i;:::-;24150:70;;24257:11;:32;;;24234:19;:55;24230:109;;24312:16;;;;;;;;;;;;;;24230:109;24377:17;24353:20;:41:::0;24349:614:::1;;24934:6;:18;;;24910:6;:21;;;:42;;;;:::i;:::-;24887:65;;24349:614;24973:32;25008:72;25046:11;25059:20;25008:37;:72::i;:::-;24973:107:::0;-1:-1:-1;25090:14:38::1;786:22;600:2;786;:22;:::i;:::-;779:30;::::0;:3:::1;:30;:::i;:::-;25135:28;::::0;::::1;::::0;25108:55:::1;::::0;:24;:55:::1;:::i;:::-;25107:78;;;;:::i;:::-;25090:95:::0;-1:-1:-1;25195:14:38::1;25212:33;25090:95:::0;25212:24;:33:::1;:::i;:::-;25571:26:::0;;25195:50;;-1:-1:-1;25562:35:38;::::1;25558:101;;;-1:-1:-1::0;25622:26:38;;25558:101:::1;25674:60;::::0;;25693:10:::1;12018:74:60::0;;12123:2;12108:18;;12101:34;;;12151:18;;;12144:34;;;25674:60:38::1;::::0;::::1;::::0;::::1;::::0;12006:2:60;11991:18;25674:60:38::1;;;;;;;25745:58;25765:16;25783:6;25791:3;25796:6;25745:19;:58::i;:::-;25813:76;25827:11;25840:6;25848;25856:10;25868:20;25813:13;:76::i;:::-;26014:40;26034:11;26047:6;26014:19;:40::i;:::-;25991:19;:63;25987:129;;26077:28;;;;;;;;;;;;;;25987:129;23673:2449;;;;;;23502:2620:::0;;;;;:::o;4293:119::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;12517:13:22::1;:11;:13::i;:::-;4381:10:38::2;:24:::0;;;::::2;;::::0;;;::::2;::::0;;;::::2;::::0;;4293:119::o;10363:708:22:-;12517:13;:11;:13::i;:::-;10597:19:::1;10591:4;10584:33;10643:12;10637:4;10630:26;10705:4;10699;10689:21;10811:12;10805:19;10792:11;10789:36;10786:157;;;10857:10;10851:4;10844:24;10924:4;10918;10911:18;10786:157;11020:1;10999:23:::0;;11041::::1;11051:12:::0;11041:9:::1;:23::i;:::-;10363:708:::0;:::o;8348:349::-;12517:13;:11;:13::i;:::-;8520:8:::1;8516:2;8512:17;8502:150;;8562:10;8556:4;8549:24;8633:4;8627;8620:18;8502:150;8671:19;8681:8;8671:9;:19::i;15290:331:38:-:0;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;2466:35:38::1;::::0;::::1;;::::0;;;:17:::1;:35;::::0;;;;:44:::1;;:49:::0;15443:16;;2466:54;2462:116:::1;;2543:24;;;;;;;;;;;;;;2462:116;15500:6:::2;15480:36;;;15508:7;15480:36;;;;571:25:60::0;;559:2;544:18;;425:177;15480:36:38::2;;;;;;;;15561:53;15580:16;15598:6;15606:7;15561:18;:53::i;:::-;387:1:29::1;15290:331:38::0;;;:::o;6052:1230::-;163:1:29;345:6;;:15;341:36;;369:8;;;;;;;;;;;;;;341:36;6172:14:38::1;6147:40;;:13;:40;;::::0;6143:1133:::1;;6387:8;::::0;6345:39:::1;::::0;;;;6378:4:::1;6345:39;::::0;::::1;1277:74:60::0;6316:23:38::1;:14;:23;::::0;::::1;::::0;6340:3;;6387:8;6316:23;;6345:24:::1;::::0;1250:18:60;;6345:39:38::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;6316:80;::::0;;::::1;::::0;;;;;;8159:42:60;8147:55;;;6316:80:38::1;::::0;::::1;8129:74:60::0;8219:18;;;8212:34;8102:18;;6316:80:38::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;6143:1133;6417:27;::::0;::::1;6413:863;;6591:12;6608:3;:8;;6624:21;6608:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6590:60;;;6669:7;6664:40;;6685:19;;;;;;;;;;;;;;6413:863;7193:33;::::0;::::1;6874:25;7193:33:::0;;;:17:::1;:33;::::0;;;;;;:58;7151:39;;;;;7184:4:::1;7151:39;::::0;::::1;1277:74:60::0;7193:33:38;;7053:212:::1;::::0;7193:33;;7130:3;;7193:33;7151:24:::1;::::0;1250:18:60;;7151:39:38::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:100;;;;:::i;:::-;7053:28;:212::i;6413:863::-;6052:1230:::0;;:::o;7292:355:22:-;7504:11;7498:18;7488:8;7485:32;7475:156;;7550:10;7544:4;7537:24;7612:4;7606;7599:18;7475:156;7292:355::o;30857:449:38:-;30959:20;30981:36;31021:42;31043:11;31056:6;31021:21;:42::i;:::-;30958:105;;;;31107:28;31073:6;:31;;:62;;;;31229:12;31245:1;31229:17;31225:30;;31248:7;;30857:449;;:::o;31225:30::-;31287:12;31265:6;:18;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;30857:449:38:o;28155:306::-;28326:7;28301:6;:21;;;:32;;;;;;;:::i;:::-;;;;;;;;28378:7;28343:11;:31;;;:42;;;;;;;:::i;:::-;;;;;;;;28403:7;28395:4;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;28421:33:38;;;;;:19;8147:55:60;;;28421:33:38;;;8129:74:60;8219:18;;;8212:34;;;28421:14:38;:19;;;;8102:18:60;;28421:33:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34832:283::-;35047:11;:32;;;35004:40;35024:11;35037:6;35004:19;:40::i;:::-;:75;35000:108;;;35088:20;;;;;;;;;;;;;;28961:1089;29334:6;:21;;;29323:7;:32;29319:725;;29396:7;29371:6;:21;;;:32;;;;;;;:::i;:::-;;;;;;;;29452:7;29417:11;:31;;;:42;;;;;;;:::i;:::-;;;;;;;;29481:7;29473:4;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;29508:31:38;;571:25:60;;;29508:31:38;;;;;;559:2:60;544:18;29508:31:38;;;;;;;29553:35;;;;;:19;8147:55:60;;;29553:35:38;;;8129:74:60;8219:18;;;8212:34;;;29553:14:38;:19;;;;8102:18:60;;29553:35:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29319:725;;;29650:21;;;;;;29619:28;29686:25;;;;29725:31;;;:55;;29650:21;;29619:28;29725:55;;29650:21;;29725:55;:::i;:::-;;;;;;;;29802:20;29794:4;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;29842:44:38;;571:25:60;;;29842:44:38;;;;;;559:2:60;544:18;29842:44:38;;;;;;;29900:48;;;;;:19;8147:55:60;;;29900:48:38;;;8129:74:60;8219:18;;;8212:34;;;29900:14:38;:19;;;;8102:18:60;;29900:48:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;29963:70:38;29979:6;29987;29995:5;30002:30;30012:20;30002:7;:30;:::i;:::-;29963:15;:70::i;27545:426::-;27668:30;;;;;;;;:12;:30;;;;;;;;:38;;;;;;;;;;;:69;;27730:7;;27668:30;:69;;27730:7;;27668:69;:::i;:::-;;;;-1:-1:-1;;27747:35:38;;;;;;;:17;:35;;;;;:71;;27811:7;;27747:35;:71;;27811:7;;27747:71;:::i;:::-;;;;-1:-1:-1;;27833:37:38;;;;27874:1;27833:42;27829:56;;27877:8;;;27829:56;27895:69;27932:16;27951:3;27956:7;27895:28;:69::i;31455:1193::-;31592:7;31915:22;31964:6;:18;;;31940:6;:21;;;:42;;;;:::i;:::-;31915:67;;32036:14;32054:1;32036:19;32032:33;;32064:1;32057:8;;;;;32032:33;32234:26;;;:31;32230:61;;32274:17;32267:24;;;;;32230:61;32416:34;32453:50;32483:11;32496:6;32453:29;:50::i;:::-;32416:87;-1:-1:-1;32568:73:38;786:22;600:2;786;:22;:::i;:::-;779:30;;:3;:30;:::i;:::-;32576:35;;:14;:35;:::i;:::-;32614:26;32568:6;:73::i;:::-;32561:80;;;;31455:1193;;;;;:::o;33375:318::-;33521:7;33643:11;:41;;;33637:2;:47;;;;:::i;:::-;868:4;33588:11;:17;;;:45;;;;:::i;:::-;:97;;;;:::i;:::-;704:22;600:2;704;:22;:::i;:::-;699:28;;:1;:28;:::i;:::-;33552:19;;:7;:19;:::i;:::-;33551:135;;;;:::i;:::-;33544:142;33375:318;-1:-1:-1;;;33375:318:38:o;6145:1089:22:-;6857:11;7093:16;;6941:26;;;;;;;7053:38;7050:1;;7042:78;7177:27;6145:1089::o;26477:795:38:-;26771:41;;;;;26806:4;26771:41;;;1277:74:60;26750:18:38;;26771:26;;;;;;1250:18:60;;26771:41:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26750:62;;26918:95;26959:16;26978:10;26998:4;27005:7;26918:32;:95::i;:::-;27044:41;;;;;27079:4;27044:41;;;1277:74:60;27023:18:38;;27088:10;;27044:26;;;;;;1250:18:60;;27044:41:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;;;:::i;:::-;27109:30;;;;;;;;:12;:30;;;;;;;;:38;;;;;;;;;;;:72;;27023:75;;-1:-1:-1;27023:75:38;;27109:38;;:30;:72;;27023:75;;27109:72;:::i;:::-;;;;-1:-1:-1;;27191:35:38;;;;;;;:17;:35;;;;;:74;;27255:10;;27191:35;:74;;27255:10;;27191:74;:::i;:::-;;;;-1:-1:-1;;;;;;;26477:795:38:o;11375:939:24:-;11538:2;11532:4;11525:16;11595:6;11589:4;11582:20;11660:34;11654:4;11647:48;12049:4;12043;12037;12031;12028:1;12021:5;12014;12009:45;11943:16;11936:24;11932:1;11925:4;11919:11;11916:18;11913:48;11828:244;11801:400;;12118:10;12112:4;12105:24;12182:4;12176;12169:18;11801:400;12227:1;12221:4;12214:15;11375:939;;;:::o;33833:541:38:-;34055:10;;:83;;;;;33972:7;;;;;;34055:10;;;:47;;:83;;34103:12;;34117:20;;;;34055:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34004:134;-1:-1:-1;34149:20:38;786:22;600:2;786;:22;:::i;:::-;779:30;;:3;:30;:::i;:::-;34253:21;;;;34218:31;;;;34187:62;;:28;:62;:::i;:::-;34186:88;;;;:::i;:::-;34172:133;;;;:::i;:::-;34149:156;34338:28;;-1:-1:-1;33833:541:38;;-1:-1:-1;;;;33833:541:38:o;30407:292::-;30547:7;30525:6;:18;;;:29;;;;;;;:::i;:::-;;;;;;;;30576:7;30564:8;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;30599:25:38;;571::60;;;30599::38;;;;;;559:2:60;544:18;30599:25:38;;;;;;;30634:58;;;;;:27;12680:15:60;;;30634:58:38;;;12662:34:60;30677:4:38;12712:18:60;;;12705:43;12764:18;;;12757:34;;;30634:14:38;:27;;;;12574:18:60;;30634:58:38;12399:398:60;32795:433:38;32942:7;;704:22;600:2;704;:22;:::i;:::-;699:28;;:1;:28;:::i;:::-;868:4;33095:11;:17;;;33016:76;33052:11;33065:6;:26;;;33016:35;:76::i;:::-;:96;;;;:::i;:::-;:140;;;;:::i;:::-;33002:176;;;;:::i;:::-;32965:213;32795:433;-1:-1:-1;;;;32795:433:38:o;35374:178::-;35436:10;35462:2;35468:1;35462:7;35458:21;;35471:8;;;35458:21;35493:2;35499:1;35493:7;35489:21;;-1:-1:-1;35509:1:38;35502:8;;35489:21;35542:2;35532:6;35537:1;35532:2;:6;:::i;:::-;35531:13;;;;:::i;:::-;35526:19;;:1;:19;:::i;8181:1139:24:-;8364:4;8358:11;8429:6;8423:4;8416:20;8494:2;8488:4;8481:16;8559:4;8555:2;8551:13;8545:4;8538:27;8621:34;8615:4;8608:48;9022:4;9016;9010;9004;9001:1;8994:5;8987;8982:45;8916:16;8909:24;8905:1;8898:4;8892:11;8889:18;8886:48;8801:244;8774:404;;9091:10;9085:4;9078:24;9159:4;9153;9146:18;8774:404;9204:1;9198:4;9191:15;9260:4;9253:15;-1:-1:-1;;;;8181:1139:24:o;34493:238:38:-;34636:7;34682:11;:41;;;34676:2;:47;;;;:::i;:::-;34666:58;;:6;:58;:::i;14:154:60:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:247;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;340:9;327:23;359:31;384:5;359:31;:::i;607:180::-;666:6;719:2;707:9;698:7;694:23;690:32;687:52;;;735:1;732;725:12;687:52;-1:-1:-1;758:23:60;;607:180;-1:-1:-1;607:180:60:o;1362:335::-;1450:6;1458;1511:2;1499:9;1490:7;1486:23;1482:32;1479:52;;;1527:1;1524;1517:12;1479:52;1566:9;1553:23;1585:31;1610:5;1585:31;:::i;:::-;1635:5;1687:2;1672:18;;;;1659:32;;-1:-1:-1;;;1362:335:60:o;1702:618::-;1808:6;1816;1824;1832;1885:3;1873:9;1864:7;1860:23;1856:33;1853:53;;;1902:1;1899;1892:12;1853:53;1941:9;1928:23;1960:31;1985:5;1960:31;:::i;:::-;2010:5;-1:-1:-1;2067:2:60;2052:18;;2039:32;2080:33;2039:32;2080:33;:::i;:::-;2132:7;-1:-1:-1;2191:2:60;2176:18;;2163:32;2204:33;2163:32;2204:33;:::i;:::-;1702:618;;;;-1:-1:-1;2256:7:60;;2310:2;2295:18;2282:32;;-1:-1:-1;;1702:618:60:o;2325:476::-;2422:6;2430;2438;2491:2;2479:9;2470:7;2466:23;2462:32;2459:52;;;2507:1;2504;2497:12;2459:52;2546:9;2533:23;2565:31;2590:5;2565:31;:::i;:::-;2615:5;-1:-1:-1;2672:2:60;2657:18;;2644:32;2685:33;2644:32;2685:33;:::i;:::-;2325:476;;2737:7;;-1:-1:-1;;;2791:2:60;2776:18;;;;2763:32;;2325:476::o;2806:511::-;2929:6;2937;2945;2998:2;2986:9;2977:7;2973:23;2969:32;2966:52;;;3014:1;3011;3004:12;2966:52;3053:9;3040:23;3072:31;3097:5;3072:31;:::i;:::-;3122:5;-1:-1:-1;3179:2:60;3164:18;;3151:32;3214:1;3202:14;;3192:42;;3230:1;3227;3220:12;3322:388;3390:6;3398;3451:2;3439:9;3430:7;3426:23;3422:32;3419:52;;;3467:1;3464;3457:12;3419:52;3506:9;3493:23;3525:31;3550:5;3525:31;:::i;:::-;3575:5;-1:-1:-1;3632:2:60;3617:18;;3604:32;3645:33;3604:32;3645:33;:::i;:::-;3697:7;3687:17;;;3322:388;;;;;:::o;3907:610::-;4031:6;4039;4047;4055;4063;4071;4124:3;4112:9;4103:7;4099:23;4095:33;4092:53;;;4141:1;4138;4131:12;4092:53;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;:::-;4249:5;4301:2;4286:18;;4273:32;;-1:-1:-1;4352:2:60;4337:18;;4324:32;;4403:2;4388:18;;4375:32;;-1:-1:-1;4454:3:60;4439:19;;4426:33;;-1:-1:-1;4506:3:60;4491:19;4478:33;;-1:-1:-1;3907:610:60;-1:-1:-1;;;3907:610:60:o;7505:256::-;7369:12;;7357:25;;7431:4;7420:16;;7414:23;7407:4;7398:14;;7391:47;7487:4;7476:16;;7470:23;7463:4;7454:14;;7447:47;7690:2;7675:18;;7702:53;7287:213;7766:184;7836:6;7889:2;7877:9;7868:7;7864:23;7860:32;7857:52;;;7905:1;7902;7895:12;7857:52;-1:-1:-1;7928:16:60;;7766:184;-1:-1:-1;7766:184:60:o;8257:277::-;8324:6;8377:2;8365:9;8356:7;8352:23;8348:32;8345:52;;;8393:1;8390;8383:12;8345:52;8425:9;8419:16;8478:5;8471:13;8464:21;8457:5;8454:32;8444:60;;8500:1;8497;8490:12;8539:184;8591:77;8588:1;8581:88;8688:4;8685:1;8678:15;8712:4;8709:1;8702:15;8728:125;8793:9;;;8814:10;;;8811:36;;;8827:18;;:::i;8858:407::-;7369:12;;7357:25;;7431:4;7420:16;;7414:23;7407:4;7398:14;;7391:47;7487:4;7476:16;;7470:23;7463:4;7454:14;;7447:47;9122:3;9107:19;;7369:12;;9255:2;9240:18;;7357:25;7431:4;7420:16;;7414:23;7398:14;;;7391:47;7487:4;7476:16;;7470:23;7454:14;;;7447:47;9197:62;7287:213;9270:184;9322:77;9319:1;9312:88;9419:4;9416:1;9409:15;9443:4;9440:1;9433:15;9459:273;9527:6;9580:2;9568:9;9559:7;9555:23;9551:32;9548:52;;;9596:1;9593;9586:12;9548:52;9628:9;9622:16;9678:4;9671:5;9667:16;9660:5;9657:27;9647:55;;9698:1;9695;9688:12;9737:128;9804:9;;;9825:11;;;9822:37;;;9839:18;;:::i;9870:482::-;9959:1;10002:5;9959:1;10016:330;10037:7;10027:8;10024:21;10016:330;;;10156:4;10088:66;10084:77;10078:4;10075:87;10072:113;;;10165:18;;:::i;:::-;10215:7;10205:8;10201:22;10198:55;;;10235:16;;;;10198:55;10314:22;;;;10274:15;;;;10016:330;;;10020:3;9870:482;;;;;:::o;10357:866::-;10406:5;10436:8;10426:80;;-1:-1:-1;10477:1:60;10491:5;;10426:80;10525:4;10515:76;;-1:-1:-1;10562:1:60;10576:5;;10515:76;10607:4;10625:1;10620:59;;;;10693:1;10688:130;;;;10600:218;;10620:59;10650:1;10641:10;;10664:5;;;10688:130;10725:3;10715:8;10712:17;10709:43;;;10732:18;;:::i;:::-;-1:-1:-1;;10788:1:60;10774:16;;10803:5;;10600:218;;10902:2;10892:8;10889:16;10883:3;10877:4;10874:13;10870:36;10864:2;10854:8;10851:16;10846:2;10840:4;10837:12;10833:35;10830:77;10827:159;;;-1:-1:-1;10939:19:60;;;10971:5;;10827:159;11018:34;11043:8;11037:4;11018:34;:::i;:::-;11148:6;11080:66;11076:79;11067:7;11064:92;11061:118;;;11159:18;;:::i;:::-;11197:20;;10357:866;-1:-1:-1;;;10357:866:60:o;11228:131::-;11288:5;11317:36;11344:8;11338:4;11317:36;:::i;11364:168::-;11437:9;;;11468;;11485:15;;;11479:22;;11465:37;11455:71;;11506:18;;:::i;11537:274::-;11577:1;11603;11593:189;;11638:77;11635:1;11628:88;11739:4;11736:1;11729:15;11767:4;11764:1;11757:15;11593:189;-1:-1:-1;11796:9:60;;11537:274::o",
    "linkReferences": {},
    "immutableReferences": {
      "46700": [
        {
          "start": 1976,
          "length": 32
        },
        {
          "start": 3394,
          "length": 32
        },
        {
          "start": 7500,
          "length": 32
        },
        {
          "start": 7651,
          "length": 32
        },
        {
          "start": 8539,
          "length": 32
        },
        {
          "start": 8959,
          "length": 32
        },
        {
          "start": 9287,
          "length": 32
        },
        {
          "start": 10942,
          "length": 32
        }
      ]
    }
  },
  "methodIdentifiers": {
    "CURRENCY_TOKEN()": "e72531c8",
    "baseRateInfo()": "13f60c9a",
    "burnCurrency(address,address,uint256)": "4fa73919",
    "cancelOwnershipHandover()": "54d1f13d",
    "collateralMapping(address)": "c665471f",
    "completeOwnershipHandover(address)": "f04e283e",
    "createCollateralType(address,uint256,uint256,uint256,uint256,uint256)": "645ba425",
    "debt()": "0dca59c1",
    "debtCeiling()": "e1c84ea4",
    "deny(address)": "9c52a7f1",
    "depositCollateral(address,address,uint256)": "f970c3b7",
    "feedModule()": "a12ad552",
    "liquidate(address,address,address,uint256)": "aab3f868",
    "mintCurrency(address,address,address,uint256)": "49a66ca3",
    "owner()": "8da5cb5b",
    "ownershipHandoverExpiresAt(address)": "fee81cf4",
    "paidFees()": "b80a0a77",
    "pause()": "8456cb59",
    "rateModule()": "336d391e",
    "recoverToken(address,address)": "feaea586",
    "rely(address)": "65fae35e",
    "relyMapping(address,address)": "5881fc33",
    "renounceOwnership()": "715018a6",
    "requestOwnershipHandover()": "25692962",
    "stabilityModule()": "ea061ad4",
    "status()": "200d2ed2",
    "transferOwnership(address)": "f2fde38b",
    "unpause()": "3f4ba83a",
    "updateBaseRate(uint256)": "330283aa",
    "updateCollateralData(address,uint8,uint256)": "57b35a78",
    "updateDebtCeiling(uint256)": "1218c5fd",
    "updateFeedModule(address)": "0ae5ccab",
    "updatePrice(address,uint256)": "457972de",
    "updateRateModule(address)": "d707eed5",
    "updateStabilityModule(address)": "0408ccd6",
    "vaultMapping(address,address)": "e2c7283f",
    "withdrawCollateral(address,address,address,uint256)": "5820ba63",
    "withdrawFees()": "476343ee"
  },
  "rawMetadata": "{\"compiler\":{\"version\":\"0.8.21+commit.d9974bed\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract Currency\",\"name\":\"_currencyToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_baseRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_debtCeiling\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadCollateralRatio\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CollateralAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CollateralDebtCeilingExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CollateralDoesNotExist\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CollateralRatioNotImproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EthTransferFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GlobalDebtCeilingExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientCurrencyAmountToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStabilityModule\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NewOwnerIsZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoHandoverRequest\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotEnoughCollateralToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotFeedContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotOwnerOrReliedUpon\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Paused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PositionIsSafe\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TotalUserCollateralBelowFloor\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnrecognizedParam\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroCollateral\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CollateralDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"collateralAddress\",\"type\":\"address\"}],\"name\":\"CollateralTypeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CollateralWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CurrencyBurned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CurrencyMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeesPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"liquidator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"currencyAmountPaid\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"collateralAmountCovered\",\"type\":\"uint256\"}],\"name\":\"Liquidated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipHandoverCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"OwnershipHandoverRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"CURRENCY_TOKEN\",\"outputs\":[{\"internalType\":\"contract Currency\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseRateInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accumulatedRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTime\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burnCurrency\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cancelOwnershipHandover\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"collateralMapping\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalDepositedCollateral\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalBorrowedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"liquidationThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"liquidationBonus\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"rate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accumulatedRate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastUpdateTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IVault.RateInfo\",\"name\":\"rateInfo\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtCeiling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"collateralFloorPerPosition\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"additionalCollateralPrecision\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"completeOwnershipHandover\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_rate\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_liquidationThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_liquidationBonus\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_debtCeiling\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_collateralFloorPerPosition\",\"type\":\"uint256\"}],\"name\":\"createCollateralType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"debt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"debtCeiling\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_reliedUpon\",\"type\":\"address\"}],\"name\":\"deny\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"depositCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feedModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_currencyAmountToPay\",\"type\":\"uint256\"}],\"name\":\"liquidate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mintCurrency\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"result\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"pendingOwner\",\"type\":\"address\"}],\"name\":\"ownershipHandoverExpiresAt\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"result\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paidFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rateModule\",\"outputs\":[{\"internalType\":\"contract IRate\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"recoverToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_relyUpon\",\"type\":\"address\"}],\"name\":\"rely\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"relyMapping\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"requestOwnershipHandover\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stabilityModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"status\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_baseRate\",\"type\":\"uint256\"}],\"name\":\"updateBaseRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"enum IVault.ModifiableParameters\",\"name\":\"_param\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_data\",\"type\":\"uint256\"}],\"name\":\"updateCollateralData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_debtCeiling\",\"type\":\"uint256\"}],\"name\":\"updateDebtCeiling\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feedModule\",\"type\":\"address\"}],\"name\":\"updateFeedModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_price\",\"type\":\"uint256\"}],\"name\":\"updatePrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IRate\",\"name\":\"_rateModule\",\"type\":\"address\"}],\"name\":\"updateRateModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_stabilityModule\",\"type\":\"address\"}],\"name\":\"updateStabilityModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"vaultMapping\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"depositedCollateral\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"borrowedAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"accruedFees\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lastTotalAccumulatedRate\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ERC20Token\",\"name\":\"_collateralToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AlreadyInitialized()\":[{\"details\":\"Cannot double-initialize.\"}],\"NewOwnerIsZeroAddress()\":[{\"details\":\"The `newOwner` cannot be the zero address.\"}],\"NoHandoverRequest()\":[{\"details\":\"The `pendingOwner` does not have a valid handover request.\"}],\"Unauthorized()\":[{\"details\":\"The caller is not authorized to call the function.\"}]},\"events\":{\"OwnershipHandoverCanceled(address)\":{\"details\":\"The ownership handover to `pendingOwner` has been canceled.\"},\"OwnershipHandoverRequested(address)\":{\"details\":\"An ownership handover to `pendingOwner` has been requested.\"},\"OwnershipTransferred(address,address)\":{\"details\":\"The ownership is transferred from `oldOwner` to `newOwner`. This event is intentionally kept the same as OpenZeppelin's Ownable to be compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173), despite it not being as lightweight as a single argument event.\"}},\"kind\":\"dev\",\"methods\":{\"burnCurrency(address,address,uint256)\":{\"details\":\"we accrue fees here to enable full payment of both borrowed amount and fees in one function. This way unupdated accrued fees are accounted for too and can be paid backshould revert if the collateral does not exist      should revert if the caller is not the `_owner` and not also not relied upon      should revert if the amount of currency to burn / pay back is more than `borrowed amount + total accrued fees`\",\"params\":{\"_amount\":\"amount of currency to pay back / burn\",\"_collateralToken\":\"contract address of collateral to burn/pay back the vault's currency for,\",\"_owner\":\"owner of the vault to pay back it's loan\"}},\"cancelOwnershipHandover()\":{\"details\":\"Cancels the two-step ownership handover to the caller, if any.\"},\"completeOwnershipHandover(address)\":{\"details\":\"Allows the owner to complete the two-step ownership handover to `pendingOwner`. Reverts if there is no existing ownership handover requested by `pendingOwner`.\"},\"createCollateralType(address,uint256,uint256,uint256,uint256,uint256)\":{\"details\":\"should revert if contract is paused      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role      should revert if the collateral already exists, i.e if _collateral.rateInfo.rate == 0\",\"params\":{\"_collateralFloorPerPosition\":\"value to set as the minimum amount of this collateral that can be borrowed against\",\"_collateralToken\":\"contract address of the token to add\",\"_debtCeiling\":\"value to set as the debt ceiling of the collateral, used to limit risk by capping borrowable amount of currency backed by the given collateral\",\"_liquidationBonus\":\"value to set as the liquidation bonus of the collateral, used to incentivize liquidators, should be denominated in 1e18 where 1e18 is 100%\",\"_liquidationThreshold\":\"value to set as the liquidation threshold of the collateral, should be denominated in 1e18 where 1e18 is 100%\",\"_rate\":\"value to set as the collateral rate (per second) for the collateral, should be denominated in 1e18 where 1e18 is 100%\"}},\"deny(address)\":{\"details\":\"should revert if the contract is paused\",\"params\":{\"_reliedUpon\":\"address to rely upon\"}},\"depositCollateral(address,address,uint256)\":{\"details\":\"should revert if the contract is paused      should revert if the collateral does not exist      should revert if transfer from `_owner` to this contract fails based on SafeERC20.safeTransferFrom()'s expectations of a successful erc20 transferFrom call\",\"params\":{\"_amount\":\"amount of `_collateralToken` to deposit into `_owner`'s vault\",\"_collateralToken\":\"contract address of the collateral to deposit\",\"_owner\":\"owner of the vault to deposit into\"}},\"liquidate(address,address,address,uint256)\":{\"details\":\"updates fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the start and end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratioshould revert if the collateral does not exist      should revert if the vault is not under-water      should revert if liqudiation did not strictly imporve the collateral ratio of the vault\",\"params\":{\"_collateralToken\":\"contract address of collateral used by vault that is to be liquidate, also the token to recieved by the `_to` address after liquidation\",\"_currencyAmountToPay\":\"the amount of currency tokens to pay back for `_owner`\",\"_owner\":\"owner of the vault to liquidate\",\"_to\":\"address to send the liquidated collateral (collateral covered) to\"}},\"mintCurrency(address,address,address,uint256)\":{\"details\":\"if the users currencly minted/borrwed amount if greater than 0, it should update fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratio      else i.e when currenctly minted/borrwed amount is 0 (this means that no past fees to accrue), it should set the `lastTotalAccumulatedRate` of the vault to be the current totalAccumulatedRate (i.e current accumulated base rate + current accumulated collateral rate, emphaisis on current as these values are recalculated for both rates to their current values)should revert if the contract is paused      should revert if the collateral does not exist      should revert if the caller is not the `_owner` and not also not relied upon      should revert if `_owner`'s deposited collateral amount is less than the collateralFloorPerPosition for the given collateral      should revert if mint to the `_to` address fails      should revert if the collateral ratio of `_owner` is below the liquidation threshold at the end of the function. This can happen if the position was already under-water (liquidatable) prior to the function call or if the withdrawal of `_amount` make it under-water\",\"params\":{\"_amount\":\"amount of currency to mint\",\"_collateralToken\":\"contract address of collateral to mint/borrow the vault's currency against\",\"_owner\":\"owner of the vault to use it's collateral balance\",\"_to\":\"address to send the minted/borrowed currency to\"}},\"owner()\":{\"details\":\"Returns the owner of the contract.\"},\"ownershipHandoverExpiresAt(address)\":{\"details\":\"Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.\"},\"pause()\":{\"details\":\"interactions with functions without a `whenNotPaused` or `whenPaused` modifier are unaffectedreverts if not paused\"},\"recoverToken(address,address)\":{\"details\":\"if `_tokenAddress` is address(0), send all eth in this contract to `_to`      else if `_tokenAddress` is this vaults `CURRENCY_TOKEN`, send balance of this address of that token minus the paidFees (i.e unwithdrawn paid fees)      else (this means this token can/might be a collateral), send the balance of this address of that token minus the `totalDepositedCollateral` of it as a collateralreverts if `_tokenAddress` is address(0) i.e eth, and `_to` is a contract that has no non reverting way to accept eth      reverts if `_tokenAddress` is not `CURRENCY_TOKEN` and not `address(0) but is a contract\",\"params\":{\"_to\":\"address to send the recovered tokens to\",\"_tokenAddress\":\"address of token to recover. if it is eth, address(0) is expected\"}},\"rely(address)\":{\"details\":\"should revert if the contract is paused\",\"params\":{\"_relyUpon\":\"address to rely upon\"}},\"renounceOwnership()\":{\"details\":\"override renounce ownership to be impossible\"},\"requestOwnershipHandover()\":{\"details\":\"Request a two-step ownership handover to the caller. The request will automatically expire in 48 hours (172800 seconds) by default.\"},\"transferOwnership(address)\":{\"details\":\"Allows the owner to transfer the ownership to `newOwner`.\"},\"unpause()\":{\"details\":\"interactions with functions without a `whenNotPaused` or `whenPaused` modifier are unaffectedreverts if not paused\"},\"updateBaseRate(uint256)\":{\"details\":\"updates the last stored accumulated rate by adding accumulated rate (since baseRateInfo.lastUpdateTime) to it before updating the rate, this way borrowers are charged the previous rate up until block.timestamp before being charged the new rate.updates the last update time too for correct future updates to accumulate past rates correctlyshould revert if the contract is paused      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role\",\"params\":{\"_baseRate\":\"new base rate (per second), should be denominated in 1e18 where 1e18 is 100%\"}},\"updateCollateralData(address,uint8,uint256)\":{\"details\":\"updates the value of the chosen parameter with `_data`should revert if the contract is paused      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role      should revert if the collateral does not exist      should revert if `_param` is not a variant of ModifiableParameters enum\",\"params\":{\"_collateralToken\":\"contract address of the token to modify it's parameters\",\"_param\":\"contract address of the token to modify it's parameters\"}},\"updateDebtCeiling(uint256)\":{\"details\":\"reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role\"},\"updateFeedModule(address)\":{\"details\":\"reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role\"},\"updatePrice(address,uint256)\":{\"details\":\"should revert if the contract is paused      should revert if the caller does not have the `FEED_CONTRACT_ROLE` role      should revert if the collateral does not exist\",\"params\":{\"_collateralAddress\":\"contract address of the collateral token to update it's price\",\"_price\":\"new price\"}},\"updateRateModule(address)\":{\"details\":\"reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role\"},\"updateStabilityModule(address)\":{\"details\":\"reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role\"},\"withdrawCollateral(address,address,address,uint256)\":{\"details\":\"should update fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratioshould revert if the collateral does not exist      should revert if the caller is not the `_owner` and not also not relied upon      should revert if transfer from this contract to the `_to` address fails based on SafeERC20.safeTransfer()'s expectations of a successful erc20 transfer call      should revert if the collateral ratio of `_owner` is below the liquidation threshold at the end of the function. This can happen if the position was already under-water (liquidatable) prior to the function call or if the withdrawal of `_amount` make it under-water\",\"params\":{\"_amount\":\"amount of `_collateralToken` to withdraw from `_owner`'s vault to `_to`'s address\",\"_collateralToken\":\"contract address of the collateral to withdraw\",\"_owner\":\"owner of the vault to withdraw from\",\"_to\":\"address to send the withdrawn collateral to\"}},\"withdrawFees()\":{\"details\":\"updates the paidFees for the collateral and globally then transfers the token to the callershould revert if the contract is pausedshould revert if the stabilityModule is address(0)\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"burnCurrency(address,address,uint256)\":{\"notice\":\"burns/pays back a borrowed/minted currency\"},\"createCollateralType(address,uint256,uint256,uint256,uint256,uint256)\":{\"notice\":\"Creates a collateral type that'll be accepted by the system\"},\"deny(address)\":{\"notice\":\"lets an address (the caller) remove access of another address to perform actions on it's (the caller's) vault\"},\"depositCollateral(address,address,uint256)\":{\"notice\":\"deposits collateral into `_owner`'s vault from `_owner`'s address\"},\"liquidate(address,address,address,uint256)\":{\"notice\":\"liquidates a vault making sure the liquidation strictly improves the collateral ratio i.e doesn't leave it the same as before or decreases it (if that's possible)\"},\"mintCurrency(address,address,address,uint256)\":{\"notice\":\"mints/borrows `_amount` of currency to `_to`, backed by `_owner`'s deposited collateral\"},\"pause()\":{\"notice\":\"prevents interactions with functions having `whenNotPaused` modifier and allows interactions with ones with the `whenPaused` modifier\"},\"recoverToken(address,address)\":{\"notice\":\"Used to recover `all` tokens and eth `possible` without affecting collateral reserves or unwithdrawn interest\"},\"rely(address)\":{\"notice\":\"lets an address (the caller) approve another address to perform actions on it's (the caller's) vault\"},\"unpause()\":{\"notice\":\"allows interactions with functions having `whenNotPaused` modifier and prevents interactions with ones with the `whenPaused` modifier\"},\"updateBaseRate(uint256)\":{\"notice\":\"updates the base rate charged for borrowing this currency\"},\"updateCollateralData(address,uint8,uint256)\":{\"notice\":\"updates `manually updateable` parameters of an existing collateral\"},\"updateDebtCeiling(uint256)\":{\"notice\":\"updates the global debt ceiling\"},\"updateFeedModule(address)\":{\"notice\":\"updates the feedModule address\"},\"updatePrice(address,uint256)\":{\"notice\":\"feed contract calls this to update the price with the oracle value\"},\"updateRateModule(address)\":{\"notice\":\"updates the rateModule address\"},\"updateStabilityModule(address)\":{\"notice\":\"updates the address fees are sent to\"},\"withdrawCollateral(address,address,address,uint256)\":{\"notice\":\"withdraws collateral from `_owner`'s vault to `_to`'s address\"},\"withdrawFees()\":{\"notice\":\"allows the stability module to withdraw all fees that have been paid on borrowed currency\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/vault.sol\":\"Vault\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"appendCBOR\":false,\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":descent-collective/oracle-module/=lib/oracle-module/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":oracle-module/=lib/oracle-module/\",\":solady/=lib/solady/src/\"]},\"sources\":{\"lib/solady/src/auth/Ownable.sol\":{\"keccak256\":\"0xc208cdd9de02bbf4b5edad18b88e23a2be7ff56d2287d5649329dc7cda64b9a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e8fba079cc7230c617f7493a2e97873f88e59a53a5018fcb2e2b6ac42d8aa5a3\",\"dweb:/ipfs/QmTXg8GSt8hsK2cZhbPFrund1mrwVdkLQmEPoQaFy4fhjs\"]},\"lib/solady/src/tokens/ERC20.sol\":{\"keccak256\":\"0xb4a3f9ba8a05107f7370de42cff57f3ad26dafd438712c11531a5892de2f59e0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f0a9ca06e3cf6dea1f9a4c5599581573b7d81cd64dc3afb582f325ccf5fdd6dc\",\"dweb:/ipfs/Qmb9r5dDceNF4W8S5u6i85RsNTgE5XG9HbTXkyS25ad3C6\"]},\"lib/solady/src/utils/SafeTransferLib.sol\":{\"keccak256\":\"0xf98506fade18a92e3d8d0a0ca0bdaeaa099d7620aac2a9d76b5f3d0bcd10691c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a3495c9d108bc69951a12c5ce9f05851cc921f0bb69e2505756e79f3ddab4e1a\",\"dweb:/ipfs/QmT3XwbmdbQCxw7iNcF7DoiypDd5vs2ETFWirXqmJ86Meg\"]},\"src/currency.sol\":{\"keccak256\":\"0xc266e97010a71e6ac755dce3e51a5a5844663b355e20ab40bf2020fd9308369b\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://d2660220b8a14c6d06351765dd7accec03e350e7fa9ae960c1505bea1e5d8d2d\",\"dweb:/ipfs/QmdYdPSnQC2nym38Fca4vRLKU4A78AQkgYasdg3TaRLGNY\"]},\"src/helpers/pausable.sol\":{\"keccak256\":\"0x8acce52dcd450c73da0f77d9539962826da23aca05aa7d0c7568614e89aed997\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://35e2f674e01c0d6107f31d1c32bb2780d442420b7d26636f560a4eb1007f4a8b\",\"dweb:/ipfs/QmWwVLUGiJq6Q3fK6Zhx4pc6kaqC73pkZ1ntfVA3QCHTpd\"]},\"src/interfaces/ICurrency.sol\":{\"keccak256\":\"0x3b7adace3df08c34906612358d435ffff3b90b5eec0eae34b6335cc8dcd0e7ed\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://370c80ec5636bd95342256d4116f703e633e6b0467ee530397e9b5cada37f998\",\"dweb:/ipfs/QmPQ5KY37JpfuSAXpJ16kBXAQVJcE253cfjYGcBEcMLERz\"]},\"src/interfaces/IRate.sol\":{\"keccak256\":\"0x166dc423b74b60302197a27fb64557ee8ef6bafe416deb08fe7ecf94f0ede1d1\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://123ef521857e33b10b6f92b743831b26dd5100e57271353bf5c1882fc41c6a2e\",\"dweb:/ipfs/QmdK5y8SntLHAVoNRq6isddmNYunrpv1JxAxyEgRiHdAAj\"]},\"src/interfaces/IVault.sol\":{\"keccak256\":\"0x5684f59679e090ebe583d31fda6d8882469436e71670a4873151793675c7c6c4\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://b265c21b1ff01a8c5cf9b1120feb6b5419a96a0e2a6d1ff4bdd89934c7869c9c\",\"dweb:/ipfs/QmdbCgiYE763cAHZ6nevhf7EzF8BzEkfwsbw4qWuxBkm8f\"]},\"src/mocks/ERC20Token.sol\":{\"keccak256\":\"0x62b878fb4dde1f455866e0c1290cc50714805d02c2848a4a9bb33c5dfbc8464d\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://7af3f5638d366abfbca3186813449259a33ed43e7c13ec983d389d73df1ad204\",\"dweb:/ipfs/QmeMdoEVTGqdcgSicTTcmycSQjToT7Sn5ZTgZdVFH9E6HA\"]},\"src/vault.sol\":{\"keccak256\":\"0x377a877ac854164da4e6b2491e2dba44d75cb56216e6b2456fa6b815565ac5e5\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://a0a67817c649b3f65de4971c5346ea93b7432ac2f4e0013e5fb681e488aa1b58\",\"dweb:/ipfs/Qmbvcgn3AoTEahq9qgfuiL81zkZKLVQRbMhMeeqTMiiuKv\"]}},\"version\":1}",
  "metadata": {
    "compiler": {
      "version": "0.8.21+commit.d9974bed"
    },
    "language": "Solidity",
    "output": {
      "abi": [
        {
          "inputs": [
            {
              "internalType": "contract Currency",
              "name": "_currencyToken",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_baseRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_debtCeiling",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "constructor"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "AlreadyInitialized"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "BadCollateralRatio"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "CollateralAlreadyExists"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "CollateralDebtCeilingExceeded"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "CollateralDoesNotExist"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "CollateralRatioNotImproved"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "EthTransferFailed"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "GlobalDebtCeilingExceeded"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "InsufficientCurrencyAmountToPay"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "InvalidStabilityModule"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NewOwnerIsZeroAddress"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NoHandoverRequest"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NotEnoughCollateralToPay"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NotFeedContract"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NotOwnerOrReliedUpon"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "NotPaused"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "Paused"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "PositionIsSafe"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "TotalUserCollateralBelowFloor"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "Unauthorized"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "UnrecognizedParam"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "ZeroAddress"
        },
        {
          "inputs": [],
          "type": "error",
          "name": "ZeroCollateral"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "CollateralDeposited",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "collateralAddress",
              "type": "address",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "CollateralTypeAdded",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "to",
              "type": "address",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "CollateralWithdrawn",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "CurrencyBurned",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "CurrencyMinted",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "FeesPaid",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "owner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "liquidator",
              "type": "address",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "currencyAmountPaid",
              "type": "uint256",
              "indexed": false
            },
            {
              "internalType": "uint256",
              "name": "collateralAmountCovered",
              "type": "uint256",
              "indexed": false
            }
          ],
          "type": "event",
          "name": "Liquidated",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipHandoverCanceled",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipHandoverRequested",
          "anonymous": false
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "oldOwner",
              "type": "address",
              "indexed": true
            },
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address",
              "indexed": true
            }
          ],
          "type": "event",
          "name": "OwnershipTransferred",
          "anonymous": false
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "CURRENCY_TOKEN",
          "outputs": [
            {
              "internalType": "contract Currency",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "baseRateInfo",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "rate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accumulatedRate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lastUpdateTime",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "burnCurrency"
        },
        {
          "inputs": [],
          "stateMutability": "payable",
          "type": "function",
          "name": "cancelOwnershipHandover"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "collateralMapping",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "totalDepositedCollateral",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "totalBorrowedAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "liquidationThreshold",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "liquidationBonus",
              "type": "uint256"
            },
            {
              "internalType": "struct IVault.RateInfo",
              "name": "rateInfo",
              "type": "tuple",
              "components": [
                {
                  "internalType": "uint256",
                  "name": "rate",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "accumulatedRate",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "lastUpdateTime",
                  "type": "uint256"
                }
              ]
            },
            {
              "internalType": "uint256",
              "name": "price",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "debtCeiling",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "collateralFloorPerPosition",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "additionalCollateralPrecision",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address"
            }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "completeOwnershipHandover"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_rate",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_liquidationThreshold",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_liquidationBonus",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_debtCeiling",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "_collateralFloorPerPosition",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "createCollateralType"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "debt",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "debtCeiling",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_reliedUpon",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "deny"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "depositCollateral"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "feedModule",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_currencyAmountToPay",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "liquidate"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "mintCurrency"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "owner",
          "outputs": [
            {
              "internalType": "address",
              "name": "result",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "pendingOwner",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "ownershipHandoverExpiresAt",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "result",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "paidFees",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "pause"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "rateModule",
          "outputs": [
            {
              "internalType": "contract IRate",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_tokenAddress",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "recoverToken"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_relyUpon",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "rely"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "relyMapping",
          "outputs": [
            {
              "internalType": "bool",
              "name": "",
              "type": "bool"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "payable",
          "type": "function",
          "name": "renounceOwnership"
        },
        {
          "inputs": [],
          "stateMutability": "payable",
          "type": "function",
          "name": "requestOwnershipHandover"
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "stabilityModule",
          "outputs": [
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ]
        },
        {
          "inputs": [],
          "stateMutability": "view",
          "type": "function",
          "name": "status",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "newOwner",
              "type": "address"
            }
          ],
          "stateMutability": "payable",
          "type": "function",
          "name": "transferOwnership"
        },
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "unpause"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_baseRate",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updateBaseRate"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "enum IVault.ModifiableParameters",
              "name": "_param",
              "type": "uint8"
            },
            {
              "internalType": "uint256",
              "name": "_data",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updateCollateralData"
        },
        {
          "inputs": [
            {
              "internalType": "uint256",
              "name": "_debtCeiling",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updateDebtCeiling"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_feedModule",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updateFeedModule"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralAddress",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_price",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updatePrice"
        },
        {
          "inputs": [
            {
              "internalType": "contract IRate",
              "name": "_rateModule",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updateRateModule"
        },
        {
          "inputs": [
            {
              "internalType": "address",
              "name": "_stabilityModule",
              "type": "address"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "updateStabilityModule"
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "",
              "type": "address"
            }
          ],
          "stateMutability": "view",
          "type": "function",
          "name": "vaultMapping",
          "outputs": [
            {
              "internalType": "uint256",
              "name": "depositedCollateral",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "borrowedAmount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "accruedFees",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lastTotalAccumulatedRate",
              "type": "uint256"
            }
          ]
        },
        {
          "inputs": [
            {
              "internalType": "contract ERC20Token",
              "name": "_collateralToken",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_owner",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "_to",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "_amount",
              "type": "uint256"
            }
          ],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "withdrawCollateral"
        },
        {
          "inputs": [],
          "stateMutability": "nonpayable",
          "type": "function",
          "name": "withdrawFees"
        }
      ],
      "devdoc": {
        "kind": "dev",
        "methods": {
          "burnCurrency(address,address,uint256)": {
            "details": "we accrue fees here to enable full payment of both borrowed amount and fees in one function. This way unupdated accrued fees are accounted for too and can be paid backshould revert if the collateral does not exist      should revert if the caller is not the `_owner` and not also not relied upon      should revert if the amount of currency to burn / pay back is more than `borrowed amount + total accrued fees`",
            "params": {
              "_amount": "amount of currency to pay back / burn",
              "_collateralToken": "contract address of collateral to burn/pay back the vault's currency for,",
              "_owner": "owner of the vault to pay back it's loan"
            }
          },
          "cancelOwnershipHandover()": {
            "details": "Cancels the two-step ownership handover to the caller, if any."
          },
          "completeOwnershipHandover(address)": {
            "details": "Allows the owner to complete the two-step ownership handover to `pendingOwner`. Reverts if there is no existing ownership handover requested by `pendingOwner`."
          },
          "createCollateralType(address,uint256,uint256,uint256,uint256,uint256)": {
            "details": "should revert if contract is paused      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role      should revert if the collateral already exists, i.e if _collateral.rateInfo.rate == 0",
            "params": {
              "_collateralFloorPerPosition": "value to set as the minimum amount of this collateral that can be borrowed against",
              "_collateralToken": "contract address of the token to add",
              "_debtCeiling": "value to set as the debt ceiling of the collateral, used to limit risk by capping borrowable amount of currency backed by the given collateral",
              "_liquidationBonus": "value to set as the liquidation bonus of the collateral, used to incentivize liquidators, should be denominated in 1e18 where 1e18 is 100%",
              "_liquidationThreshold": "value to set as the liquidation threshold of the collateral, should be denominated in 1e18 where 1e18 is 100%",
              "_rate": "value to set as the collateral rate (per second) for the collateral, should be denominated in 1e18 where 1e18 is 100%"
            }
          },
          "deny(address)": {
            "details": "should revert if the contract is paused",
            "params": {
              "_reliedUpon": "address to rely upon"
            }
          },
          "depositCollateral(address,address,uint256)": {
            "details": "should revert if the contract is paused      should revert if the collateral does not exist      should revert if transfer from `_owner` to this contract fails based on SafeERC20.safeTransferFrom()'s expectations of a successful erc20 transferFrom call",
            "params": {
              "_amount": "amount of `_collateralToken` to deposit into `_owner`'s vault",
              "_collateralToken": "contract address of the collateral to deposit",
              "_owner": "owner of the vault to deposit into"
            }
          },
          "liquidate(address,address,address,uint256)": {
            "details": "updates fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the start and end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratioshould revert if the collateral does not exist      should revert if the vault is not under-water      should revert if liqudiation did not strictly imporve the collateral ratio of the vault",
            "params": {
              "_collateralToken": "contract address of collateral used by vault that is to be liquidate, also the token to recieved by the `_to` address after liquidation",
              "_currencyAmountToPay": "the amount of currency tokens to pay back for `_owner`",
              "_owner": "owner of the vault to liquidate",
              "_to": "address to send the liquidated collateral (collateral covered) to"
            }
          },
          "mintCurrency(address,address,address,uint256)": {
            "details": "if the users currencly minted/borrwed amount if greater than 0, it should update fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratio      else i.e when currenctly minted/borrwed amount is 0 (this means that no past fees to accrue), it should set the `lastTotalAccumulatedRate` of the vault to be the current totalAccumulatedRate (i.e current accumulated base rate + current accumulated collateral rate, emphaisis on current as these values are recalculated for both rates to their current values)should revert if the contract is paused      should revert if the collateral does not exist      should revert if the caller is not the `_owner` and not also not relied upon      should revert if `_owner`'s deposited collateral amount is less than the collateralFloorPerPosition for the given collateral      should revert if mint to the `_to` address fails      should revert if the collateral ratio of `_owner` is below the liquidation threshold at the end of the function. This can happen if the position was already under-water (liquidatable) prior to the function call or if the withdrawal of `_amount` make it under-water",
            "params": {
              "_amount": "amount of currency to mint",
              "_collateralToken": "contract address of collateral to mint/borrow the vault's currency against",
              "_owner": "owner of the vault to use it's collateral balance",
              "_to": "address to send the minted/borrowed currency to"
            }
          },
          "owner()": {
            "details": "Returns the owner of the contract."
          },
          "ownershipHandoverExpiresAt(address)": {
            "details": "Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`."
          },
          "pause()": {
            "details": "interactions with functions without a `whenNotPaused` or `whenPaused` modifier are unaffectedreverts if not paused"
          },
          "recoverToken(address,address)": {
            "details": "if `_tokenAddress` is address(0), send all eth in this contract to `_to`      else if `_tokenAddress` is this vaults `CURRENCY_TOKEN`, send balance of this address of that token minus the paidFees (i.e unwithdrawn paid fees)      else (this means this token can/might be a collateral), send the balance of this address of that token minus the `totalDepositedCollateral` of it as a collateralreverts if `_tokenAddress` is address(0) i.e eth, and `_to` is a contract that has no non reverting way to accept eth      reverts if `_tokenAddress` is not `CURRENCY_TOKEN` and not `address(0) but is a contract",
            "params": {
              "_to": "address to send the recovered tokens to",
              "_tokenAddress": "address of token to recover. if it is eth, address(0) is expected"
            }
          },
          "rely(address)": {
            "details": "should revert if the contract is paused",
            "params": {
              "_relyUpon": "address to rely upon"
            }
          },
          "renounceOwnership()": {
            "details": "override renounce ownership to be impossible"
          },
          "requestOwnershipHandover()": {
            "details": "Request a two-step ownership handover to the caller. The request will automatically expire in 48 hours (172800 seconds) by default."
          },
          "transferOwnership(address)": {
            "details": "Allows the owner to transfer the ownership to `newOwner`."
          },
          "unpause()": {
            "details": "interactions with functions without a `whenNotPaused` or `whenPaused` modifier are unaffectedreverts if not paused"
          },
          "updateBaseRate(uint256)": {
            "details": "updates the last stored accumulated rate by adding accumulated rate (since baseRateInfo.lastUpdateTime) to it before updating the rate, this way borrowers are charged the previous rate up until block.timestamp before being charged the new rate.updates the last update time too for correct future updates to accumulate past rates correctlyshould revert if the contract is paused      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role",
            "params": {
              "_baseRate": "new base rate (per second), should be denominated in 1e18 where 1e18 is 100%"
            }
          },
          "updateCollateralData(address,uint8,uint256)": {
            "details": "updates the value of the chosen parameter with `_data`should revert if the contract is paused      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role      should revert if the collateral does not exist      should revert if `_param` is not a variant of ModifiableParameters enum",
            "params": {
              "_collateralToken": "contract address of the token to modify it's parameters",
              "_param": "contract address of the token to modify it's parameters"
            }
          },
          "updateDebtCeiling(uint256)": {
            "details": "reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
          },
          "updateFeedModule(address)": {
            "details": "reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
          },
          "updatePrice(address,uint256)": {
            "details": "should revert if the contract is paused      should revert if the caller does not have the `FEED_CONTRACT_ROLE` role      should revert if the collateral does not exist",
            "params": {
              "_collateralAddress": "contract address of the collateral token to update it's price",
              "_price": "new price"
            }
          },
          "updateRateModule(address)": {
            "details": "reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
          },
          "updateStabilityModule(address)": {
            "details": "reverts if the contract is pausedreverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
          },
          "withdrawCollateral(address,address,address,uint256)": {
            "details": "should update fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratioshould revert if the collateral does not exist      should revert if the caller is not the `_owner` and not also not relied upon      should revert if transfer from this contract to the `_to` address fails based on SafeERC20.safeTransfer()'s expectations of a successful erc20 transfer call      should revert if the collateral ratio of `_owner` is below the liquidation threshold at the end of the function. This can happen if the position was already under-water (liquidatable) prior to the function call or if the withdrawal of `_amount` make it under-water",
            "params": {
              "_amount": "amount of `_collateralToken` to withdraw from `_owner`'s vault to `_to`'s address",
              "_collateralToken": "contract address of the collateral to withdraw",
              "_owner": "owner of the vault to withdraw from",
              "_to": "address to send the withdrawn collateral to"
            }
          },
          "withdrawFees()": {
            "details": "updates the paidFees for the collateral and globally then transfers the token to the callershould revert if the contract is pausedshould revert if the stabilityModule is address(0)"
          }
        },
        "version": 1
      },
      "userdoc": {
        "kind": "user",
        "methods": {
          "burnCurrency(address,address,uint256)": {
            "notice": "burns/pays back a borrowed/minted currency"
          },
          "createCollateralType(address,uint256,uint256,uint256,uint256,uint256)": {
            "notice": "Creates a collateral type that'll be accepted by the system"
          },
          "deny(address)": {
            "notice": "lets an address (the caller) remove access of another address to perform actions on it's (the caller's) vault"
          },
          "depositCollateral(address,address,uint256)": {
            "notice": "deposits collateral into `_owner`'s vault from `_owner`'s address"
          },
          "liquidate(address,address,address,uint256)": {
            "notice": "liquidates a vault making sure the liquidation strictly improves the collateral ratio i.e doesn't leave it the same as before or decreases it (if that's possible)"
          },
          "mintCurrency(address,address,address,uint256)": {
            "notice": "mints/borrows `_amount` of currency to `_to`, backed by `_owner`'s deposited collateral"
          },
          "pause()": {
            "notice": "prevents interactions with functions having `whenNotPaused` modifier and allows interactions with ones with the `whenPaused` modifier"
          },
          "recoverToken(address,address)": {
            "notice": "Used to recover `all` tokens and eth `possible` without affecting collateral reserves or unwithdrawn interest"
          },
          "rely(address)": {
            "notice": "lets an address (the caller) approve another address to perform actions on it's (the caller's) vault"
          },
          "unpause()": {
            "notice": "allows interactions with functions having `whenNotPaused` modifier and prevents interactions with ones with the `whenPaused` modifier"
          },
          "updateBaseRate(uint256)": {
            "notice": "updates the base rate charged for borrowing this currency"
          },
          "updateCollateralData(address,uint8,uint256)": {
            "notice": "updates `manually updateable` parameters of an existing collateral"
          },
          "updateDebtCeiling(uint256)": {
            "notice": "updates the global debt ceiling"
          },
          "updateFeedModule(address)": {
            "notice": "updates the feedModule address"
          },
          "updatePrice(address,uint256)": {
            "notice": "feed contract calls this to update the price with the oracle value"
          },
          "updateRateModule(address)": {
            "notice": "updates the rateModule address"
          },
          "updateStabilityModule(address)": {
            "notice": "updates the address fees are sent to"
          },
          "withdrawCollateral(address,address,address,uint256)": {
            "notice": "withdraws collateral from `_owner`'s vault to `_to`'s address"
          },
          "withdrawFees()": {
            "notice": "allows the stability module to withdraw all fees that have been paid on borrowed currency"
          }
        },
        "version": 1
      }
    },
    "settings": {
      "remappings": [
        "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
        "descent-collective/oracle-module/=lib/oracle-module/src/",
        "ds-test/=lib/forge-std/lib/ds-test/src/",
        "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
        "forge-std/=lib/forge-std/src/",
        "openzeppelin-contracts/=lib/openzeppelin-contracts/",
        "oracle-module/=lib/oracle-module/",
        "solady/=lib/solady/src/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 1000000
      },
      "metadata": {
        "bytecodeHash": "none",
        "appendCBOR": false
      },
      "compilationTarget": {
        "src/vault.sol": "Vault"
      },
      "libraries": {}
    },
    "sources": {
      "lib/solady/src/auth/Ownable.sol": {
        "keccak256": "0xc208cdd9de02bbf4b5edad18b88e23a2be7ff56d2287d5649329dc7cda64b9a3",
        "urls": [
          "bzz-raw://e8fba079cc7230c617f7493a2e97873f88e59a53a5018fcb2e2b6ac42d8aa5a3",
          "dweb:/ipfs/QmTXg8GSt8hsK2cZhbPFrund1mrwVdkLQmEPoQaFy4fhjs"
        ],
        "license": "MIT"
      },
      "lib/solady/src/tokens/ERC20.sol": {
        "keccak256": "0xb4a3f9ba8a05107f7370de42cff57f3ad26dafd438712c11531a5892de2f59e0",
        "urls": [
          "bzz-raw://f0a9ca06e3cf6dea1f9a4c5599581573b7d81cd64dc3afb582f325ccf5fdd6dc",
          "dweb:/ipfs/Qmb9r5dDceNF4W8S5u6i85RsNTgE5XG9HbTXkyS25ad3C6"
        ],
        "license": "MIT"
      },
      "lib/solady/src/utils/SafeTransferLib.sol": {
        "keccak256": "0xf98506fade18a92e3d8d0a0ca0bdaeaa099d7620aac2a9d76b5f3d0bcd10691c",
        "urls": [
          "bzz-raw://a3495c9d108bc69951a12c5ce9f05851cc921f0bb69e2505756e79f3ddab4e1a",
          "dweb:/ipfs/QmT3XwbmdbQCxw7iNcF7DoiypDd5vs2ETFWirXqmJ86Meg"
        ],
        "license": "MIT"
      },
      "src/currency.sol": {
        "keccak256": "0xc266e97010a71e6ac755dce3e51a5a5844663b355e20ab40bf2020fd9308369b",
        "urls": [
          "bzz-raw://d2660220b8a14c6d06351765dd7accec03e350e7fa9ae960c1505bea1e5d8d2d",
          "dweb:/ipfs/QmdYdPSnQC2nym38Fca4vRLKU4A78AQkgYasdg3TaRLGNY"
        ],
        "license": "GPL-3.0"
      },
      "src/helpers/pausable.sol": {
        "keccak256": "0x8acce52dcd450c73da0f77d9539962826da23aca05aa7d0c7568614e89aed997",
        "urls": [
          "bzz-raw://35e2f674e01c0d6107f31d1c32bb2780d442420b7d26636f560a4eb1007f4a8b",
          "dweb:/ipfs/QmWwVLUGiJq6Q3fK6Zhx4pc6kaqC73pkZ1ntfVA3QCHTpd"
        ],
        "license": "GPL-3.0"
      },
      "src/interfaces/ICurrency.sol": {
        "keccak256": "0x3b7adace3df08c34906612358d435ffff3b90b5eec0eae34b6335cc8dcd0e7ed",
        "urls": [
          "bzz-raw://370c80ec5636bd95342256d4116f703e633e6b0467ee530397e9b5cada37f998",
          "dweb:/ipfs/QmPQ5KY37JpfuSAXpJ16kBXAQVJcE253cfjYGcBEcMLERz"
        ],
        "license": "GPL-3.0"
      },
      "src/interfaces/IRate.sol": {
        "keccak256": "0x166dc423b74b60302197a27fb64557ee8ef6bafe416deb08fe7ecf94f0ede1d1",
        "urls": [
          "bzz-raw://123ef521857e33b10b6f92b743831b26dd5100e57271353bf5c1882fc41c6a2e",
          "dweb:/ipfs/QmdK5y8SntLHAVoNRq6isddmNYunrpv1JxAxyEgRiHdAAj"
        ],
        "license": "GPL-3.0"
      },
      "src/interfaces/IVault.sol": {
        "keccak256": "0x5684f59679e090ebe583d31fda6d8882469436e71670a4873151793675c7c6c4",
        "urls": [
          "bzz-raw://b265c21b1ff01a8c5cf9b1120feb6b5419a96a0e2a6d1ff4bdd89934c7869c9c",
          "dweb:/ipfs/QmdbCgiYE763cAHZ6nevhf7EzF8BzEkfwsbw4qWuxBkm8f"
        ],
        "license": "GPL-3.0"
      },
      "src/mocks/ERC20Token.sol": {
        "keccak256": "0x62b878fb4dde1f455866e0c1290cc50714805d02c2848a4a9bb33c5dfbc8464d",
        "urls": [
          "bzz-raw://7af3f5638d366abfbca3186813449259a33ed43e7c13ec983d389d73df1ad204",
          "dweb:/ipfs/QmeMdoEVTGqdcgSicTTcmycSQjToT7Sn5ZTgZdVFH9E6HA"
        ],
        "license": "GPL-3.0"
      },
      "src/vault.sol": {
        "keccak256": "0x377a877ac854164da4e6b2491e2dba44d75cb56216e6b2456fa6b815565ac5e5",
        "urls": [
          "bzz-raw://a0a67817c649b3f65de4971c5346ea93b7432ac2f4e0013e5fb681e488aa1b58",
          "dweb:/ipfs/Qmbvcgn3AoTEahq9qgfuiL81zkZKLVQRbMhMeeqTMiiuKv"
        ],
        "license": "GPL-3.0"
      }
    },
    "version": 1
  },
  "ast": {
    "absolutePath": "src/vault.sol",
    "id": 48281,
    "exportedSymbols": {
      "Currency": [46042],
      "ERC20": [44800],
      "ERC20Token": [46438],
      "IRate": [46191],
      "IVault": [46316],
      "Ownable": [44381],
      "Pausable": [46103],
      "SafeTransferLib": [44996],
      "Vault": [48280]
    },
    "nodeType": "SourceUnit",
    "src": "36:35519:38",
    "nodes": [
      {
        "id": 46650,
        "nodeType": "PragmaDirective",
        "src": "36:23:38",
        "nodes": [],
        "literals": ["solidity", "0.8", ".21"]
      },
      {
        "id": 46652,
        "nodeType": "ImportDirective",
        "src": "108:48:38",
        "nodes": [],
        "absolutePath": "lib/solady/src/auth/Ownable.sol",
        "file": "solady/auth/Ownable.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 44382,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46651,
              "name": "Ownable",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 44381,
              "src": "116:7:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46654,
        "nodeType": "ImportDirective",
        "src": "157:46:38",
        "nodes": [],
        "absolutePath": "lib/solady/src/tokens/ERC20.sol",
        "file": "solady/tokens/ERC20.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 44801,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46653,
              "name": "ERC20",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 44800,
              "src": "165:5:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46656,
        "nodeType": "ImportDirective",
        "src": "204:65:38",
        "nodes": [],
        "absolutePath": "lib/solady/src/utils/SafeTransferLib.sol",
        "file": "solady/utils/SafeTransferLib.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 44997,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46655,
              "name": "SafeTransferLib",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 44996,
              "src": "212:15:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46658,
        "nodeType": "ImportDirective",
        "src": "270:47:38",
        "nodes": [],
        "absolutePath": "src/interfaces/IVault.sol",
        "file": "./interfaces/IVault.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 46317,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46657,
              "name": "IVault",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46316,
              "src": "278:6:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46660,
        "nodeType": "ImportDirective",
        "src": "318:40:38",
        "nodes": [],
        "absolutePath": "src/currency.sol",
        "file": "./currency.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 46043,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46659,
              "name": "Currency",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46042,
              "src": "326:8:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46662,
        "nodeType": "ImportDirective",
        "src": "359:48:38",
        "nodes": [],
        "absolutePath": "src/helpers/pausable.sol",
        "file": "./helpers/pausable.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 46104,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46661,
              "name": "Pausable",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46103,
              "src": "367:8:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46664,
        "nodeType": "ImportDirective",
        "src": "408:50:38",
        "nodes": [],
        "absolutePath": "src/mocks/ERC20Token.sol",
        "file": "./mocks/ERC20Token.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 46439,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46663,
              "name": "ERC20Token",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46438,
              "src": "416:10:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 46666,
        "nodeType": "ImportDirective",
        "src": "459:45:38",
        "nodes": [],
        "absolutePath": "src/interfaces/IRate.sol",
        "file": "./interfaces/IRate.sol",
        "nameLocation": "-1:-1:-1",
        "scope": 48281,
        "sourceUnit": 46192,
        "symbolAliases": [
          {
            "foreign": {
              "id": 46665,
              "name": "IRate",
              "nodeType": "Identifier",
              "overloadedDeclarations": [],
              "referencedDeclaration": 46191,
              "src": "467:5:38",
              "typeDescriptions": {}
            },
            "nameLocation": "-1:-1:-1"
          }
        ],
        "unitAlias": ""
      },
      {
        "id": 48280,
        "nodeType": "ContractDefinition",
        "src": "506:35048:38",
        "nodes": [
          {
            "id": 46675,
            "nodeType": "VariableDeclaration",
            "src": "556:46:38",
            "nodes": [],
            "constant": true,
            "mutability": "constant",
            "name": "PRECISION_DEGREE",
            "nameLocation": "581:16:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46673,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "556:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "3138",
              "id": 46674,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "600:2:38",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_18_by_1",
                "typeString": "int_const 18"
              },
              "value": "18"
            },
            "visibility": "private"
          },
          {
            "id": 46678,
            "nodeType": "VariableDeclaration",
            "src": "608:48:38",
            "nodes": [],
            "constant": true,
            "mutability": "constant",
            "name": "MAX_TOKEN_DECIMALS",
            "nameLocation": "633:18:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46676,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "608:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "3138",
              "id": 46677,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "654:2:38",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_18_by_1",
                "typeString": "int_const 18"
              },
              "value": "18"
            },
            "visibility": "private"
          },
          {
            "id": 46686,
            "nodeType": "VariableDeclaration",
            "src": "662:65:38",
            "nodes": [],
            "constant": true,
            "mutability": "constant",
            "name": "PRECISION",
            "nameLocation": "687:9:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46679,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "662:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "commonType": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              },
              "id": 46685,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "lValueRequested": false,
              "leftExpression": {
                "hexValue": "31",
                "id": 46680,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "699:1:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_1_by_1",
                  "typeString": "int_const 1"
                },
                "value": "1"
              },
              "nodeType": "BinaryOperation",
              "operator": "*",
              "rightExpression": {
                "components": [
                  {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 46683,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "lValueRequested": false,
                    "leftExpression": {
                      "hexValue": "3130",
                      "id": 46681,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "704:2:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_10_by_1",
                        "typeString": "int_const 10"
                      },
                      "value": "10"
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "**",
                    "rightExpression": {
                      "id": 46682,
                      "name": "PRECISION_DEGREE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46675,
                      "src": "710:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "704:22:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 46684,
                "isConstant": false,
                "isInlineArray": false,
                "isLValue": false,
                "isPure": true,
                "lValueRequested": false,
                "nodeType": "TupleExpression",
                "src": "703:24:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "src": "699:28:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "private"
          },
          {
            "id": 46694,
            "nodeType": "VariableDeclaration",
            "src": "733:76:38",
            "nodes": [],
            "constant": true,
            "mutability": "constant",
            "name": "HUNDRED_PERCENTAGE",
            "nameLocation": "758:18:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46687,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "733:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "commonType": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              },
              "id": 46693,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "lValueRequested": false,
              "leftExpression": {
                "hexValue": "313030",
                "id": 46688,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "779:3:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_100_by_1",
                  "typeString": "int_const 100"
                },
                "value": "100"
              },
              "nodeType": "BinaryOperation",
              "operator": "*",
              "rightExpression": {
                "components": [
                  {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 46691,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "lValueRequested": false,
                    "leftExpression": {
                      "hexValue": "3130",
                      "id": 46689,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "786:2:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_10_by_1",
                        "typeString": "int_const 10"
                      },
                      "value": "10"
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "**",
                    "rightExpression": {
                      "id": 46690,
                      "name": "PRECISION_DEGREE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46675,
                      "src": "792:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "786:22:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 46692,
                "isConstant": false,
                "isInlineArray": false,
                "isLValue": false,
                "isPure": true,
                "lValueRequested": false,
                "nodeType": "TupleExpression",
                "src": "785:24:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "src": "779:30:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "private"
          },
          {
            "id": 46697,
            "nodeType": "VariableDeclaration",
            "src": "815:57:38",
            "nodes": [],
            "constant": true,
            "mutability": "constant",
            "name": "ADDITIONAL_FEED_PRECISION",
            "nameLocation": "840:25:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46695,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "815:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": {
              "hexValue": "31653132",
              "id": 46696,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "868:4:38",
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1000000000000_by_1",
                "typeString": "int_const 1000000000000"
              },
              "value": "1e12"
            },
            "visibility": "private"
          },
          {
            "id": 46700,
            "nodeType": "VariableDeclaration",
            "src": "937:40:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "e72531c8",
            "mutability": "immutable",
            "name": "CURRENCY_TOKEN",
            "nameLocation": "963:14:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_Currency_$46042",
              "typeString": "contract Currency"
            },
            "typeName": {
              "id": 46699,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 46698,
                "name": "Currency",
                "nameLocations": ["937:8:38"],
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 46042,
                "src": "937:8:38"
              },
              "referencedDeclaration": 46042,
              "src": "937:8:38",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Currency_$46042",
                "typeString": "contract Currency"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46702,
            "nodeType": "VariableDeclaration",
            "src": "1021:30:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "ea061ad4",
            "mutability": "mutable",
            "name": "stabilityModule",
            "nameLocation": "1036:15:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 46701,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1021:7:38",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46704,
            "nodeType": "VariableDeclaration",
            "src": "1077:25:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "a12ad552",
            "mutability": "mutable",
            "name": "feedModule",
            "nameLocation": "1092:10:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 46703,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1077:7:38",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46707,
            "nodeType": "VariableDeclaration",
            "src": "1133:23:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "336d391e",
            "mutability": "mutable",
            "name": "rateModule",
            "nameLocation": "1146:10:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IRate_$46191",
              "typeString": "contract IRate"
            },
            "typeName": {
              "id": 46706,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 46705,
                "name": "IRate",
                "nameLocations": ["1133:5:38"],
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 46191,
                "src": "1133:5:38"
              },
              "referencedDeclaration": 46191,
              "src": "1133:5:38",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IRate_$46191",
                "typeString": "contract IRate"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46710,
            "nodeType": "VariableDeclaration",
            "src": "1215:28:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "13f60c9a",
            "mutability": "mutable",
            "name": "baseRateInfo",
            "nameLocation": "1231:12:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
              "typeString": "struct IVault.RateInfo"
            },
            "typeName": {
              "id": 46709,
              "nodeType": "UserDefinedTypeName",
              "pathNode": {
                "id": 46708,
                "name": "RateInfo",
                "nameLocations": ["1215:8:38"],
                "nodeType": "IdentifierPath",
                "referencedDeclaration": 46280,
                "src": "1215:8:38"
              },
              "referencedDeclaration": 46280,
              "src": "1215:8:38",
              "typeDescriptions": {
                "typeIdentifier": "t_struct$_RateInfo_$46280_storage_ptr",
                "typeString": "struct IVault.RateInfo"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46712,
            "nodeType": "VariableDeclaration",
            "src": "1267:26:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "e1c84ea4",
            "mutability": "mutable",
            "name": "debtCeiling",
            "nameLocation": "1282:11:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46711,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1267:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46714,
            "nodeType": "VariableDeclaration",
            "src": "1339:19:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "0dca59c1",
            "mutability": "mutable",
            "name": "debt",
            "nameLocation": "1354:4:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46713,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1339:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46716,
            "nodeType": "VariableDeclaration",
            "src": "1394:23:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "b80a0a77",
            "mutability": "mutable",
            "name": "paidFees",
            "nameLocation": "1409:8:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 46715,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1394:7:38",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "visibility": "public"
          },
          {
            "id": 46722,
            "nodeType": "VariableDeclaration",
            "src": "1460:62:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "c665471f",
            "mutability": "mutable",
            "name": "collateralMapping",
            "nameLocation": "1505:17:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
              "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo)"
            },
            "typeName": {
              "id": 46721,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 46718,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 46717,
                  "name": "ERC20Token",
                  "nameLocations": ["1468:10:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46438,
                  "src": "1468:10:38"
                },
                "referencedDeclaration": 46438,
                "src": "1468:10:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_contract$_ERC20Token_$46438",
                  "typeString": "contract ERC20Token"
                }
              },
              "nodeType": "Mapping",
              "src": "1460:37:38",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo)"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 46720,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 46719,
                  "name": "CollateralInfo",
                  "nameLocations": ["1482:14:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46300,
                  "src": "1482:14:38"
                },
                "referencedDeclaration": 46300,
                "src": "1482:14:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                  "typeString": "struct IVault.CollateralInfo"
                }
              }
            },
            "visibility": "public"
          },
          {
            "id": 46730,
            "nodeType": "VariableDeclaration",
            "src": "1569:72:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "e2c7283f",
            "mutability": "mutable",
            "name": "vaultMapping",
            "nameLocation": "1629:12:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
              "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo))"
            },
            "typeName": {
              "id": 46729,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 46724,
                "nodeType": "UserDefinedTypeName",
                "pathNode": {
                  "id": 46723,
                  "name": "ERC20Token",
                  "nameLocations": ["1577:10:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46438,
                  "src": "1577:10:38"
                },
                "referencedDeclaration": 46438,
                "src": "1577:10:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_contract$_ERC20Token_$46438",
                  "typeString": "contract ERC20Token"
                }
              },
              "nodeType": "Mapping",
              "src": "1569:52:38",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo))"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 46728,
                "keyName": "",
                "keyNameLocation": "-1:-1:-1",
                "keyType": {
                  "id": 46725,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "1599:7:38",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "1591:29:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                  "typeString": "mapping(address => struct IVault.VaultInfo)"
                },
                "valueName": "",
                "valueNameLocation": "-1:-1:-1",
                "valueType": {
                  "id": 46727,
                  "nodeType": "UserDefinedTypeName",
                  "pathNode": {
                    "id": 46726,
                    "name": "VaultInfo",
                    "nameLocations": ["1610:9:38"],
                    "nodeType": "IdentifierPath",
                    "referencedDeclaration": 46309,
                    "src": "1610:9:38"
                  },
                  "referencedDeclaration": 46309,
                  "src": "1610:9:38",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  }
                }
              }
            },
            "visibility": "public"
          },
          {
            "id": 46736,
            "nodeType": "VariableDeclaration",
            "src": "1699:63:38",
            "nodes": [],
            "constant": false,
            "functionSelector": "5881fc33",
            "mutability": "mutable",
            "name": "relyMapping",
            "nameLocation": "1751:11:38",
            "scope": 48280,
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
              "typeString": "mapping(address => mapping(address => bool))"
            },
            "typeName": {
              "id": 46735,
              "keyName": "",
              "keyNameLocation": "-1:-1:-1",
              "keyType": {
                "id": 46731,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1707:7:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1699:44:38",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                "typeString": "mapping(address => mapping(address => bool))"
              },
              "valueName": "",
              "valueNameLocation": "-1:-1:-1",
              "valueType": {
                "id": 46734,
                "keyName": "",
                "keyNameLocation": "-1:-1:-1",
                "keyType": {
                  "id": 46732,
                  "name": "address",
                  "nodeType": "ElementaryTypeName",
                  "src": "1726:7:38",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  }
                },
                "nodeType": "Mapping",
                "src": "1718:24:38",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                  "typeString": "mapping(address => bool)"
                },
                "valueName": "",
                "valueNameLocation": "-1:-1:-1",
                "valueType": {
                  "id": 46733,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "1737:4:38",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                }
              }
            },
            "visibility": "public"
          },
          {
            "id": 46773,
            "nodeType": "FunctionDefinition",
            "src": "1859:296:38",
            "nodes": [],
            "body": {
              "id": 46772,
              "nodeType": "Block",
              "src": "1937:218:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "expression": {
                          "id": 46747,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1964:3:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 46748,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "1968:6:38",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "1964:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 46746,
                      "name": "_initializeOwner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 44260,
                      "src": "1947:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 46749,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1947:28:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46750,
                  "nodeType": "ExpressionStatement",
                  "src": "1947:28:38"
                },
                {
                  "expression": {
                    "id": 46753,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46751,
                      "name": "CURRENCY_TOKEN",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46700,
                      "src": "1985:14:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Currency_$46042",
                        "typeString": "contract Currency"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46752,
                      "name": "_currencyToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46739,
                      "src": "2002:14:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_Currency_$46042",
                        "typeString": "contract Currency"
                      }
                    },
                    "src": "1985:31:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Currency_$46042",
                      "typeString": "contract Currency"
                    }
                  },
                  "id": 46754,
                  "nodeType": "ExpressionStatement",
                  "src": "1985:31:38"
                },
                {
                  "expression": {
                    "id": 46760,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 46755,
                        "name": "baseRateInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46710,
                        "src": "2027:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 46757,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "2040:14:38",
                      "memberName": "lastUpdateTime",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46279,
                      "src": "2027:27:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 46758,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "2057:5:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 46759,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "2063:9:38",
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "src": "2057:15:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2027:45:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 46761,
                  "nodeType": "ExpressionStatement",
                  "src": "2027:45:38"
                },
                {
                  "expression": {
                    "id": 46766,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 46762,
                        "name": "baseRateInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46710,
                        "src": "2082:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 46764,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "2095:4:38",
                      "memberName": "rate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46275,
                      "src": "2082:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46765,
                      "name": "_baseRate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46741,
                      "src": "2102:9:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2082:29:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 46767,
                  "nodeType": "ExpressionStatement",
                  "src": "2082:29:38"
                },
                {
                  "expression": {
                    "id": 46770,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46768,
                      "name": "debtCeiling",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46712,
                      "src": "2122:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46769,
                      "name": "_debtCeiling",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46743,
                      "src": "2136:12:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "2122:26:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 46771,
                  "nodeType": "ExpressionStatement",
                  "src": "2122:26:38"
                }
              ]
            },
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "parameters": {
              "id": 46744,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46739,
                  "mutability": "mutable",
                  "name": "_currencyToken",
                  "nameLocation": "1880:14:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46773,
                  "src": "1871:23:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_Currency_$46042",
                    "typeString": "contract Currency"
                  },
                  "typeName": {
                    "id": 46738,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 46737,
                      "name": "Currency",
                      "nameLocations": ["1871:8:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46042,
                      "src": "1871:8:38"
                    },
                    "referencedDeclaration": 46042,
                    "src": "1871:8:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_Currency_$46042",
                      "typeString": "contract Currency"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 46741,
                  "mutability": "mutable",
                  "name": "_baseRate",
                  "nameLocation": "1904:9:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46773,
                  "src": "1896:17:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 46740,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1896:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 46743,
                  "mutability": "mutable",
                  "name": "_debtCeiling",
                  "nameLocation": "1923:12:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46773,
                  "src": "1915:20:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 46742,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1915:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1870:66:38"
            },
            "returnParameters": {
              "id": 46745,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1937:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 46784,
            "nodeType": "FunctionDefinition",
            "src": "2234:88:38",
            "nodes": [],
            "body": {
              "id": 46783,
              "nodeType": "Block",
              "src": "2297:25:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 46780,
                      "name": "revert",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [-19, -19],
                      "referencedDeclaration": -19,
                      "src": "2307:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_revert_pure$__$returns$__$",
                        "typeString": "function () pure"
                      }
                    },
                    "id": 46781,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2307:8:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 46782,
                  "nodeType": "ExpressionStatement",
                  "src": "2307:8:38"
                }
              ]
            },
            "baseFunctions": [44319],
            "documentation": {
              "id": 46774,
              "nodeType": "StructuredDocumentation",
              "src": "2161:68:38",
              "text": " @dev override renounce ownership to be impossible"
            },
            "functionSelector": "715018a6",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46778,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46777,
                  "name": "onlyOwner",
                  "nameLocations": ["2287:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "2287:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "2287:9:38"
              }
            ],
            "name": "renounceOwnership",
            "nameLocation": "2243:17:38",
            "overrides": {
              "id": 46776,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "2278:8:38"
            },
            "parameters": {
              "id": 46775,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2260:2:38"
            },
            "returnParameters": {
              "id": 46779,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2297:0:38"
            },
            "scope": 48280,
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "id": 46804,
            "nodeType": "ModifierDefinition",
            "src": "2397:198:38",
            "nodes": [],
            "body": {
              "id": 46803,
              "nodeType": "Block",
              "src": "2452:143:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 46796,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "expression": {
                          "baseExpression": {
                            "id": 46790,
                            "name": "collateralMapping",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46722,
                            "src": "2466:17:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                              "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                            }
                          },
                          "id": 46792,
                          "indexExpression": {
                            "id": 46791,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46788,
                            "src": "2484:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2466:35:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                            "typeString": "struct IVault.CollateralInfo storage ref"
                          }
                        },
                        "id": 46793,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "2502:8:38",
                        "memberName": "rateInfo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46291,
                        "src": "2466:44:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 46794,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "2511:4:38",
                      "memberName": "rate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46275,
                      "src": "2466:49:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 46795,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2519:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "2466:54:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 46801,
                  "nodeType": "IfStatement",
                  "src": "2462:116:38",
                  "trueBody": {
                    "id": 46800,
                    "nodeType": "Block",
                    "src": "2522:56:38",
                    "statements": [
                      {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 46797,
                            "name": "CollateralDoesNotExist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46209,
                            "src": "2543:22:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 46798,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2543:24:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 46799,
                        "nodeType": "RevertStatement",
                        "src": "2536:31:38"
                      }
                    ]
                  }
                },
                {
                  "id": 46802,
                  "nodeType": "PlaceholderStatement",
                  "src": "2587:1:38"
                }
              ]
            },
            "documentation": {
              "id": 46785,
              "nodeType": "StructuredDocumentation",
              "src": "2328:64:38",
              "text": " @dev reverts if the collateral does not exist"
            },
            "name": "collateralExists",
            "nameLocation": "2406:16:38",
            "parameters": {
              "id": 46789,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46788,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "2434:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46804,
                  "src": "2423:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 46787,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 46786,
                      "name": "ERC20Token",
                      "nameLocations": ["2423:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "2423:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "2423:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2422:29:38"
            },
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 46828,
            "nodeType": "ModifierDefinition",
            "src": "2795:190:38",
            "nodes": [],
            "body": {
              "id": 46827,
              "nodeType": "Block",
              "src": "2842:143:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 46820,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "id": 46812,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 46809,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46807,
                        "src": "2856:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "!=",
                      "rightExpression": {
                        "expression": {
                          "id": 46810,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "2866:3:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 46811,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "2870:6:38",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "2866:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "src": "2856:20:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "id": 46819,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "!",
                      "prefix": true,
                      "src": "2880:32:38",
                      "subExpression": {
                        "baseExpression": {
                          "baseExpression": {
                            "id": 46813,
                            "name": "relyMapping",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46736,
                            "src": "2881:11:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                              "typeString": "mapping(address => mapping(address => bool))"
                            }
                          },
                          "id": 46815,
                          "indexExpression": {
                            "id": 46814,
                            "name": "_owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46807,
                            "src": "2893:6:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2881:19:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 46818,
                        "indexExpression": {
                          "expression": {
                            "id": 46816,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "2901:3:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 46817,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "2905:6:38",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "2901:10:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "2881:31:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "2856:56:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 46825,
                  "nodeType": "IfStatement",
                  "src": "2852:116:38",
                  "trueBody": {
                    "id": 46824,
                    "nodeType": "Block",
                    "src": "2914:54:38",
                    "statements": [
                      {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 46821,
                            "name": "NotOwnerOrReliedUpon",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46211,
                            "src": "2935:20:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 46822,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2935:22:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 46823,
                        "nodeType": "RevertStatement",
                        "src": "2928:29:38"
                      }
                    ]
                  }
                },
                {
                  "id": 46826,
                  "nodeType": "PlaceholderStatement",
                  "src": "2977:1:38"
                }
              ]
            },
            "documentation": {
              "id": 46805,
              "nodeType": "StructuredDocumentation",
              "src": "2601:189:38",
              "text": " @param _owner address of the vault to interact with\n @dev reverts if the msg.sender is not `_owner` and is also not allowed to interact with `_owner`'s vault"
            },
            "name": "onlyOwnerOrReliedUpon",
            "nameLocation": "2804:21:38",
            "parameters": {
              "id": 46808,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46807,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "2834:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46828,
                  "src": "2826:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46806,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2826:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2825:16:38"
            },
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 46840,
            "nodeType": "FunctionDefinition",
            "src": "3303:77:38",
            "nodes": [],
            "body": {
              "id": 46839,
              "nodeType": "Block",
              "src": "3350:30:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 46837,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46835,
                      "name": "status",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46056,
                      "src": "3360:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46836,
                      "name": "TRUE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46054,
                      "src": "3369:4:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3360:13:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 46838,
                  "nodeType": "ExpressionStatement",
                  "src": "3360:13:38"
                }
              ]
            },
            "baseFunctions": [46094],
            "documentation": {
              "id": 46829,
              "nodeType": "StructuredDocumentation",
              "src": "2991:307:38",
              "text": " @notice allows interactions with functions having `whenNotPaused` modifier and prevents interactions with ones with the `whenPaused` modifier\n @dev interactions with functions without a `whenNotPaused` or `whenPaused` modifier are unaffected\n @dev reverts if not paused"
            },
            "functionSelector": "3f4ba83a",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46833,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46832,
                  "name": "onlyOwner",
                  "nameLocations": ["3340:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "3340:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "3340:9:38"
              }
            ],
            "name": "unpause",
            "nameLocation": "3312:7:38",
            "overrides": {
              "id": 46831,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3331:8:38"
            },
            "parameters": {
              "id": 46830,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3319:2:38"
            },
            "returnParameters": {
              "id": 46834,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3350:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46852,
            "nodeType": "FunctionDefinition",
            "src": "3698:76:38",
            "nodes": [],
            "body": {
              "id": 46851,
              "nodeType": "Block",
              "src": "3743:31:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 46849,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46847,
                      "name": "status",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46056,
                      "src": "3753:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46848,
                      "name": "FALSE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46051,
                      "src": "3762:5:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3753:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 46850,
                  "nodeType": "ExpressionStatement",
                  "src": "3753:14:38"
                }
              ]
            },
            "baseFunctions": [46102],
            "documentation": {
              "id": 46841,
              "nodeType": "StructuredDocumentation",
              "src": "3386:307:38",
              "text": " @notice prevents interactions with functions having `whenNotPaused` modifier and allows interactions with ones with the `whenPaused` modifier\n @dev interactions with functions without a `whenNotPaused` or `whenPaused` modifier are unaffected\n @dev reverts if not paused"
            },
            "functionSelector": "8456cb59",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46845,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46844,
                  "name": "onlyOwner",
                  "nameLocations": ["3733:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "3733:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "3733:9:38"
              }
            ],
            "name": "pause",
            "nameLocation": "3707:5:38",
            "overrides": {
              "id": 46843,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "3724:8:38"
            },
            "parameters": {
              "id": 46842,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3712:2:38"
            },
            "returnParameters": {
              "id": 46846,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3743:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46867,
            "nodeType": "FunctionDefinition",
            "src": "3973:121:38",
            "nodes": [],
            "body": {
              "id": 46866,
              "nodeType": "Block",
              "src": "4053:41:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 46864,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46862,
                      "name": "feedModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46704,
                      "src": "4063:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46863,
                      "name": "_feedModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46855,
                      "src": "4076:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4063:24:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 46865,
                  "nodeType": "ExpressionStatement",
                  "src": "4063:24:38"
                }
              ]
            },
            "documentation": {
              "id": 46853,
              "nodeType": "StructuredDocumentation",
              "src": "3780:188:38",
              "text": " @notice updates the feedModule address\n @dev reverts if the contract is paused\n @dev reverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
            },
            "functionSelector": "0ae5ccab",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46858,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46857,
                  "name": "whenNotPaused",
                  "nameLocations": ["4029:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "4029:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "4029:13:38"
              },
              {
                "id": 46860,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46859,
                  "name": "onlyOwner",
                  "nameLocations": ["4043:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "4043:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "4043:9:38"
              }
            ],
            "name": "updateFeedModule",
            "nameLocation": "3982:16:38",
            "parameters": {
              "id": 46856,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46855,
                  "mutability": "mutable",
                  "name": "_feedModule",
                  "nameLocation": "4007:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46867,
                  "src": "3999:19:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46854,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3999:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "3998:21:38"
            },
            "returnParameters": {
              "id": 46861,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4053:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46883,
            "nodeType": "FunctionDefinition",
            "src": "4293:119:38",
            "nodes": [],
            "body": {
              "id": 46882,
              "nodeType": "Block",
              "src": "4371:41:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 46880,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46878,
                      "name": "rateModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46707,
                      "src": "4381:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IRate_$46191",
                        "typeString": "contract IRate"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46879,
                      "name": "_rateModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46871,
                      "src": "4394:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IRate_$46191",
                        "typeString": "contract IRate"
                      }
                    },
                    "src": "4381:24:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IRate_$46191",
                      "typeString": "contract IRate"
                    }
                  },
                  "id": 46881,
                  "nodeType": "ExpressionStatement",
                  "src": "4381:24:38"
                }
              ]
            },
            "documentation": {
              "id": 46868,
              "nodeType": "StructuredDocumentation",
              "src": "4100:188:38",
              "text": " @notice updates the rateModule address\n @dev reverts if the contract is paused\n @dev reverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
            },
            "functionSelector": "d707eed5",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46874,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46873,
                  "name": "whenNotPaused",
                  "nameLocations": ["4347:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "4347:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "4347:13:38"
              },
              {
                "id": 46876,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46875,
                  "name": "onlyOwner",
                  "nameLocations": ["4361:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "4361:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "4361:9:38"
              }
            ],
            "name": "updateRateModule",
            "nameLocation": "4302:16:38",
            "parameters": {
              "id": 46872,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46871,
                  "mutability": "mutable",
                  "name": "_rateModule",
                  "nameLocation": "4325:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46883,
                  "src": "4319:17:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IRate_$46191",
                    "typeString": "contract IRate"
                  },
                  "typeName": {
                    "id": 46870,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 46869,
                      "name": "IRate",
                      "nameLocations": ["4319:5:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46191,
                      "src": "4319:5:38"
                    },
                    "referencedDeclaration": 46191,
                    "src": "4319:5:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IRate_$46191",
                      "typeString": "contract IRate"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4318:19:38"
            },
            "returnParameters": {
              "id": 46877,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4371:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46898,
            "nodeType": "FunctionDefinition",
            "src": "4617:141:38",
            "nodes": [],
            "body": {
              "id": 46897,
              "nodeType": "Block",
              "src": "4707:51:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 46895,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46893,
                      "name": "stabilityModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46702,
                      "src": "4717:15:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46894,
                      "name": "_stabilityModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46886,
                      "src": "4735:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "4717:34:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 46896,
                  "nodeType": "ExpressionStatement",
                  "src": "4717:34:38"
                }
              ]
            },
            "documentation": {
              "id": 46884,
              "nodeType": "StructuredDocumentation",
              "src": "4418:194:38",
              "text": " @notice updates the address fees are sent to\n @dev reverts if the contract is paused\n @dev reverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
            },
            "functionSelector": "0408ccd6",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46889,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46888,
                  "name": "whenNotPaused",
                  "nameLocations": ["4683:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "4683:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "4683:13:38"
              },
              {
                "id": 46891,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46890,
                  "name": "onlyOwner",
                  "nameLocations": ["4697:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "4697:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "4697:9:38"
              }
            ],
            "name": "updateStabilityModule",
            "nameLocation": "4626:21:38",
            "parameters": {
              "id": 46887,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46886,
                  "mutability": "mutable",
                  "name": "_stabilityModule",
                  "nameLocation": "4656:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46898,
                  "src": "4648:24:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46885,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4648:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4647:26:38"
            },
            "returnParameters": {
              "id": 46892,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4707:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 46913,
            "nodeType": "FunctionDefinition",
            "src": "4958:125:38",
            "nodes": [],
            "body": {
              "id": 46912,
              "nodeType": "Block",
              "src": "5040:43:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 46910,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 46908,
                      "name": "debtCeiling",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46712,
                      "src": "5050:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 46909,
                      "name": "_debtCeiling",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46901,
                      "src": "5064:12:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "5050:26:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 46911,
                  "nodeType": "ExpressionStatement",
                  "src": "5050:26:38"
                }
              ]
            },
            "documentation": {
              "id": 46899,
              "nodeType": "StructuredDocumentation",
              "src": "4764:189:38",
              "text": " @notice updates the global debt ceiling\n @dev reverts if the contract is paused\n @dev reverts if msg.sender does not have the `DEFAULT_ADMIN_ROLE` role"
            },
            "functionSelector": "1218c5fd",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46904,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46903,
                  "name": "whenNotPaused",
                  "nameLocations": ["5016:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "5016:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "5016:13:38"
              },
              {
                "id": 46906,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46905,
                  "name": "onlyOwner",
                  "nameLocations": ["5030:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "5030:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "5030:9:38"
              }
            ],
            "name": "updateDebtCeiling",
            "nameLocation": "4967:17:38",
            "parameters": {
              "id": 46902,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46901,
                  "mutability": "mutable",
                  "name": "_debtCeiling",
                  "nameLocation": "4993:12:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 46913,
                  "src": "4985:20:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 46900,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4985:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4984:22:38"
            },
            "returnParameters": {
              "id": 46907,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5040:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47001,
            "nodeType": "FunctionDefinition",
            "src": "6052:1230:38",
            "nodes": [],
            "body": {
              "id": 47000,
              "nodeType": "Block",
              "src": "6133:1149:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 46928,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 46923,
                      "name": "_tokenAddress",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46916,
                      "src": "6147:13:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "id": 46926,
                          "name": "CURRENCY_TOKEN",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46700,
                          "src": "6172:14:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_Currency_$46042",
                            "typeString": "contract Currency"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_contract$_Currency_$46042",
                            "typeString": "contract Currency"
                          }
                        ],
                        "id": 46925,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "6164:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 46924,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "6164:7:38",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 46927,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6164:23:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "6147:40:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "id": 46950,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 46945,
                        "name": "_tokenAddress",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46916,
                        "src": "6417:13:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "arguments": [
                          {
                            "hexValue": "30",
                            "id": 46948,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "6442:1:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            }
                          ],
                          "id": 46947,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "6434:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 46946,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "6434:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 46949,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "6434:10:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "src": "6417:27:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "id": 46997,
                      "nodeType": "Block",
                      "src": "6721:555:38",
                      "statements": [
                        {
                          "assignments": [46973],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 46973,
                              "mutability": "mutable",
                              "name": "_tokenContract",
                              "nameLocation": "6885:14:38",
                              "nodeType": "VariableDeclaration",
                              "scope": 46997,
                              "src": "6874:25:38",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Token_$46438",
                                "typeString": "contract ERC20Token"
                              },
                              "typeName": {
                                "id": 46972,
                                "nodeType": "UserDefinedTypeName",
                                "pathNode": {
                                  "id": 46971,
                                  "name": "ERC20Token",
                                  "nameLocations": ["6874:10:38"],
                                  "nodeType": "IdentifierPath",
                                  "referencedDeclaration": 46438,
                                  "src": "6874:10:38"
                                },
                                "referencedDeclaration": 46438,
                                "src": "6874:10:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_ERC20Token_$46438",
                                  "typeString": "contract ERC20Token"
                                }
                              },
                              "visibility": "internal"
                            }
                          ],
                          "id": 46977,
                          "initialValue": {
                            "arguments": [
                              {
                                "id": 46975,
                                "name": "_tokenAddress",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46916,
                                "src": "6913:13:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "id": 46974,
                              "name": "ERC20Token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46438,
                              "src": "6902:10:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_contract$_ERC20Token_$46438_$",
                                "typeString": "type(contract ERC20Token)"
                              }
                            },
                            "id": 46976,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6902:25:38",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "6874:53:38"
                        },
                        {
                          "expression": {
                            "arguments": [
                              {
                                "id": 46981,
                                "name": "_tokenAddress",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46916,
                                "src": "7099:13:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "id": 46982,
                                "name": "_to",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46918,
                                "src": "7130:3:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 46994,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "id": 46987,
                                          "name": "this",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -28,
                                          "src": "7184:4:38",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_contract$_Vault_$48280",
                                            "typeString": "contract Vault"
                                          }
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": [
                                          {
                                            "typeIdentifier": "t_contract$_Vault_$48280",
                                            "typeString": "contract Vault"
                                          }
                                        ],
                                        "id": 46986,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": true,
                                        "lValueRequested": false,
                                        "nodeType": "ElementaryTypeNameExpression",
                                        "src": "7176:7:38",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_type$_t_address_$",
                                          "typeString": "type(address)"
                                        },
                                        "typeName": {
                                          "id": 46985,
                                          "name": "address",
                                          "nodeType": "ElementaryTypeName",
                                          "src": "7176:7:38",
                                          "typeDescriptions": {}
                                        }
                                      },
                                      "id": 46988,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "kind": "typeConversion",
                                      "lValueRequested": false,
                                      "nameLocations": [],
                                      "names": [],
                                      "nodeType": "FunctionCall",
                                      "src": "7176:13:38",
                                      "tryCall": false,
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                      }
                                    ],
                                    "expression": {
                                      "id": 46983,
                                      "name": "_tokenContract",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 46973,
                                      "src": "7151:14:38",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                                        "typeString": "contract ERC20Token"
                                      }
                                    },
                                    "id": 46984,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "memberLocation": "7166:9:38",
                                    "memberName": "balanceOf",
                                    "nodeType": "MemberAccess",
                                    "referencedDeclaration": 44502,
                                    "src": "7151:24:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                      "typeString": "function (address) view external returns (uint256)"
                                    }
                                  },
                                  "id": 46989,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "nameLocations": [],
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "7151:39:38",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "expression": {
                                    "baseExpression": {
                                      "id": 46990,
                                      "name": "collateralMapping",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 46722,
                                      "src": "7193:17:38",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                                      }
                                    },
                                    "id": 46992,
                                    "indexExpression": {
                                      "id": 46991,
                                      "name": "_tokenContract",
                                      "nodeType": "Identifier",
                                      "overloadedDeclarations": [],
                                      "referencedDeclaration": 46973,
                                      "src": "7211:14:38",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                                        "typeString": "contract ERC20Token"
                                      }
                                    },
                                    "isConstant": false,
                                    "isLValue": true,
                                    "isPure": false,
                                    "lValueRequested": false,
                                    "nodeType": "IndexAccess",
                                    "src": "7193:33:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                                      "typeString": "struct IVault.CollateralInfo storage ref"
                                    }
                                  },
                                  "id": 46993,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "7227:24:38",
                                  "memberName": "totalDepositedCollateral",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 46282,
                                  "src": "7193:58:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "7151:100:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "id": 46978,
                                "name": "SafeTransferLib",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 44996,
                                "src": "7053:15:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_SafeTransferLib_$44996_$",
                                  "typeString": "type(library SafeTransferLib)"
                                }
                              },
                              "id": 46980,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "7069:12:38",
                              "memberName": "safeTransfer",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 44947,
                              "src": "7053:28:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                                "typeString": "function (address,address,uint256)"
                              }
                            },
                            "id": 46995,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "7053:212:38",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 46996,
                          "nodeType": "ExpressionStatement",
                          "src": "7053:212:38"
                        }
                      ]
                    },
                    "id": 46998,
                    "nodeType": "IfStatement",
                    "src": "6413:863:38",
                    "trueBody": {
                      "id": 46970,
                      "nodeType": "Block",
                      "src": "6446:269:38",
                      "statements": [
                        {
                          "assignments": [46952, null],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 46952,
                              "mutability": "mutable",
                              "name": "success",
                              "nameLocation": "6596:7:38",
                              "nodeType": "VariableDeclaration",
                              "scope": 46970,
                              "src": "6591:12:38",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              },
                              "typeName": {
                                "id": 46951,
                                "name": "bool",
                                "nodeType": "ElementaryTypeName",
                                "src": "6591:4:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bool",
                                  "typeString": "bool"
                                }
                              },
                              "visibility": "internal"
                            },
                            null
                          ],
                          "id": 46963,
                          "initialValue": {
                            "arguments": [
                              {
                                "hexValue": "",
                                "id": 46961,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "6647:2:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                },
                                "value": ""
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                  "typeString": "literal_string \"\""
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470",
                                    "typeString": "literal_string \"\""
                                  }
                                ],
                                "expression": {
                                  "id": 46953,
                                  "name": "_to",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 46918,
                                  "src": "6608:3:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_address",
                                    "typeString": "address"
                                  }
                                },
                                "id": 46954,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "6612:4:38",
                                "memberName": "call",
                                "nodeType": "MemberAccess",
                                "src": "6608:8:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                                  "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                                }
                              },
                              "id": 46960,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "names": ["value"],
                              "nodeType": "FunctionCallOptions",
                              "options": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "id": 46957,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "6632:4:38",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_Vault_$48280",
                                          "typeString": "contract Vault"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_Vault_$48280",
                                          "typeString": "contract Vault"
                                        }
                                      ],
                                      "id": 46956,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "6624:7:38",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 46955,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6624:7:38",
                                        "typeDescriptions": {}
                                      }
                                    },
                                    "id": 46958,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6624:13:38",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  },
                                  "id": 46959,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "6638:7:38",
                                  "memberName": "balance",
                                  "nodeType": "MemberAccess",
                                  "src": "6624:21:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "src": "6608:38:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_barecall_payable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$value",
                                "typeString": "function (bytes memory) payable returns (bool,bytes memory)"
                              }
                            },
                            "id": 46962,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6608:42:38",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                              "typeString": "tuple(bool,bytes memory)"
                            }
                          },
                          "nodeType": "VariableDeclarationStatement",
                          "src": "6590:60:38"
                        },
                        {
                          "condition": {
                            "id": 46965,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "UnaryOperation",
                            "operator": "!",
                            "prefix": true,
                            "src": "6668:8:38",
                            "subExpression": {
                              "id": 46964,
                              "name": "success",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46952,
                              "src": "6669:7:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bool",
                                "typeString": "bool"
                              }
                            },
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 46969,
                          "nodeType": "IfStatement",
                          "src": "6664:40:38",
                          "trueBody": {
                            "errorCall": {
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "id": 46966,
                                "name": "EthTransferFailed",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46217,
                                "src": "6685:17:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_error_pure$__$returns$__$",
                                  "typeString": "function () pure"
                                }
                              },
                              "id": 46967,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "nameLocations": [],
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6685:19:38",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$__$",
                                "typeString": "tuple()"
                              }
                            },
                            "id": 46968,
                            "nodeType": "RevertStatement",
                            "src": "6678:26:38"
                          }
                        }
                      ]
                    }
                  },
                  "id": 46999,
                  "nodeType": "IfStatement",
                  "src": "6143:1133:38",
                  "trueBody": {
                    "id": 46944,
                    "nodeType": "Block",
                    "src": "6189:218:38",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 46932,
                              "name": "_to",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46918,
                              "src": "6340:3:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 46941,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "id": 46937,
                                        "name": "this",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": -28,
                                        "src": "6378:4:38",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_contract$_Vault_$48280",
                                          "typeString": "contract Vault"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_contract$_Vault_$48280",
                                          "typeString": "contract Vault"
                                        }
                                      ],
                                      "id": 46936,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "lValueRequested": false,
                                      "nodeType": "ElementaryTypeNameExpression",
                                      "src": "6370:7:38",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_type$_t_address_$",
                                        "typeString": "type(address)"
                                      },
                                      "typeName": {
                                        "id": 46935,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "6370:7:38",
                                        "typeDescriptions": {}
                                      }
                                    },
                                    "id": 46938,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "typeConversion",
                                    "lValueRequested": false,
                                    "nameLocations": [],
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6370:13:38",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_address",
                                      "typeString": "address"
                                    }
                                  ],
                                  "expression": {
                                    "id": 46933,
                                    "name": "CURRENCY_TOKEN",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 46700,
                                    "src": "6345:14:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_contract$_Currency_$46042",
                                      "typeString": "contract Currency"
                                    }
                                  },
                                  "id": 46934,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "6360:9:38",
                                  "memberName": "balanceOf",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 44502,
                                  "src": "6345:24:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                                    "typeString": "function (address) view external returns (uint256)"
                                  }
                                },
                                "id": 46939,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "nameLocations": [],
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6345:39:38",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "id": 46940,
                                "name": "paidFees",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46716,
                                "src": "6387:8:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "6345:50:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "id": 46929,
                              "name": "CURRENCY_TOKEN",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46700,
                              "src": "6316:14:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Currency_$46042",
                                "typeString": "contract Currency"
                              }
                            },
                            "id": 46931,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "6331:8:38",
                            "memberName": "transfer",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 44556,
                            "src": "6316:23:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 46942,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6316:80:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 46943,
                        "nodeType": "ExpressionStatement",
                        "src": "6316:80:38"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 46914,
              "nodeType": "StructuredDocumentation",
              "src": "5089:958:38",
              "text": " @notice Used to recover `all` tokens and eth `possible` without affecting collateral reserves or unwithdrawn interest\n @param _tokenAddress address of token to recover. if it is eth, address(0) is expected\n @param _to address to send the recovered tokens to\n @dev if `_tokenAddress` is address(0), send all eth in this contract to `_to`\n      else if `_tokenAddress` is this vaults `CURRENCY_TOKEN`, send balance of this address of that token minus the paidFees (i.e unwithdrawn paid fees)\n      else (this means this token can/might be a collateral), send the balance of this address of that token minus the `totalDepositedCollateral` of it as a collateral\n @dev reverts if `_tokenAddress` is address(0) i.e eth, and `_to` is a contract that has no non reverting way to accept eth\n      reverts if `_tokenAddress` is not `CURRENCY_TOKEN` and not `address(0) but is a contract"
            },
            "functionSelector": "feaea586",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 46921,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 46920,
                  "name": "whenNotPaused",
                  "nameLocations": ["6119:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "6119:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "6119:13:38"
              }
            ],
            "name": "recoverToken",
            "nameLocation": "6061:12:38",
            "parameters": {
              "id": 46919,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 46916,
                  "mutability": "mutable",
                  "name": "_tokenAddress",
                  "nameLocation": "6082:13:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47001,
                  "src": "6074:21:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46915,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6074:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 46918,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "6105:3:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47001,
                  "src": "6097:11:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 46917,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6097:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "6073:36:38"
            },
            "returnParameters": {
              "id": 46922,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6133:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47097,
            "nodeType": "FunctionDefinition",
            "src": "8441:966:38",
            "nodes": [],
            "body": {
              "id": 47096,
              "nodeType": "Block",
              "src": "8719:688:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47024],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47024,
                      "mutability": "mutable",
                      "name": "_collateral",
                      "nameLocation": "8752:11:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47096,
                      "src": "8729:34:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                        "typeString": "struct IVault.CollateralInfo"
                      },
                      "typeName": {
                        "id": 47023,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47022,
                          "name": "CollateralInfo",
                          "nameLocations": ["8729:14:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46300,
                          "src": "8729:14:38"
                        },
                        "referencedDeclaration": 46300,
                        "src": "8729:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47028,
                  "initialValue": {
                    "baseExpression": {
                      "id": 47025,
                      "name": "collateralMapping",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46722,
                      "src": "8766:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                      }
                    },
                    "id": 47027,
                    "indexExpression": {
                      "id": 47026,
                      "name": "_collateralToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47005,
                      "src": "8784:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                        "typeString": "contract ERC20Token"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "8766:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                      "typeString": "struct IVault.CollateralInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "8729:72:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47033,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "expression": {
                          "id": 47029,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47024,
                          "src": "8815:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        "id": 47030,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "8827:8:38",
                        "memberName": "rateInfo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46291,
                        "src": "8815:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 47031,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "8836:4:38",
                      "memberName": "rate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46275,
                      "src": "8815:25:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 47032,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8844:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "8815:30:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47037,
                  "nodeType": "IfStatement",
                  "src": "8811:68:38",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 47034,
                        "name": "CollateralAlreadyExists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46207,
                        "src": "8854:23:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 47035,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "8854:25:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 47036,
                    "nodeType": "RevertStatement",
                    "src": "8847:32:38"
                  }
                },
                {
                  "expression": {
                    "id": 47044,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "expression": {
                          "id": 47038,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47024,
                          "src": "8890:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        "id": 47041,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "8902:8:38",
                        "memberName": "rateInfo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46291,
                        "src": "8890:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 47042,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "8911:4:38",
                      "memberName": "rate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46275,
                      "src": "8890:25:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47043,
                      "name": "_rate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47007,
                      "src": "8918:5:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8890:33:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47045,
                  "nodeType": "ExpressionStatement",
                  "src": "8890:33:38"
                },
                {
                  "expression": {
                    "id": 47053,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "expression": {
                          "id": 47046,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47024,
                          "src": "8933:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        "id": 47049,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "8945:8:38",
                        "memberName": "rateInfo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46291,
                        "src": "8933:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 47050,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "8954:14:38",
                      "memberName": "lastUpdateTime",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46279,
                      "src": "8933:35:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 47051,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "8971:5:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 47052,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "8977:9:38",
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "src": "8971:15:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8933:53:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47054,
                  "nodeType": "ExpressionStatement",
                  "src": "8933:53:38"
                },
                {
                  "expression": {
                    "id": 47059,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47055,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47024,
                        "src": "8996:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47057,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "9008:20:38",
                      "memberName": "liquidationThreshold",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46286,
                      "src": "8996:32:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47058,
                      "name": "_liquidationThreshold",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47009,
                      "src": "9031:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "8996:56:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47060,
                  "nodeType": "ExpressionStatement",
                  "src": "8996:56:38"
                },
                {
                  "expression": {
                    "id": 47065,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47061,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47024,
                        "src": "9062:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47063,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "9074:16:38",
                      "memberName": "liquidationBonus",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46288,
                      "src": "9062:28:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47064,
                      "name": "_liquidationBonus",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47011,
                      "src": "9093:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9062:48:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47066,
                  "nodeType": "ExpressionStatement",
                  "src": "9062:48:38"
                },
                {
                  "expression": {
                    "id": 47071,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47067,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47024,
                        "src": "9120:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47069,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "9132:11:38",
                      "memberName": "debtCeiling",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46295,
                      "src": "9120:23:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47070,
                      "name": "_debtCeiling",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47013,
                      "src": "9146:12:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9120:38:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47072,
                  "nodeType": "ExpressionStatement",
                  "src": "9120:38:38"
                },
                {
                  "expression": {
                    "id": 47077,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47073,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47024,
                        "src": "9168:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47075,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "9180:26:38",
                      "memberName": "collateralFloorPerPosition",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46297,
                      "src": "9168:38:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47076,
                      "name": "_collateralFloorPerPosition",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47015,
                      "src": "9209:27:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9168:68:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47078,
                  "nodeType": "ExpressionStatement",
                  "src": "9168:68:38"
                },
                {
                  "expression": {
                    "id": 47087,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47079,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47024,
                        "src": "9246:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47081,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "9258:29:38",
                      "memberName": "additionalCollateralPrecision",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46299,
                      "src": "9246:41:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 47086,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 47082,
                        "name": "MAX_TOKEN_DECIMALS",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46678,
                        "src": "9290:18:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "-",
                      "rightExpression": {
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "expression": {
                            "id": 47083,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47005,
                            "src": "9311:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          },
                          "id": 47084,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "9328:8:38",
                          "memberName": "decimals",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 46368,
                          "src": "9311:25:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_view$__$returns$_t_uint8_$",
                            "typeString": "function () view external returns (uint8)"
                          }
                        },
                        "id": 47085,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "9311:27:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "9290:48:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "9246:92:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47088,
                  "nodeType": "ExpressionStatement",
                  "src": "9246:92:38"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 47092,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47005,
                            "src": "9382:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          ],
                          "id": 47091,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "9374:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 47090,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "9374:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 47093,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "9374:25:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 47089,
                      "name": "CollateralTypeAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46231,
                      "src": "9354:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 47094,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9354:46:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47095,
                  "nodeType": "EmitStatement",
                  "src": "9349:51:38"
                }
              ]
            },
            "documentation": {
              "id": 47002,
              "nodeType": "StructuredDocumentation",
              "src": "7288:1148:38",
              "text": " @notice Creates a collateral type that'll be accepted by the system\n @param _collateralToken contract address of the token to add\n @param _rate value to set as the collateral rate (per second) for the collateral, should be denominated in 1e18 where 1e18 is 100%\n @param _liquidationThreshold value to set as the liquidation threshold of the collateral, should be denominated in 1e18 where 1e18 is 100%\n @param _liquidationBonus value to set as the liquidation bonus of the collateral, used to incentivize liquidators, should be denominated in 1e18 where 1e18 is 100%\n @param _debtCeiling value to set as the debt ceiling of the collateral, used to limit risk by capping borrowable amount of currency backed by the given collateral\n @param _collateralFloorPerPosition value to set as the minimum amount of this collateral that can be borrowed against\n @dev should revert if contract is paused\n      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role\n      should revert if the collateral already exists, i.e if _collateral.rateInfo.rate == 0"
            },
            "functionSelector": "645ba425",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47018,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47017,
                  "name": "whenNotPaused",
                  "nameLocations": ["8695:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "8695:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "8695:13:38"
              },
              {
                "id": 47020,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47019,
                  "name": "onlyOwner",
                  "nameLocations": ["8709:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "8709:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "8709:9:38"
              }
            ],
            "name": "createCollateralType",
            "nameLocation": "8450:20:38",
            "parameters": {
              "id": 47016,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47005,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "8491:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47097,
                  "src": "8480:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47004,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47003,
                      "name": "ERC20Token",
                      "nameLocations": ["8480:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "8480:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "8480:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47007,
                  "mutability": "mutable",
                  "name": "_rate",
                  "nameLocation": "8525:5:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47097,
                  "src": "8517:13:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47006,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8517:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47009,
                  "mutability": "mutable",
                  "name": "_liquidationThreshold",
                  "nameLocation": "8548:21:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47097,
                  "src": "8540:29:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47008,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8540:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47011,
                  "mutability": "mutable",
                  "name": "_liquidationBonus",
                  "nameLocation": "8587:17:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47097,
                  "src": "8579:25:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47010,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8579:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47013,
                  "mutability": "mutable",
                  "name": "_debtCeiling",
                  "nameLocation": "8622:12:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47097,
                  "src": "8614:20:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47012,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8614:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47015,
                  "mutability": "mutable",
                  "name": "_collateralFloorPerPosition",
                  "nameLocation": "8652:27:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47097,
                  "src": "8644:35:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47014,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "8644:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8470:215:38"
            },
            "returnParameters": {
              "id": 47021,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8719:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47202,
            "nodeType": "FunctionDefinition",
            "src": "10035:1528:38",
            "nodes": [],
            "body": {
              "id": 47201,
              "nodeType": "Block",
              "src": "10242:1321:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47118],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47118,
                      "mutability": "mutable",
                      "name": "_collateral",
                      "nameLocation": "10275:11:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47201,
                      "src": "10252:34:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                        "typeString": "struct IVault.CollateralInfo"
                      },
                      "typeName": {
                        "id": 47117,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47116,
                          "name": "CollateralInfo",
                          "nameLocations": ["10252:14:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46300,
                          "src": "10252:14:38"
                        },
                        "referencedDeclaration": 46300,
                        "src": "10252:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47122,
                  "initialValue": {
                    "baseExpression": {
                      "id": 47119,
                      "name": "collateralMapping",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46722,
                      "src": "10289:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                      }
                    },
                    "id": 47121,
                    "indexExpression": {
                      "id": 47120,
                      "name": "_collateralToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47101,
                      "src": "10307:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                        "typeString": "contract ERC20Token"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "10289:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                      "typeString": "struct IVault.CollateralInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10252:72:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                      "typeString": "enum IVault.ModifiableParameters"
                    },
                    "id": 47126,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47123,
                      "name": "_param",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47104,
                      "src": "10339:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                        "typeString": "enum IVault.ModifiableParameters"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "expression": {
                        "id": 47124,
                        "name": "ModifiableParameters",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46315,
                        "src": "10349:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_enum$_ModifiableParameters_$46315_$",
                          "typeString": "type(enum IVault.ModifiableParameters)"
                        }
                      },
                      "id": 47125,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberLocation": "10370:4:38",
                      "memberName": "RATE",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46310,
                      "src": "10349:25:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                        "typeString": "enum IVault.ModifiableParameters"
                      }
                    },
                    "src": "10339:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                        "typeString": "enum IVault.ModifiableParameters"
                      },
                      "id": 47160,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 47157,
                        "name": "_param",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47104,
                        "src": "11048:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                          "typeString": "enum IVault.ModifiableParameters"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "expression": {
                          "id": 47158,
                          "name": "ModifiableParameters",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46315,
                          "src": "11058:20:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_ModifiableParameters_$46315_$",
                            "typeString": "type(enum IVault.ModifiableParameters)"
                          }
                        },
                        "id": 47159,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberLocation": "11079:12:38",
                        "memberName": "DEBT_CEILING",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46311,
                        "src": "11058:33:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                          "typeString": "enum IVault.ModifiableParameters"
                        }
                      },
                      "src": "11048:43:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "condition": {
                        "commonType": {
                          "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                          "typeString": "enum IVault.ModifiableParameters"
                        },
                        "id": 47171,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 47168,
                          "name": "_param",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47104,
                          "src": "11159:6:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                            "typeString": "enum IVault.ModifiableParameters"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "id": 47169,
                            "name": "ModifiableParameters",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46315,
                            "src": "11169:20:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_enum$_ModifiableParameters_$46315_$",
                              "typeString": "type(enum IVault.ModifiableParameters)"
                            }
                          },
                          "id": 47170,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberLocation": "11190:29:38",
                          "memberName": "COLLATERAL_FLOOR_PER_POSITION",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 46312,
                          "src": "11169:50:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                            "typeString": "enum IVault.ModifiableParameters"
                          }
                        },
                        "src": "11159:60:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "falseBody": {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                            "typeString": "enum IVault.ModifiableParameters"
                          },
                          "id": 47182,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 47179,
                            "name": "_param",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47104,
                            "src": "11302:6:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                              "typeString": "enum IVault.ModifiableParameters"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "expression": {
                              "id": 47180,
                              "name": "ModifiableParameters",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46315,
                              "src": "11312:20:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_enum$_ModifiableParameters_$46315_$",
                                "typeString": "type(enum IVault.ModifiableParameters)"
                              }
                            },
                            "id": 47181,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberLocation": "11333:17:38",
                            "memberName": "LIQUIDATION_BONUS",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46313,
                            "src": "11312:38:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                              "typeString": "enum IVault.ModifiableParameters"
                            }
                          },
                          "src": "11302:48:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "id": 47196,
                          "nodeType": "Block",
                          "src": "11419:138:38",
                          "statements": [
                            {
                              "expression": {
                                "id": 47194,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "expression": {
                                    "id": 47190,
                                    "name": "_collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 47118,
                                    "src": "11506:11:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                      "typeString": "struct IVault.CollateralInfo storage pointer"
                                    }
                                  },
                                  "id": 47192,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberLocation": "11518:20:38",
                                  "memberName": "liquidationThreshold",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 46286,
                                  "src": "11506:32:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "id": 47193,
                                  "name": "_data",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 47106,
                                  "src": "11541:5:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "11506:40:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 47195,
                              "nodeType": "ExpressionStatement",
                              "src": "11506:40:38"
                            }
                          ]
                        },
                        "id": 47197,
                        "nodeType": "IfStatement",
                        "src": "11298:259:38",
                        "trueBody": {
                          "id": 47189,
                          "nodeType": "Block",
                          "src": "11352:61:38",
                          "statements": [
                            {
                              "expression": {
                                "id": 47187,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftHandSide": {
                                  "expression": {
                                    "id": 47183,
                                    "name": "_collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 47118,
                                    "src": "11366:11:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                      "typeString": "struct IVault.CollateralInfo storage pointer"
                                    }
                                  },
                                  "id": 47185,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": true,
                                  "memberLocation": "11378:16:38",
                                  "memberName": "liquidationBonus",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 46288,
                                  "src": "11366:28:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "Assignment",
                                "operator": "=",
                                "rightHandSide": {
                                  "id": 47186,
                                  "name": "_data",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 47106,
                                  "src": "11397:5:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "11366:36:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 47188,
                              "nodeType": "ExpressionStatement",
                              "src": "11366:36:38"
                            }
                          ]
                        }
                      },
                      "id": 47198,
                      "nodeType": "IfStatement",
                      "src": "11155:402:38",
                      "trueBody": {
                        "id": 47178,
                        "nodeType": "Block",
                        "src": "11221:71:38",
                        "statements": [
                          {
                            "expression": {
                              "id": 47176,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftHandSide": {
                                "expression": {
                                  "id": 47172,
                                  "name": "_collateral",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 47118,
                                  "src": "11235:11:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                    "typeString": "struct IVault.CollateralInfo storage pointer"
                                  }
                                },
                                "id": 47174,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": true,
                                "memberLocation": "11247:26:38",
                                "memberName": "collateralFloorPerPosition",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 46297,
                                "src": "11235:38:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "Assignment",
                              "operator": "=",
                              "rightHandSide": {
                                "id": 47175,
                                "name": "_data",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47106,
                                "src": "11276:5:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "11235:46:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 47177,
                            "nodeType": "ExpressionStatement",
                            "src": "11235:46:38"
                          }
                        ]
                      }
                    },
                    "id": 47199,
                    "nodeType": "IfStatement",
                    "src": "11044:513:38",
                    "trueBody": {
                      "id": 47167,
                      "nodeType": "Block",
                      "src": "11093:56:38",
                      "statements": [
                        {
                          "expression": {
                            "id": 47165,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftHandSide": {
                              "expression": {
                                "id": 47161,
                                "name": "_collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47118,
                                "src": "11107:11:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                  "typeString": "struct IVault.CollateralInfo storage pointer"
                                }
                              },
                              "id": 47163,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": true,
                              "memberLocation": "11119:11:38",
                              "memberName": "debtCeiling",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46295,
                              "src": "11107:23:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "Assignment",
                            "operator": "=",
                            "rightHandSide": {
                              "id": 47164,
                              "name": "_data",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47106,
                              "src": "11133:5:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "11107:31:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "id": 47166,
                          "nodeType": "ExpressionStatement",
                          "src": "11107:31:38"
                        }
                      ]
                    }
                  },
                  "id": 47200,
                  "nodeType": "IfStatement",
                  "src": "10335:1222:38",
                  "trueBody": {
                    "id": 47156,
                    "nodeType": "Block",
                    "src": "10376:662:38",
                    "statements": [
                      {
                        "documentation": " @dev updates the last stored accumulated rate by adding accumulated rate (since _collateral.rateInfo.lastUpdateTime) to it before updating the rate, this way borrowers are charged the previous rate up until block.timestamp before being charged the new rate.\n @dev updates the last update time too for correct future updates to accumulate past rates correctly",
                        "expression": {
                          "id": 47137,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "expression": {
                                "id": 47127,
                                "name": "_collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47118,
                                "src": "10810:11:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                  "typeString": "struct IVault.CollateralInfo storage pointer"
                                }
                              },
                              "id": 47130,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "10822:8:38",
                              "memberName": "rateInfo",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46291,
                              "src": "10810:20:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                "typeString": "struct IVault.RateInfo storage ref"
                              }
                            },
                            "id": 47131,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "10831:15:38",
                            "memberName": "accumulatedRate",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46277,
                            "src": "10810:36:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 47134,
                                  "name": "_collateral",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 47118,
                                  "src": "10892:11:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                    "typeString": "struct IVault.CollateralInfo storage pointer"
                                  }
                                },
                                "id": 47135,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "10904:8:38",
                                "memberName": "rateInfo",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 46291,
                                "src": "10892:20:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                  "typeString": "struct IVault.RateInfo storage ref"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                  "typeString": "struct IVault.RateInfo storage ref"
                                }
                              ],
                              "expression": {
                                "id": 47132,
                                "name": "rateModule",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46707,
                                "src": "10849:10:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IRate_$46191",
                                  "typeString": "contract IRate"
                                }
                              },
                              "id": 47133,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "10860:31:38",
                              "memberName": "calculateCurrentAccumulatedRate",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46190,
                              "src": "10849:42:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_struct$_RateInfo_$46280_memory_ptr_$returns$_t_uint256_$",
                                "typeString": "function (struct IVault.RateInfo memory) view external returns (uint256)"
                              }
                            },
                            "id": 47136,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "10849:64:38",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10810:103:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47138,
                        "nodeType": "ExpressionStatement",
                        "src": "10810:103:38"
                      },
                      {
                        "expression": {
                          "id": 47146,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "expression": {
                                "id": 47139,
                                "name": "_collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47118,
                                "src": "10927:11:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                  "typeString": "struct IVault.CollateralInfo storage pointer"
                                }
                              },
                              "id": 47142,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "10939:8:38",
                              "memberName": "rateInfo",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46291,
                              "src": "10927:20:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                "typeString": "struct IVault.RateInfo storage ref"
                              }
                            },
                            "id": 47143,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "10948:14:38",
                            "memberName": "lastUpdateTime",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46279,
                            "src": "10927:35:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "expression": {
                              "id": 47144,
                              "name": "block",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -4,
                              "src": "10965:5:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_block",
                                "typeString": "block"
                              }
                            },
                            "id": 47145,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "10971:9:38",
                            "memberName": "timestamp",
                            "nodeType": "MemberAccess",
                            "src": "10965:15:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10927:53:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47147,
                        "nodeType": "ExpressionStatement",
                        "src": "10927:53:38"
                      },
                      {
                        "expression": {
                          "id": 47154,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "expression": {
                                "id": 47148,
                                "name": "_collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47118,
                                "src": "10994:11:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                  "typeString": "struct IVault.CollateralInfo storage pointer"
                                }
                              },
                              "id": 47151,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "11006:8:38",
                              "memberName": "rateInfo",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46291,
                              "src": "10994:20:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                "typeString": "struct IVault.RateInfo storage ref"
                              }
                            },
                            "id": 47152,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "11015:4:38",
                            "memberName": "rate",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46275,
                            "src": "10994:25:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "id": 47153,
                            "name": "_data",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47106,
                            "src": "11022:5:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "10994:33:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47155,
                        "nodeType": "ExpressionStatement",
                        "src": "10994:33:38"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 47098,
              "nodeType": "StructuredDocumentation",
              "src": "9413:617:38",
              "text": " @notice updates `manually updateable` parameters of an existing collateral\n @param _collateralToken contract address of the token to modify it's parameters\n @param _param contract address of the token to modify it's parameters\n @dev updates the value of the chosen parameter with `_data`\n @dev should revert if the contract is paused\n      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role\n      should revert if the collateral does not exist\n      should revert if `_param` is not a variant of ModifiableParameters enum"
            },
            "functionSelector": "57b35a78",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47109,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47108,
                  "name": "whenNotPaused",
                  "nameLocations": ["10163:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "10163:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "10163:13:38"
              },
              {
                "id": 47111,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47110,
                  "name": "onlyOwner",
                  "nameLocations": ["10185:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "10185:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "10185:9:38"
              },
              {
                "arguments": [
                  {
                    "id": 47113,
                    "name": "_collateralToken",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47101,
                    "src": "10220:16:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47114,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47112,
                  "name": "collateralExists",
                  "nameLocations": ["10203:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "10203:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "10203:34:38"
              }
            ],
            "name": "updateCollateralData",
            "nameLocation": "10044:20:38",
            "parameters": {
              "id": 47107,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47101,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "10076:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47202,
                  "src": "10065:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47100,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47099,
                      "name": "ERC20Token",
                      "nameLocations": ["10065:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "10065:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "10065:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47104,
                  "mutability": "mutable",
                  "name": "_param",
                  "nameLocation": "10115:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47202,
                  "src": "10094:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                    "typeString": "enum IVault.ModifiableParameters"
                  },
                  "typeName": {
                    "id": 47103,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47102,
                      "name": "ModifiableParameters",
                      "nameLocations": ["10094:20:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46315,
                      "src": "10094:20:38"
                    },
                    "referencedDeclaration": 46315,
                    "src": "10094:20:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_ModifiableParameters_$46315",
                      "typeString": "enum IVault.ModifiableParameters"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47106,
                  "mutability": "mutable",
                  "name": "_data",
                  "nameLocation": "10131:5:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47202,
                  "src": "10123:13:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47105,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10123:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "10064:73:38"
            },
            "returnParameters": {
              "id": 47115,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10242:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47232,
            "nodeType": "FunctionDefinition",
            "src": "12002:289:38",
            "nodes": [],
            "body": {
              "id": 47231,
              "nodeType": "Block",
              "src": "12158:133:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 47219,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 47216,
                        "name": "msg",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -15,
                        "src": "12172:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_message",
                          "typeString": "msg"
                        }
                      },
                      "id": 47217,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "12176:6:38",
                      "memberName": "sender",
                      "nodeType": "MemberAccess",
                      "src": "12172:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "id": 47218,
                      "name": "feedModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46704,
                      "src": "12186:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "12172:24:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47223,
                  "nodeType": "IfStatement",
                  "src": "12168:54:38",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 47220,
                        "name": "NotFeedContract",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46227,
                        "src": "12205:15:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 47221,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "12205:17:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 47222,
                    "nodeType": "RevertStatement",
                    "src": "12198:24:38"
                  }
                },
                {
                  "expression": {
                    "id": 47229,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 47224,
                          "name": "collateralMapping",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46722,
                          "src": "12232:17:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                            "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                          }
                        },
                        "id": 47226,
                        "indexExpression": {
                          "id": 47225,
                          "name": "_collateralAddress",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47206,
                          "src": "12250:18:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Token_$46438",
                            "typeString": "contract ERC20Token"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "12232:37:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                          "typeString": "struct IVault.CollateralInfo storage ref"
                        }
                      },
                      "id": 47227,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "12270:5:38",
                      "memberName": "price",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46293,
                      "src": "12232:43:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47228,
                      "name": "_price",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47208,
                      "src": "12278:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "12232:52:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47230,
                  "nodeType": "ExpressionStatement",
                  "src": "12232:52:38"
                }
              ]
            },
            "documentation": {
              "id": 47203,
              "nodeType": "StructuredDocumentation",
              "src": "11569:428:38",
              "text": " @notice feed contract calls this to update the price with the oracle value\n @param _collateralAddress contract address of the collateral token to update it's price\n @param _price new price\n @dev should revert if the contract is paused\n      should revert if the caller does not have the `FEED_CONTRACT_ROLE` role\n      should revert if the collateral does not exist"
            },
            "functionSelector": "457972de",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47211,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47210,
                  "name": "whenNotPaused",
                  "nameLocations": ["12095:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "12095:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "12095:13:38"
              },
              {
                "arguments": [
                  {
                    "id": 47213,
                    "name": "_collateralAddress",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47206,
                    "src": "12134:18:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47214,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47212,
                  "name": "collateralExists",
                  "nameLocations": ["12117:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "12117:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "12117:36:38"
              }
            ],
            "name": "updatePrice",
            "nameLocation": "12011:11:38",
            "parameters": {
              "id": 47209,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47206,
                  "mutability": "mutable",
                  "name": "_collateralAddress",
                  "nameLocation": "12034:18:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47232,
                  "src": "12023:29:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47205,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47204,
                      "name": "ERC20Token",
                      "nameLocations": ["12023:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "12023:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "12023:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47208,
                  "mutability": "mutable",
                  "name": "_price",
                  "nameLocation": "12062:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47232,
                  "src": "12054:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47207,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12054:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "12022:47:38"
            },
            "returnParameters": {
              "id": 47215,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12158:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47265,
            "nodeType": "FunctionDefinition",
            "src": "13001:274:38",
            "nodes": [],
            "body": {
              "id": 47264,
              "nodeType": "Block",
              "src": "13077:198:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 47249,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47242,
                        "name": "baseRateInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46710,
                        "src": "13087:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 47244,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "13100:15:38",
                      "memberName": "accumulatedRate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46277,
                      "src": "13087:28:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "arguments": [
                        {
                          "id": 47247,
                          "name": "baseRateInfo",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46710,
                          "src": "13161:12:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                            "typeString": "struct IVault.RateInfo storage ref"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                            "typeString": "struct IVault.RateInfo storage ref"
                          }
                        ],
                        "expression": {
                          "id": 47245,
                          "name": "rateModule",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46707,
                          "src": "13118:10:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IRate_$46191",
                            "typeString": "contract IRate"
                          }
                        },
                        "id": 47246,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "13129:31:38",
                        "memberName": "calculateCurrentAccumulatedRate",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46190,
                        "src": "13118:42:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_struct$_RateInfo_$46280_memory_ptr_$returns$_t_uint256_$",
                          "typeString": "function (struct IVault.RateInfo memory) view external returns (uint256)"
                        }
                      },
                      "id": 47248,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13118:56:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "13087:87:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47250,
                  "nodeType": "ExpressionStatement",
                  "src": "13087:87:38"
                },
                {
                  "expression": {
                    "id": 47256,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47251,
                        "name": "baseRateInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46710,
                        "src": "13184:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 47253,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "13197:14:38",
                      "memberName": "lastUpdateTime",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46279,
                      "src": "13184:27:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "expression": {
                        "id": 47254,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "13214:5:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 47255,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "13220:9:38",
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "src": "13214:15:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "13184:45:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47257,
                  "nodeType": "ExpressionStatement",
                  "src": "13184:45:38"
                },
                {
                  "expression": {
                    "id": 47262,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47258,
                        "name": "baseRateInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46710,
                        "src": "13239:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      "id": 47260,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "13252:4:38",
                      "memberName": "rate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46275,
                      "src": "13239:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 47261,
                      "name": "_baseRate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47235,
                      "src": "13259:9:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "13239:29:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47263,
                  "nodeType": "ExpressionStatement",
                  "src": "13239:29:38"
                }
              ]
            },
            "documentation": {
              "id": 47233,
              "nodeType": "StructuredDocumentation",
              "src": "12297:699:38",
              "text": " @notice updates the base rate charged for borrowing this currency\n @param _baseRate new base rate (per second), should be denominated in 1e18 where 1e18 is 100%\n @dev updates the last stored accumulated rate by adding accumulated rate (since baseRateInfo.lastUpdateTime) to it before updating the rate, this way borrowers are charged the previous rate up until block.timestamp before being charged the new rate.\n @dev updates the last update time too for correct future updates to accumulate past rates correctly\n @dev should revert if the contract is paused\n      should revert if the caller does not have the `DEFAULT_ADMIN_ROLE` role"
            },
            "functionSelector": "330283aa",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47238,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47237,
                  "name": "whenNotPaused",
                  "nameLocations": ["13053:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "13053:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "13053:13:38"
              },
              {
                "id": 47240,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47239,
                  "name": "onlyOwner",
                  "nameLocations": ["13067:9:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 44380,
                  "src": "13067:9:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "13067:9:38"
              }
            ],
            "name": "updateBaseRate",
            "nameLocation": "13010:14:38",
            "parameters": {
              "id": 47236,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47235,
                  "mutability": "mutable",
                  "name": "_baseRate",
                  "nameLocation": "13033:9:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47265,
                  "src": "13025:17:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47234,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13025:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "13024:19:38"
            },
            "returnParameters": {
              "id": 47241,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13077:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47301,
            "nodeType": "FunctionDefinition",
            "src": "13628:307:38",
            "nodes": [],
            "body": {
              "id": 47300,
              "nodeType": "Block",
              "src": "13675:260:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47272],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47272,
                      "mutability": "mutable",
                      "name": "_stabilityModule",
                      "nameLocation": "13693:16:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47300,
                      "src": "13685:24:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 47271,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "13685:7:38",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47274,
                  "initialValue": {
                    "id": 47273,
                    "name": "stabilityModule",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 46702,
                    "src": "13712:15:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13685:42:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 47280,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47275,
                      "name": "_stabilityModule",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47272,
                      "src": "13741:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 47278,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "13769:1:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 47277,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "13761:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 47276,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "13761:7:38",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 47279,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13761:10:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "13741:30:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47284,
                  "nodeType": "IfStatement",
                  "src": "13737:67:38",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 47281,
                        "name": "InvalidStabilityModule",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46225,
                        "src": "13780:22:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 47282,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13780:24:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 47283,
                    "nodeType": "RevertStatement",
                    "src": "13773:31:38"
                  }
                },
                {
                  "assignments": [47286],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47286,
                      "mutability": "mutable",
                      "name": "_paidFees",
                      "nameLocation": "13823:9:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47300,
                      "src": "13815:17:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47285,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "13815:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47288,
                  "initialValue": {
                    "id": 47287,
                    "name": "paidFees",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 46716,
                    "src": "13835:8:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "13815:28:38"
                },
                {
                  "expression": {
                    "id": 47291,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 47289,
                      "name": "paidFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46716,
                      "src": "13853:8:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "30",
                      "id": 47290,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "13864:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "13853:12:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47292,
                  "nodeType": "ExpressionStatement",
                  "src": "13853:12:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47296,
                        "name": "_stabilityModule",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47272,
                        "src": "13900:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47297,
                        "name": "_paidFees",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47286,
                        "src": "13918:9:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 47293,
                        "name": "CURRENCY_TOKEN",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46700,
                        "src": "13876:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Currency_$46042",
                          "typeString": "contract Currency"
                        }
                      },
                      "id": 47295,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "13891:8:38",
                      "memberName": "transfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 44556,
                      "src": "13876:23:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 47298,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13876:52:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47299,
                  "nodeType": "ExpressionStatement",
                  "src": "13876:52:38"
                }
              ]
            },
            "documentation": {
              "id": 47266,
              "nodeType": "StructuredDocumentation",
              "src": "13281:342:38",
              "text": " @notice allows the stability module to withdraw all fees that have been paid on borrowed currency\n @dev updates the paidFees for the collateral and globally then transfers the token to the caller\n @dev should revert if the contract is paused\n @dev should revert if the stabilityModule is address(0)"
            },
            "functionSelector": "476343ee",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47269,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47268,
                  "name": "whenNotPaused",
                  "nameLocations": ["13661:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "13661:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "13661:13:38"
              }
            ],
            "name": "withdrawFees",
            "nameLocation": "13637:12:38",
            "parameters": {
              "id": 47267,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13649:2:38"
            },
            "returnParameters": {
              "id": 47270,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "13675:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47319,
            "nodeType": "FunctionDefinition",
            "src": "14184:114:38",
            "nodes": [],
            "body": {
              "id": 47318,
              "nodeType": "Block",
              "src": "14240:58:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 47316,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "baseExpression": {
                          "id": 47309,
                          "name": "relyMapping",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46736,
                          "src": "14250:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(address => mapping(address => bool))"
                          }
                        },
                        "id": 47313,
                        "indexExpression": {
                          "expression": {
                            "id": 47310,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "14262:3:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 47311,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "14266:6:38",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "14262:10:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "14250:23:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 47314,
                      "indexExpression": {
                        "id": 47312,
                        "name": "_relyUpon",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47304,
                        "src": "14274:9:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "14250:34:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "74727565",
                      "id": 47315,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "14287:4:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "14250:41:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47317,
                  "nodeType": "ExpressionStatement",
                  "src": "14250:41:38"
                }
              ]
            },
            "documentation": {
              "id": 47302,
              "nodeType": "StructuredDocumentation",
              "src": "13941:238:38",
              "text": " @notice lets an address (the caller) approve another address to perform actions on it's (the caller's) vault\n @param _relyUpon address to rely upon\n @dev should revert if the contract is paused"
            },
            "functionSelector": "65fae35e",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47307,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47306,
                  "name": "whenNotPaused",
                  "nameLocations": ["14226:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "14226:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "14226:13:38"
              }
            ],
            "name": "rely",
            "nameLocation": "14193:4:38",
            "parameters": {
              "id": 47305,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47304,
                  "mutability": "mutable",
                  "name": "_relyUpon",
                  "nameLocation": "14206:9:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47319,
                  "src": "14198:17:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47303,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14198:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14197:19:38"
            },
            "returnParameters": {
              "id": 47308,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "14240:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47337,
            "nodeType": "FunctionDefinition",
            "src": "14558:119:38",
            "nodes": [],
            "body": {
              "id": 47336,
              "nodeType": "Block",
              "src": "14616:61:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 47334,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "baseExpression": {
                        "baseExpression": {
                          "id": 47327,
                          "name": "relyMapping",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46736,
                          "src": "14626:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_mapping$_t_address_$_t_bool_$_$",
                            "typeString": "mapping(address => mapping(address => bool))"
                          }
                        },
                        "id": 47331,
                        "indexExpression": {
                          "expression": {
                            "id": 47328,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "14638:3:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 47329,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "14642:6:38",
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "src": "14638:10:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "14626:23:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 47332,
                      "indexExpression": {
                        "id": 47330,
                        "name": "_reliedUpon",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47322,
                        "src": "14650:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "14626:36:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "hexValue": "66616c7365",
                      "id": 47333,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "14665:5:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "14626:44:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47335,
                  "nodeType": "ExpressionStatement",
                  "src": "14626:44:38"
                }
              ]
            },
            "documentation": {
              "id": 47320,
              "nodeType": "StructuredDocumentation",
              "src": "14304:249:38",
              "text": " @notice lets an address (the caller) remove access of another address to perform actions on it's (the caller's) vault\n @param _reliedUpon address to rely upon\n @dev should revert if the contract is paused"
            },
            "functionSelector": "9c52a7f1",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47325,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47324,
                  "name": "whenNotPaused",
                  "nameLocations": ["14602:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "14602:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "14602:13:38"
              }
            ],
            "name": "deny",
            "nameLocation": "14567:4:38",
            "parameters": {
              "id": 47323,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47322,
                  "mutability": "mutable",
                  "name": "_reliedUpon",
                  "nameLocation": "14580:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47337,
                  "src": "14572:19:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47321,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14572:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "14571:21:38"
            },
            "returnParameters": {
              "id": 47326,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "14616:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47365,
            "nodeType": "FunctionDefinition",
            "src": "15290:331:38",
            "nodes": [],
            "body": {
              "id": 47364,
              "nodeType": "Block",
              "src": "15465:156:38",
              "nodes": [],
              "statements": [
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 47354,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47343,
                        "src": "15500:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47355,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47345,
                        "src": "15508:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47353,
                      "name": "CollateralDeposited",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46237,
                      "src": "15480:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 47356,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15480:36:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47357,
                  "nodeType": "EmitStatement",
                  "src": "15475:41:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47359,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47341,
                        "src": "15580:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      {
                        "id": 47360,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47343,
                        "src": "15598:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47361,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47345,
                        "src": "15606:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47358,
                      "name": "_depositCollateral",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47784,
                      "src": "15561:18:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20Token_$46438_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract ERC20Token,address,uint256)"
                      }
                    },
                    "id": 47362,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15561:53:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47363,
                  "nodeType": "ExpressionStatement",
                  "src": "15561:53:38"
                }
              ]
            },
            "documentation": {
              "id": 47338,
              "nodeType": "StructuredDocumentation",
              "src": "14683:602:38",
              "text": " @notice deposits collateral into `_owner`'s vault from `_owner`'s address\n @param _collateralToken contract address of the collateral to deposit\n @param _owner owner of the vault to deposit into\n @param _amount amount of `_collateralToken` to deposit into `_owner`'s vault\n @dev should revert if the contract is paused\n      should revert if the collateral does not exist\n      should revert if transfer from `_owner` to this contract fails based on SafeERC20.safeTransferFrom()'s expectations of a successful erc20 transferFrom call"
            },
            "functionSelector": "f970c3b7",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47348,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47347,
                  "name": "whenNotPaused",
                  "nameLocations": ["15404:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "15404:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "15404:13:38"
              },
              {
                "arguments": [
                  {
                    "id": 47350,
                    "name": "_collateralToken",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47341,
                    "src": "15443:16:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47351,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47349,
                  "name": "collateralExists",
                  "nameLocations": ["15426:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "15426:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "15426:34:38"
              }
            ],
            "name": "depositCollateral",
            "nameLocation": "15299:17:38",
            "parameters": {
              "id": 47346,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47341,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "15328:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47365,
                  "src": "15317:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47340,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47339,
                      "name": "ERC20Token",
                      "nameLocations": ["15317:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "15317:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "15317:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47343,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "15354:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47365,
                  "src": "15346:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47342,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15346:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47345,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "15370:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47365,
                  "src": "15362:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47344,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "15362:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "15316:62:38"
            },
            "returnParameters": {
              "id": 47352,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "15465:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47424,
            "nodeType": "FunctionDefinition",
            "src": "16914:727:38",
            "nodes": [],
            "body": {
              "id": 47423,
              "nodeType": "Block",
              "src": "17119:522:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47386],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47386,
                      "mutability": "mutable",
                      "name": "_vault",
                      "nameLocation": "17147:6:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47423,
                      "src": "17129:24:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                        "typeString": "struct IVault.VaultInfo"
                      },
                      "typeName": {
                        "id": 47385,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47384,
                          "name": "VaultInfo",
                          "nameLocations": ["17129:9:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46309,
                          "src": "17129:9:38"
                        },
                        "referencedDeclaration": 46309,
                        "src": "17129:9:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47392,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 47387,
                        "name": "vaultMapping",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46730,
                        "src": "17156:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                          "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo storage ref))"
                        }
                      },
                      "id": 47389,
                      "indexExpression": {
                        "id": 47388,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47369,
                        "src": "17169:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "17156:30:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                        "typeString": "mapping(address => struct IVault.VaultInfo storage ref)"
                      }
                    },
                    "id": 47391,
                    "indexExpression": {
                      "id": 47390,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47371,
                      "src": "17187:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "17156:38:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage",
                      "typeString": "struct IVault.VaultInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "17129:65:38"
                },
                {
                  "assignments": [47395],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47395,
                      "mutability": "mutable",
                      "name": "_collateral",
                      "nameLocation": "17227:11:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47423,
                      "src": "17204:34:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                        "typeString": "struct IVault.CollateralInfo"
                      },
                      "typeName": {
                        "id": 47394,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47393,
                          "name": "CollateralInfo",
                          "nameLocations": ["17204:14:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46300,
                          "src": "17204:14:38"
                        },
                        "referencedDeclaration": 46300,
                        "src": "17204:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47399,
                  "initialValue": {
                    "baseExpression": {
                      "id": 47396,
                      "name": "collateralMapping",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46722,
                      "src": "17241:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                      }
                    },
                    "id": 47398,
                    "indexExpression": {
                      "id": 47397,
                      "name": "_collateralToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47369,
                      "src": "17259:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                        "typeString": "contract ERC20Token"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "17241:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                      "typeString": "struct IVault.CollateralInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "17204:72:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47401,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47395,
                        "src": "17404:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47402,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47386,
                        "src": "17417:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 47400,
                      "name": "_accrueFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48046,
                      "src": "17392:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer)"
                      }
                    },
                    "id": 47403,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17392:32:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47404,
                  "nodeType": "ExpressionStatement",
                  "src": "17392:32:38"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 47406,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47371,
                        "src": "17460:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47407,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47373,
                        "src": "17468:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47408,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47375,
                        "src": "17473:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47405,
                      "name": "CollateralWithdrawn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46245,
                      "src": "17440:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 47409,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17440:41:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47410,
                  "nodeType": "EmitStatement",
                  "src": "17435:46:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47412,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47369,
                        "src": "17512:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      {
                        "id": 47413,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47371,
                        "src": "17530:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47414,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47373,
                        "src": "17538:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47415,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47375,
                        "src": "17543:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47411,
                      "name": "_withdrawCollateral",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47837,
                      "src": "17492:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20Token_$46438_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract ERC20Token,address,address,uint256)"
                      }
                    },
                    "id": 47416,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17492:59:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47417,
                  "nodeType": "ExpressionStatement",
                  "src": "17492:59:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47419,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47395,
                        "src": "17614:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47420,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47386,
                        "src": "17627:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 47418,
                      "name": "_revertIfCollateralRatioIsAboveLiquidationThreshold",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48243,
                      "src": "17562:51:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view"
                      }
                    },
                    "id": 47421,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "17562:72:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47422,
                  "nodeType": "ExpressionStatement",
                  "src": "17562:72:38"
                }
              ]
            },
            "documentation": {
              "id": 47366,
              "nodeType": "StructuredDocumentation",
              "src": "15627:1282:38",
              "text": " @notice withdraws collateral from `_owner`'s vault to `_to`'s address\n @param _collateralToken contract address of the collateral to withdraw\n @param _owner owner of the vault to withdraw from\n @param _to address to send the withdrawn collateral to\n @param _amount amount of `_collateralToken` to withdraw from `_owner`'s vault to `_to`'s address\n @dev should update fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratio\n @dev should revert if the collateral does not exist\n      should revert if the caller is not the `_owner` and not also not relied upon\n      should revert if transfer from this contract to the `_to` address fails based on SafeERC20.safeTransfer()'s expectations of a successful erc20 transfer call\n      should revert if the collateral ratio of `_owner` is below the liquidation threshold at the end of the function. This can happen if the position was already under-water (liquidatable) prior to the function call or if the withdrawal of `_amount` make it under-water"
            },
            "functionSelector": "5820ba63",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 47378,
                    "name": "_collateralToken",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47369,
                    "src": "17059:16:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47379,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47377,
                  "name": "collateralExists",
                  "nameLocations": ["17042:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "17042:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "17042:34:38"
              },
              {
                "arguments": [
                  {
                    "id": 47381,
                    "name": "_owner",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47371,
                    "src": "17107:6:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                ],
                "id": 47382,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47380,
                  "name": "onlyOwnerOrReliedUpon",
                  "nameLocations": ["17085:21:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46828,
                  "src": "17085:21:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "17085:29:38"
              }
            ],
            "name": "withdrawCollateral",
            "nameLocation": "16923:18:38",
            "parameters": {
              "id": 47376,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47369,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "16953:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47424,
                  "src": "16942:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47368,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47367,
                      "name": "ERC20Token",
                      "nameLocations": ["16942:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "16942:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "16942:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47371,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "16979:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47424,
                  "src": "16971:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47370,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16971:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47373,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "16995:3:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47424,
                  "src": "16987:11:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47372,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "16987:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47375,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "17008:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47424,
                  "src": "17000:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47374,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "17000:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "16941:75:38"
            },
            "returnParameters": {
              "id": 47383,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "17119:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47533,
            "nodeType": "FunctionDefinition",
            "src": "19470:1611:38",
            "nodes": [],
            "body": {
              "id": 47532,
              "nodeType": "Block",
              "src": "19691:1390:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47447],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47447,
                      "mutability": "mutable",
                      "name": "_vault",
                      "nameLocation": "19719:6:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47532,
                      "src": "19701:24:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                        "typeString": "struct IVault.VaultInfo"
                      },
                      "typeName": {
                        "id": 47446,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47445,
                          "name": "VaultInfo",
                          "nameLocations": ["19701:9:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46309,
                          "src": "19701:9:38"
                        },
                        "referencedDeclaration": 46309,
                        "src": "19701:9:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47453,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 47448,
                        "name": "vaultMapping",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46730,
                        "src": "19728:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                          "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo storage ref))"
                        }
                      },
                      "id": 47450,
                      "indexExpression": {
                        "id": 47449,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47428,
                        "src": "19741:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "19728:30:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                        "typeString": "mapping(address => struct IVault.VaultInfo storage ref)"
                      }
                    },
                    "id": 47452,
                    "indexExpression": {
                      "id": 47451,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47430,
                      "src": "19759:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "19728:38:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage",
                      "typeString": "struct IVault.VaultInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "19701:65:38"
                },
                {
                  "assignments": [47456],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47456,
                      "mutability": "mutable",
                      "name": "_collateral",
                      "nameLocation": "19799:11:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47532,
                      "src": "19776:34:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                        "typeString": "struct IVault.CollateralInfo"
                      },
                      "typeName": {
                        "id": 47455,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47454,
                          "name": "CollateralInfo",
                          "nameLocations": ["19776:14:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46300,
                          "src": "19776:14:38"
                        },
                        "referencedDeclaration": 46300,
                        "src": "19776:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47460,
                  "initialValue": {
                    "baseExpression": {
                      "id": 47457,
                      "name": "collateralMapping",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46722,
                      "src": "19813:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                      }
                    },
                    "id": 47459,
                    "indexExpression": {
                      "id": 47458,
                      "name": "_collateralToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47428,
                      "src": "19831:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                        "typeString": "contract ERC20Token"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "19813:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                      "typeString": "struct IVault.CollateralInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "19776:72:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47465,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 47461,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47456,
                        "src": "20000:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47462,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "20012:26:38",
                      "memberName": "collateralFloorPerPosition",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46297,
                      "src": "20000:38:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "expression": {
                        "id": 47463,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47447,
                        "src": "20041:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 47464,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "20048:19:38",
                      "memberName": "depositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46302,
                      "src": "20041:26:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20000:67:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47470,
                  "nodeType": "IfStatement",
                  "src": "19996:136:38",
                  "trueBody": {
                    "id": 47469,
                    "nodeType": "Block",
                    "src": "20069:63:38",
                    "statements": [
                      {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 47466,
                            "name": "TotalUserCollateralBelowFloor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46205,
                            "src": "20090:29:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 47467,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20090:31:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47468,
                        "nodeType": "RevertStatement",
                        "src": "20083:38:38"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47475,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 47473,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 47471,
                        "name": "debt",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46714,
                        "src": "20222:4:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "id": 47472,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47434,
                        "src": "20229:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "20222:14:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "id": 47474,
                      "name": "debtCeiling",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46712,
                      "src": "20239:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20222:28:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47479,
                  "nodeType": "IfStatement",
                  "src": "20218:68:38",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 47476,
                        "name": "GlobalDebtCeilingExceeded",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46219,
                        "src": "20259:25:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 47477,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "20259:27:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 47478,
                    "nodeType": "RevertStatement",
                    "src": "20252:34:38"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47486,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 47483,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 47480,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47456,
                          "src": "20300:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        "id": 47481,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "20312:19:38",
                        "memberName": "totalBorrowedAmount",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46284,
                        "src": "20300:31:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "id": 47482,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47434,
                        "src": "20334:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "20300:41:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "expression": {
                        "id": 47484,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47456,
                        "src": "20344:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47485,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "20356:11:38",
                      "memberName": "debtCeiling",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46295,
                      "src": "20344:23:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "20300:67:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47491,
                  "nodeType": "IfStatement",
                  "src": "20296:136:38",
                  "trueBody": {
                    "id": 47490,
                    "nodeType": "Block",
                    "src": "20369:63:38",
                    "statements": [
                      {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 47487,
                            "name": "CollateralDebtCeilingExceeded",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46221,
                            "src": "20390:29:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 47488,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20390:31:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47489,
                        "nodeType": "RevertStatement",
                        "src": "20383:38:38"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47495,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 47492,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47447,
                        "src": "20638:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 47493,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "20645:14:38",
                      "memberName": "borrowedAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46304,
                      "src": "20638:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 47494,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "20663:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "20638:26:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 47513,
                    "nodeType": "Block",
                    "src": "20729:158:38",
                    "statements": [
                      {
                        "expression": {
                          "id": 47511,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "id": 47502,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47447,
                              "src": "20743:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            },
                            "id": 47504,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "20750:24:38",
                            "memberName": "lastTotalAccumulatedRate",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46308,
                            "src": "20743:31:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "arguments": [
                              {
                                "id": 47507,
                                "name": "baseRateInfo",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46710,
                                "src": "20841:12:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                  "typeString": "struct IVault.RateInfo storage ref"
                                }
                              },
                              {
                                "expression": {
                                  "id": 47508,
                                  "name": "_collateral",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 47456,
                                  "src": "20855:11:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                    "typeString": "struct IVault.CollateralInfo storage pointer"
                                  }
                                },
                                "id": 47509,
                                "isConstant": false,
                                "isLValue": true,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberLocation": "20867:8:38",
                                "memberName": "rateInfo",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 46291,
                                "src": "20855:20:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                  "typeString": "struct IVault.RateInfo storage ref"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                  "typeString": "struct IVault.RateInfo storage ref"
                                },
                                {
                                  "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                                  "typeString": "struct IVault.RateInfo storage ref"
                                }
                              ],
                              "expression": {
                                "id": 47505,
                                "name": "rateModule",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 46707,
                                "src": "20793:10:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IRate_$46191",
                                  "typeString": "contract IRate"
                                }
                              },
                              "id": 47506,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "20804:36:38",
                              "memberName": "calculateCurrentTotalAccumulatedRate",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46182,
                              "src": "20793:47:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_external_view$_t_struct$_RateInfo_$46280_memory_ptr_$_t_struct$_RateInfo_$46280_memory_ptr_$returns$_t_uint256_$",
                                "typeString": "function (struct IVault.RateInfo memory,struct IVault.RateInfo memory) view external returns (uint256)"
                              }
                            },
                            "id": 47510,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "nameLocations": [],
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "20793:83:38",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "20743:133:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47512,
                        "nodeType": "ExpressionStatement",
                        "src": "20743:133:38"
                      }
                    ]
                  },
                  "id": 47514,
                  "nodeType": "IfStatement",
                  "src": "20634:253:38",
                  "trueBody": {
                    "id": 47501,
                    "nodeType": "Block",
                    "src": "20666:57:38",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 47497,
                              "name": "_collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47456,
                              "src": "20692:11:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                "typeString": "struct IVault.CollateralInfo storage pointer"
                              }
                            },
                            {
                              "id": 47498,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47447,
                              "src": "20705:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                "typeString": "struct IVault.CollateralInfo storage pointer"
                              },
                              {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            ],
                            "id": 47496,
                            "name": "_accrueFees",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 48046,
                            "src": "20680:11:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$__$",
                              "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer)"
                            }
                          },
                          "id": 47499,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "20680:32:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47500,
                        "nodeType": "ExpressionStatement",
                        "src": "20680:32:38"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 47516,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47430,
                        "src": "20917:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47517,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47434,
                        "src": "20925:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47515,
                      "name": "CurrencyMinted",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46251,
                      "src": "20902:14:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 47518,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20902:31:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47519,
                  "nodeType": "EmitStatement",
                  "src": "20897:36:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47521,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47456,
                        "src": "20957:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47522,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47447,
                        "src": "20970:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      {
                        "id": 47523,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47432,
                        "src": "20978:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47524,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47434,
                        "src": "20983:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47520,
                      "name": "_mintCurrency",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47875,
                      "src": "20943:13:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer,address,uint256)"
                      }
                    },
                    "id": 47525,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "20943:48:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47526,
                  "nodeType": "ExpressionStatement",
                  "src": "20943:48:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47528,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47456,
                        "src": "21054:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47529,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47447,
                        "src": "21067:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 47527,
                      "name": "_revertIfCollateralRatioIsAboveLiquidationThreshold",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48243,
                      "src": "21002:51:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view"
                      }
                    },
                    "id": 47530,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "21002:72:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47531,
                  "nodeType": "ExpressionStatement",
                  "src": "21002:72:38"
                }
              ]
            },
            "documentation": {
              "id": 47425,
              "nodeType": "StructuredDocumentation",
              "src": "17647:1818:38",
              "text": " @notice mints/borrows `_amount` of currency to `_to`, backed by `_owner`'s deposited collateral\n @param _collateralToken contract address of collateral to mint/borrow the vault's currency against\n @param _owner owner of the vault to use it's collateral balance\n @param _to address to send the minted/borrowed currency to\n @param _amount amount of currency to mint\n @dev if the users currencly minted/borrwed amount if greater than 0, it should update fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratio\n      else i.e when currenctly minted/borrwed amount is 0 (this means that no past fees to accrue), it should set the `lastTotalAccumulatedRate` of the vault to be the current totalAccumulatedRate (i.e current accumulated base rate + current accumulated collateral rate, emphaisis on current as these values are recalculated for both rates to their current values)\n @dev should revert if the contract is paused\n      should revert if the collateral does not exist\n      should revert if the caller is not the `_owner` and not also not relied upon\n      should revert if `_owner`'s deposited collateral amount is less than the collateralFloorPerPosition for the given collateral\n      should revert if mint to the `_to` address fails\n      should revert if the collateral ratio of `_owner` is below the liquidation threshold at the end of the function. This can happen if the position was already under-water (liquidatable) prior to the function call or if the withdrawal of `_amount` make it under-water"
            },
            "functionSelector": "49a66ca3",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 47437,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47436,
                  "name": "whenNotPaused",
                  "nameLocations": ["19592:13:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46075,
                  "src": "19592:13:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "19592:13:38"
              },
              {
                "arguments": [
                  {
                    "id": 47439,
                    "name": "_collateralToken",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47428,
                    "src": "19631:16:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47440,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47438,
                  "name": "collateralExists",
                  "nameLocations": ["19614:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "19614:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "19614:34:38"
              },
              {
                "arguments": [
                  {
                    "id": 47442,
                    "name": "_owner",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47430,
                    "src": "19679:6:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                ],
                "id": 47443,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47441,
                  "name": "onlyOwnerOrReliedUpon",
                  "nameLocations": ["19657:21:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46828,
                  "src": "19657:21:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "19657:29:38"
              }
            ],
            "name": "mintCurrency",
            "nameLocation": "19479:12:38",
            "parameters": {
              "id": 47435,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47428,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "19503:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47533,
                  "src": "19492:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47427,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47426,
                      "name": "ERC20Token",
                      "nameLocations": ["19492:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "19492:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "19492:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47430,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "19529:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47533,
                  "src": "19521:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47429,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "19521:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47432,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "19545:3:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47533,
                  "src": "19537:11:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47431,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "19537:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47434,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "19558:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47533,
                  "src": "19550:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47433,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "19550:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "19491:75:38"
            },
            "returnParameters": {
              "id": 47444,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "19691:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47578,
            "nodeType": "FunctionDefinition",
            "src": "21853:535:38",
            "nodes": [],
            "body": {
              "id": 47577,
              "nodeType": "Block",
              "src": "22001:387:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47549],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47549,
                      "mutability": "mutable",
                      "name": "_vault",
                      "nameLocation": "22029:6:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47577,
                      "src": "22011:24:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                        "typeString": "struct IVault.VaultInfo"
                      },
                      "typeName": {
                        "id": 47548,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47547,
                          "name": "VaultInfo",
                          "nameLocations": ["22011:9:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46309,
                          "src": "22011:9:38"
                        },
                        "referencedDeclaration": 46309,
                        "src": "22011:9:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47555,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 47550,
                        "name": "vaultMapping",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46730,
                        "src": "22038:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                          "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo storage ref))"
                        }
                      },
                      "id": 47552,
                      "indexExpression": {
                        "id": 47551,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47537,
                        "src": "22051:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "22038:30:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                        "typeString": "mapping(address => struct IVault.VaultInfo storage ref)"
                      }
                    },
                    "id": 47554,
                    "indexExpression": {
                      "id": 47553,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47539,
                      "src": "22069:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "22038:38:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage",
                      "typeString": "struct IVault.VaultInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22011:65:38"
                },
                {
                  "assignments": [47558],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47558,
                      "mutability": "mutable",
                      "name": "_collateral",
                      "nameLocation": "22109:11:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47577,
                      "src": "22086:34:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                        "typeString": "struct IVault.CollateralInfo"
                      },
                      "typeName": {
                        "id": 47557,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47556,
                          "name": "CollateralInfo",
                          "nameLocations": ["22086:14:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46300,
                          "src": "22086:14:38"
                        },
                        "referencedDeclaration": 46300,
                        "src": "22086:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47562,
                  "initialValue": {
                    "baseExpression": {
                      "id": 47559,
                      "name": "collateralMapping",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46722,
                      "src": "22123:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                      }
                    },
                    "id": 47561,
                    "indexExpression": {
                      "id": 47560,
                      "name": "_collateralToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47537,
                      "src": "22141:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                        "typeString": "contract ERC20Token"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "22123:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                      "typeString": "struct IVault.CollateralInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "22086:72:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47564,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47558,
                        "src": "22287:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47565,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47549,
                        "src": "22300:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 47563,
                      "name": "_accrueFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48046,
                      "src": "22275:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer)"
                      }
                    },
                    "id": 47566,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22275:32:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47567,
                  "nodeType": "ExpressionStatement",
                  "src": "22275:32:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47569,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47558,
                        "src": "22332:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47570,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47549,
                        "src": "22345:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      {
                        "id": 47571,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47539,
                        "src": "22353:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 47572,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "22361:3:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 47573,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "22365:6:38",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "22361:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47574,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47541,
                        "src": "22373:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47568,
                      "name": "_burnCurrency",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47969,
                      "src": "22318:13:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer,address,address,uint256)"
                      }
                    },
                    "id": 47575,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "22318:63:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47576,
                  "nodeType": "ExpressionStatement",
                  "src": "22318:63:38"
                }
              ]
            },
            "documentation": {
              "id": 47534,
              "nodeType": "StructuredDocumentation",
              "src": "21087:761:38",
              "text": " @notice burns/pays back a borrowed/minted currency\n @param _collateralToken contract address of collateral to burn/pay back the vault's currency for,\n @param _owner owner of the vault to pay back it's loan\n @param _amount amount of currency to pay back / burn\n @dev we accrue fees here to enable full payment of both borrowed amount and fees in one function. This way unupdated accrued fees are accounted for too and can be paid back\n @dev should revert if the collateral does not exist\n      should revert if the caller is not the `_owner` and not also not relied upon\n      should revert if the amount of currency to burn / pay back is more than `borrowed amount + total accrued fees`"
            },
            "functionSelector": "4fa73919",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 47544,
                    "name": "_collateralToken",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47537,
                    "src": "21979:16:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47545,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47543,
                  "name": "collateralExists",
                  "nameLocations": ["21962:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "21962:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "21962:34:38"
              }
            ],
            "name": "burnCurrency",
            "nameLocation": "21862:12:38",
            "parameters": {
              "id": 47542,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47537,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "21886:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47578,
                  "src": "21875:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47536,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47535,
                      "name": "ERC20Token",
                      "nameLocations": ["21875:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "21875:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "21875:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47539,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "21912:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47578,
                  "src": "21904:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47538,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "21904:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47541,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "21928:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47578,
                  "src": "21920:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47540,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "21920:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "21874:62:38"
            },
            "returnParameters": {
              "id": 47546,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "22001:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47718,
            "nodeType": "FunctionDefinition",
            "src": "23502:2620:38",
            "nodes": [],
            "body": {
              "id": 47717,
              "nodeType": "Block",
              "src": "23673:2449:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47596],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47596,
                      "mutability": "mutable",
                      "name": "_vault",
                      "nameLocation": "23862:6:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47717,
                      "src": "23844:24:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                        "typeString": "struct IVault.VaultInfo"
                      },
                      "typeName": {
                        "id": 47595,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47594,
                          "name": "VaultInfo",
                          "nameLocations": ["23844:9:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46309,
                          "src": "23844:9:38"
                        },
                        "referencedDeclaration": 46309,
                        "src": "23844:9:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47602,
                  "initialValue": {
                    "baseExpression": {
                      "baseExpression": {
                        "id": 47597,
                        "name": "vaultMapping",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46730,
                        "src": "23871:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                          "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo storage ref))"
                        }
                      },
                      "id": 47599,
                      "indexExpression": {
                        "id": 47598,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47582,
                        "src": "23884:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "23871:30:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                        "typeString": "mapping(address => struct IVault.VaultInfo storage ref)"
                      }
                    },
                    "id": 47601,
                    "indexExpression": {
                      "id": 47600,
                      "name": "_owner",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47584,
                      "src": "23902:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "23871:38:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage",
                      "typeString": "struct IVault.VaultInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23844:65:38"
                },
                {
                  "assignments": [47605],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47605,
                      "mutability": "mutable",
                      "name": "_collateral",
                      "nameLocation": "23942:11:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47717,
                      "src": "23919:34:38",
                      "stateVariable": false,
                      "storageLocation": "storage",
                      "typeDescriptions": {
                        "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                        "typeString": "struct IVault.CollateralInfo"
                      },
                      "typeName": {
                        "id": 47604,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 47603,
                          "name": "CollateralInfo",
                          "nameLocations": ["23919:14:38"],
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 46300,
                          "src": "23919:14:38"
                        },
                        "referencedDeclaration": 46300,
                        "src": "23919:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47609,
                  "initialValue": {
                    "baseExpression": {
                      "id": 47606,
                      "name": "collateralMapping",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46722,
                      "src": "23956:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                        "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                      }
                    },
                    "id": 47608,
                    "indexExpression": {
                      "id": 47607,
                      "name": "_collateralToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47582,
                      "src": "23974:16:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_ERC20Token_$46438",
                        "typeString": "contract ERC20Token"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "23956:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                      "typeString": "struct IVault.CollateralInfo storage ref"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "23919:72:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47611,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47605,
                        "src": "24119:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47612,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47596,
                        "src": "24132:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 47610,
                      "name": "_accrueFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48046,
                      "src": "24107:11:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer)"
                      }
                    },
                    "id": 47613,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24107:32:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47614,
                  "nodeType": "ExpressionStatement",
                  "src": "24107:32:38"
                },
                {
                  "assignments": [47616],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47616,
                      "mutability": "mutable",
                      "name": "_preCollateralRatio",
                      "nameLocation": "24158:19:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47717,
                      "src": "24150:27:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47615,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "24150:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47621,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 47618,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47605,
                        "src": "24200:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47619,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47596,
                        "src": "24213:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 47617,
                      "name": "_getCollateralRatio",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48099,
                      "src": "24180:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$_t_uint256_$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 47620,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "24180:40:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "24150:70:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47625,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47622,
                      "name": "_preCollateralRatio",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47616,
                      "src": "24234:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "expression": {
                        "id": 47623,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47605,
                        "src": "24257:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47624,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "24269:20:38",
                      "memberName": "liquidationThreshold",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46286,
                      "src": "24257:32:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "24234:55:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47630,
                  "nodeType": "IfStatement",
                  "src": "24230:109:38",
                  "trueBody": {
                    "id": 47629,
                    "nodeType": "Block",
                    "src": "24291:48:38",
                    "statements": [
                      {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 47626,
                            "name": "PositionIsSafe",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46201,
                            "src": "24312:14:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 47627,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "24312:16:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47628,
                        "nodeType": "RevertStatement",
                        "src": "24305:23:38"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47637,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47631,
                      "name": "_currencyAmountToPay",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47588,
                      "src": "24353:20:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 47634,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "24382:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 47633,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "24382:7:38",
                              "typeDescriptions": {}
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            }
                          ],
                          "id": 47632,
                          "name": "type",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -27,
                          "src": "24377:4:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                            "typeString": "function () pure"
                          }
                        },
                        "id": 47635,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "24377:13:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_meta_type_t_uint256",
                          "typeString": "type(uint256)"
                        }
                      },
                      "id": 47636,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberLocation": "24391:3:38",
                      "memberName": "max",
                      "nodeType": "MemberAccess",
                      "src": "24377:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "24353:41:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47647,
                  "nodeType": "IfStatement",
                  "src": "24349:614:38",
                  "trueBody": {
                    "id": 47646,
                    "nodeType": "Block",
                    "src": "24396:567:38",
                    "statements": [
                      {
                        "expression": {
                          "id": 47644,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 47638,
                            "name": "_currencyAmountToPay",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47588,
                            "src": "24887:20:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 47643,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "id": 47639,
                                "name": "_vault",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47596,
                                "src": "24910:6:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                  "typeString": "struct IVault.VaultInfo storage pointer"
                                }
                              },
                              "id": 47640,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "24917:14:38",
                              "memberName": "borrowedAmount",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46304,
                              "src": "24910:21:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "+",
                            "rightExpression": {
                              "expression": {
                                "id": 47641,
                                "name": "_vault",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47596,
                                "src": "24934:6:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                  "typeString": "struct IVault.VaultInfo storage pointer"
                                }
                              },
                              "id": 47642,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "24941:11:38",
                              "memberName": "accruedFees",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46306,
                              "src": "24934:18:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "24910:42:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "24887:65:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47645,
                        "nodeType": "ExpressionStatement",
                        "src": "24887:65:38"
                      }
                    ]
                  }
                },
                {
                  "assignments": [47649],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47649,
                      "mutability": "mutable",
                      "name": "_collateralAmountCovered",
                      "nameLocation": "24981:24:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47717,
                      "src": "24973:32:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47648,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "24973:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47654,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 47651,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47605,
                        "src": "25046:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47652,
                        "name": "_currencyAmountToPay",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47588,
                        "src": "25059:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47650,
                      "name": "_getCollateralAmountFromCurrencyValue",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48159,
                      "src": "25008:37:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,uint256) view returns (uint256)"
                      }
                    },
                    "id": 47653,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25008:72:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "24973:107:38"
                },
                {
                  "assignments": [47656],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47656,
                      "mutability": "mutable",
                      "name": "_bonus",
                      "nameLocation": "25098:6:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47717,
                      "src": "25090:14:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47655,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "25090:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47664,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47663,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 47660,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 47657,
                            "name": "_collateralAmountCovered",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47649,
                            "src": "25108:24:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "expression": {
                              "id": 47658,
                              "name": "_collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47605,
                              "src": "25135:11:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                "typeString": "struct IVault.CollateralInfo storage pointer"
                              }
                            },
                            "id": 47659,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "25147:16:38",
                            "memberName": "liquidationBonus",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46288,
                            "src": "25135:28:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "25108:55:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 47661,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "25107:57:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "/",
                    "rightExpression": {
                      "id": 47662,
                      "name": "HUNDRED_PERCENTAGE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46694,
                      "src": "25167:18:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "25107:78:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "25090:95:38"
                },
                {
                  "assignments": [47666],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47666,
                      "mutability": "mutable",
                      "name": "_total",
                      "nameLocation": "25203:6:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47717,
                      "src": "25195:14:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47665,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "25195:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47670,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47669,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47667,
                      "name": "_collateralAmountCovered",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47649,
                      "src": "25212:24:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "id": 47668,
                      "name": "_bonus",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47656,
                      "src": "25239:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "25212:33:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "25195:50:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47674,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47671,
                      "name": "_total",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47666,
                      "src": "25562:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "expression": {
                        "id": 47672,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47596,
                        "src": "25571:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 47673,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "25578:19:38",
                      "memberName": "depositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46302,
                      "src": "25571:26:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "25562:35:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47681,
                  "nodeType": "IfStatement",
                  "src": "25558:101:38",
                  "trueBody": {
                    "id": 47680,
                    "nodeType": "Block",
                    "src": "25599:60:38",
                    "statements": [
                      {
                        "expression": {
                          "id": 47678,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 47675,
                            "name": "_total",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47666,
                            "src": "25613:6:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "expression": {
                              "id": 47676,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47596,
                              "src": "25622:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            },
                            "id": 47677,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "25629:19:38",
                            "memberName": "depositedCollateral",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46302,
                            "src": "25622:26:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "25613:35:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47679,
                        "nodeType": "ExpressionStatement",
                        "src": "25613:35:38"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 47683,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47584,
                        "src": "25685:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 47684,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "25693:3:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 47685,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "25697:6:38",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "25693:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47686,
                        "name": "_currencyAmountToPay",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47588,
                        "src": "25705:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 47687,
                        "name": "_total",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47666,
                        "src": "25727:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47682,
                      "name": "Liquidated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46273,
                      "src": "25674:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$_t_uint256_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256,uint256)"
                      }
                    },
                    "id": 47688,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25674:60:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47689,
                  "nodeType": "EmitStatement",
                  "src": "25669:65:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47691,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47582,
                        "src": "25765:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      {
                        "id": 47692,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47584,
                        "src": "25783:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47693,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47586,
                        "src": "25791:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47694,
                        "name": "_total",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47666,
                        "src": "25796:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47690,
                      "name": "_withdrawCollateral",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47837,
                      "src": "25745:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_ERC20Token_$46438_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (contract ERC20Token,address,address,uint256)"
                      }
                    },
                    "id": 47695,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25745:58:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47696,
                  "nodeType": "ExpressionStatement",
                  "src": "25745:58:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47698,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47605,
                        "src": "25827:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 47699,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47596,
                        "src": "25840:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      {
                        "id": 47700,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47584,
                        "src": "25848:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 47701,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "25856:3:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 47702,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "25860:6:38",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "25856:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47703,
                        "name": "_currencyAmountToPay",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47588,
                        "src": "25868:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47697,
                      "name": "_burnCurrency",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47969,
                      "src": "25813:13:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer,address,address,uint256)"
                      }
                    },
                    "id": 47704,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "25813:76:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47705,
                  "nodeType": "ExpressionStatement",
                  "src": "25813:76:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47711,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47706,
                      "name": "_preCollateralRatio",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47616,
                      "src": "25991:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "arguments": [
                        {
                          "id": 47708,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47605,
                          "src": "26034:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        {
                          "id": 47709,
                          "name": "_vault",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47596,
                          "src": "26047:6:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                            "typeString": "struct IVault.VaultInfo storage pointer"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          },
                          {
                            "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                            "typeString": "struct IVault.VaultInfo storage pointer"
                          }
                        ],
                        "id": 47707,
                        "name": "_getCollateralRatio",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48099,
                        "src": "26014:19:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$_t_uint256_$",
                          "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view returns (uint256)"
                        }
                      },
                      "id": 47710,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "26014:40:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "25991:63:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47716,
                  "nodeType": "IfStatement",
                  "src": "25987:129:38",
                  "trueBody": {
                    "id": 47715,
                    "nodeType": "Block",
                    "src": "26056:60:38",
                    "statements": [
                      {
                        "errorCall": {
                          "arguments": [],
                          "expression": {
                            "argumentTypes": [],
                            "id": 47712,
                            "name": "CollateralRatioNotImproved",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46213,
                            "src": "26077:26:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_error_pure$__$returns$__$",
                              "typeString": "function () pure"
                            }
                          },
                          "id": 47713,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "26077:28:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47714,
                        "nodeType": "RevertStatement",
                        "src": "26070:35:38"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 47579,
              "nodeType": "StructuredDocumentation",
              "src": "22394:1103:38",
              "text": " @notice liquidates a vault making sure the liquidation strictly improves the collateral ratio i.e doesn't leave it the same as before or decreases it (if that's possible)\n @param _collateralToken contract address of collateral used by vault that is to be liquidate, also the token to recieved by the `_to` address after liquidation\n @param _owner owner of the vault to liquidate\n @param _to address to send the liquidated collateral (collateral covered) to\n @param _currencyAmountToPay the amount of currency tokens to pay back for `_owner`\n @dev updates fees accrued for `_owner`'s vault since last fee update, this is important as it ensures that the collateral-ratio check at the start and end of the function uses an updated total owed amount i.e (borrowedAmount + accruedFees) when checking `_owner`'s collateral-ratio\n @dev should revert if the collateral does not exist\n      should revert if the vault is not under-water\n      should revert if liqudiation did not strictly imporve the collateral ratio of the vault"
            },
            "functionSelector": "aab3f868",
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 47591,
                    "name": "_collateralToken",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 47582,
                    "src": "23651:16:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  }
                ],
                "id": 47592,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 47590,
                  "name": "collateralExists",
                  "nameLocations": ["23634:16:38"],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 46804,
                  "src": "23634:16:38"
                },
                "nodeType": "ModifierInvocation",
                "src": "23634:34:38"
              }
            ],
            "name": "liquidate",
            "nameLocation": "23511:9:38",
            "parameters": {
              "id": 47589,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47582,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "23532:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47718,
                  "src": "23521:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47581,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47580,
                      "name": "ERC20Token",
                      "nameLocations": ["23521:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "23521:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "23521:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47584,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "23558:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47718,
                  "src": "23550:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47583,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23550:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47586,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "23574:3:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47718,
                  "src": "23566:11:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47585,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "23566:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47588,
                  "mutability": "mutable",
                  "name": "_currencyAmountToPay",
                  "nameLocation": "23587:20:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47718,
                  "src": "23579:28:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47587,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "23579:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "23520:88:38"
            },
            "returnParameters": {
              "id": 47593,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "23673:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "id": 47784,
            "nodeType": "FunctionDefinition",
            "src": "26477:795:38",
            "nodes": [],
            "body": {
              "id": 47783,
              "nodeType": "Block",
              "src": "26576:696:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [47730],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47730,
                      "mutability": "mutable",
                      "name": "preBalance",
                      "nameLocation": "26758:10:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47783,
                      "src": "26750:18:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47729,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "26750:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47738,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 47735,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "26806:4:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Vault_$48280",
                              "typeString": "contract Vault"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_Vault_$48280",
                              "typeString": "contract Vault"
                            }
                          ],
                          "id": 47734,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "26798:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 47733,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "26798:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 47736,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "26798:13:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "id": 47731,
                        "name": "_collateralToken",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47722,
                        "src": "26771:16:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_ERC20Token_$46438",
                          "typeString": "contract ERC20Token"
                        }
                      },
                      "id": 47732,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "26788:9:38",
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 44502,
                      "src": "26771:26:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 47737,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26771:41:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "26750:62:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 47744,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47722,
                            "src": "26959:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          ],
                          "id": 47743,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "26951:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 47742,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "26951:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 47745,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "26951:25:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 47746,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "26978:3:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 47747,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "26982:6:38",
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "src": "26978:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 47750,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "26998:4:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Vault_$48280",
                              "typeString": "contract Vault"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_Vault_$48280",
                              "typeString": "contract Vault"
                            }
                          ],
                          "id": 47749,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "26990:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 47748,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "26990:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 47751,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "26990:13:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47752,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47726,
                        "src": "27005:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 47739,
                        "name": "SafeTransferLib",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 44996,
                        "src": "26918:15:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_SafeTransferLib_$44996_$",
                          "typeString": "type(library SafeTransferLib)"
                        }
                      },
                      "id": 47741,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "26934:16:38",
                      "memberName": "safeTransferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 44921,
                      "src": "26918:32:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,address,uint256)"
                      }
                    },
                    "id": 47753,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "26918:95:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47754,
                  "nodeType": "ExpressionStatement",
                  "src": "26918:95:38"
                },
                {
                  "assignments": [47756],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 47756,
                      "mutability": "mutable",
                      "name": "difference",
                      "nameLocation": "27031:10:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 47783,
                      "src": "27023:18:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 47755,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "27023:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 47766,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47765,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "arguments": [
                            {
                              "id": 47761,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "27079:4:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Vault_$48280",
                                "typeString": "contract Vault"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_Vault_$48280",
                                "typeString": "contract Vault"
                              }
                            ],
                            "id": 47760,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "27071:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 47759,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "27071:7:38",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 47762,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27071:13:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "id": 47757,
                          "name": "_collateralToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47722,
                          "src": "27044:16:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Token_$46438",
                            "typeString": "contract ERC20Token"
                          }
                        },
                        "id": 47758,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "27061:9:38",
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 44502,
                        "src": "27044:26:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 47763,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "27044:41:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "-",
                    "rightExpression": {
                      "id": 47764,
                      "name": "preBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47730,
                      "src": "27088:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27044:54:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "27023:75:38"
                },
                {
                  "expression": {
                    "id": 47774,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "baseExpression": {
                            "id": 47767,
                            "name": "vaultMapping",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46730,
                            "src": "27109:12:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                              "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo storage ref))"
                            }
                          },
                          "id": 47770,
                          "indexExpression": {
                            "id": 47768,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47722,
                            "src": "27122:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "27109:30:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                            "typeString": "mapping(address => struct IVault.VaultInfo storage ref)"
                          }
                        },
                        "id": 47771,
                        "indexExpression": {
                          "id": 47769,
                          "name": "_owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47724,
                          "src": "27140:6:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "27109:38:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage",
                          "typeString": "struct IVault.VaultInfo storage ref"
                        }
                      },
                      "id": 47772,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "27148:19:38",
                      "memberName": "depositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46302,
                      "src": "27109:58:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 47773,
                      "name": "difference",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47756,
                      "src": "27171:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27109:72:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47775,
                  "nodeType": "ExpressionStatement",
                  "src": "27109:72:38"
                },
                {
                  "expression": {
                    "id": 47781,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 47776,
                          "name": "collateralMapping",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46722,
                          "src": "27191:17:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                            "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                          }
                        },
                        "id": 47778,
                        "indexExpression": {
                          "id": 47777,
                          "name": "_collateralToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47722,
                          "src": "27209:16:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Token_$46438",
                            "typeString": "contract ERC20Token"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "27191:35:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                          "typeString": "struct IVault.CollateralInfo storage ref"
                        }
                      },
                      "id": 47779,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "27227:24:38",
                      "memberName": "totalDepositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46282,
                      "src": "27191:60:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 47780,
                      "name": "difference",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47756,
                      "src": "27255:10:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27191:74:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47782,
                  "nodeType": "ExpressionStatement",
                  "src": "27191:74:38"
                }
              ]
            },
            "documentation": {
              "id": 47719,
              "nodeType": "StructuredDocumentation",
              "src": "26253:219:38",
              "text": " @dev deposits collateral from `_owner` into this contract and updates the vaults depositedCollateral and collateral's totalDepositedCollateral\n @dev reverts if SafeERC20.safeTransferFrom() fails"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_depositCollateral",
            "nameLocation": "26486:18:38",
            "parameters": {
              "id": 47727,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47722,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "26516:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47784,
                  "src": "26505:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47721,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47720,
                      "name": "ERC20Token",
                      "nameLocations": ["26505:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "26505:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "26505:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47724,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "26542:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47784,
                  "src": "26534:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47723,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "26534:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47726,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "26558:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47784,
                  "src": "26550:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47725,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "26550:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "26504:62:38"
            },
            "returnParameters": {
              "id": 47728,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "26576:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 47837,
            "nodeType": "FunctionDefinition",
            "src": "27545:426:38",
            "nodes": [],
            "body": {
              "id": 47836,
              "nodeType": "Block",
              "src": "27658:313:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 47804,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "baseExpression": {
                            "id": 47797,
                            "name": "vaultMapping",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46730,
                            "src": "27668:12:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$_$",
                              "typeString": "mapping(contract ERC20Token => mapping(address => struct IVault.VaultInfo storage ref))"
                            }
                          },
                          "id": 47800,
                          "indexExpression": {
                            "id": 47798,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47788,
                            "src": "27681:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "27668:30:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_struct$_VaultInfo_$46309_storage_$",
                            "typeString": "mapping(address => struct IVault.VaultInfo storage ref)"
                          }
                        },
                        "id": 47801,
                        "indexExpression": {
                          "id": 47799,
                          "name": "_owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47790,
                          "src": "27699:6:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "27668:38:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage",
                          "typeString": "struct IVault.VaultInfo storage ref"
                        }
                      },
                      "id": 47802,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "27707:19:38",
                      "memberName": "depositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46302,
                      "src": "27668:58:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 47803,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47794,
                      "src": "27730:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27668:69:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47805,
                  "nodeType": "ExpressionStatement",
                  "src": "27668:69:38"
                },
                {
                  "expression": {
                    "id": 47811,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "baseExpression": {
                          "id": 47806,
                          "name": "collateralMapping",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 46722,
                          "src": "27747:17:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_contract$_ERC20Token_$46438_$_t_struct$_CollateralInfo_$46300_storage_$",
                            "typeString": "mapping(contract ERC20Token => struct IVault.CollateralInfo storage ref)"
                          }
                        },
                        "id": 47808,
                        "indexExpression": {
                          "id": 47807,
                          "name": "_collateralToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 47788,
                          "src": "27765:16:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_ERC20Token_$46438",
                            "typeString": "contract ERC20Token"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "27747:35:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage",
                          "typeString": "struct IVault.CollateralInfo storage ref"
                        }
                      },
                      "id": 47809,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "27783:24:38",
                      "memberName": "totalDepositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46282,
                      "src": "27747:60:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 47810,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47794,
                      "src": "27811:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "27747:71:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47812,
                  "nodeType": "ExpressionStatement",
                  "src": "27747:71:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47820,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "expression": {
                          "arguments": [
                            {
                              "id": 47815,
                              "name": "_collateralToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47788,
                              "src": "27841:16:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ERC20Token_$46438",
                                "typeString": "contract ERC20Token"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ERC20Token_$46438",
                                "typeString": "contract ERC20Token"
                              }
                            ],
                            "id": 47814,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "27833:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 47813,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "27833:7:38",
                              "typeDescriptions": {}
                            }
                          },
                          "id": 47816,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "27833:25:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "id": 47817,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "27859:4:38",
                        "memberName": "code",
                        "nodeType": "MemberAccess",
                        "src": "27833:30:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 47818,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27864:6:38",
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "27833:37:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 47819,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "27874:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "27833:42:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47824,
                  "nodeType": "IfStatement",
                  "src": "27829:56:38",
                  "trueBody": {
                    "expression": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 47821,
                        "name": "revert",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [-19, -19],
                        "referencedDeclaration": -19,
                        "src": "27877:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_revert_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 47822,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "27877:8:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 47823,
                    "nodeType": "ExpressionStatement",
                    "src": "27877:8:38"
                  }
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "id": 47830,
                            "name": "_collateralToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47788,
                            "src": "27932:16:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_ERC20Token_$46438",
                              "typeString": "contract ERC20Token"
                            }
                          ],
                          "id": 47829,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "27924:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 47828,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "27924:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 47831,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "27924:25:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47832,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47792,
                        "src": "27951:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47833,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47794,
                        "src": "27956:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 47825,
                        "name": "SafeTransferLib",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 44996,
                        "src": "27895:15:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_contract$_SafeTransferLib_$44996_$",
                          "typeString": "type(library SafeTransferLib)"
                        }
                      },
                      "id": 47827,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "27911:12:38",
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 44947,
                      "src": "27895:28:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,address,uint256)"
                      }
                    },
                    "id": 47834,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "27895:69:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47835,
                  "nodeType": "ExpressionStatement",
                  "src": "27895:69:38"
                }
              ]
            },
            "documentation": {
              "id": 47785,
              "nodeType": "StructuredDocumentation",
              "src": "27278:262:38",
              "text": " @dev withdraws collateral to `_to` and updates the vaults depositedCollateral and collateral's totalDepositedCollateral\n @dev reverts if `_amount` is greater than the vaults depositedCollateral\n      reverts if safeTransfer() fails"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawCollateral",
            "nameLocation": "27554:19:38",
            "parameters": {
              "id": 47795,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47788,
                  "mutability": "mutable",
                  "name": "_collateralToken",
                  "nameLocation": "27585:16:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47837,
                  "src": "27574:27:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20Token_$46438",
                    "typeString": "contract ERC20Token"
                  },
                  "typeName": {
                    "id": 47787,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47786,
                      "name": "ERC20Token",
                      "nameLocations": ["27574:10:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46438,
                      "src": "27574:10:38"
                    },
                    "referencedDeclaration": 46438,
                    "src": "27574:10:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_ERC20Token_$46438",
                      "typeString": "contract ERC20Token"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47790,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "27611:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47837,
                  "src": "27603:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47789,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "27603:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47792,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "27627:3:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47837,
                  "src": "27619:11:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47791,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "27619:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47794,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "27640:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47837,
                  "src": "27632:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47793,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "27632:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "27573:75:38"
            },
            "returnParameters": {
              "id": 47796,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "27658:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 47875,
            "nodeType": "FunctionDefinition",
            "src": "28155:306:38",
            "nodes": [],
            "body": {
              "id": 47874,
              "nodeType": "Block",
              "src": "28291:170:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 47855,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47851,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47844,
                        "src": "28301:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 47853,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "28308:14:38",
                      "memberName": "borrowedAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46304,
                      "src": "28301:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 47854,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47848,
                      "src": "28326:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "28301:32:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47856,
                  "nodeType": "ExpressionStatement",
                  "src": "28301:32:38"
                },
                {
                  "expression": {
                    "id": 47861,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47857,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47841,
                        "src": "28343:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 47859,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "28355:19:38",
                      "memberName": "totalBorrowedAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46284,
                      "src": "28343:31:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 47860,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47848,
                      "src": "28378:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "28343:42:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47862,
                  "nodeType": "ExpressionStatement",
                  "src": "28343:42:38"
                },
                {
                  "expression": {
                    "id": 47865,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 47863,
                      "name": "debt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46714,
                      "src": "28395:4:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 47864,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47848,
                      "src": "28403:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "28395:15:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47866,
                  "nodeType": "ExpressionStatement",
                  "src": "28395:15:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 47870,
                        "name": "_to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47846,
                        "src": "28441:3:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47871,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47848,
                        "src": "28446:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 47867,
                        "name": "CURRENCY_TOKEN",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46700,
                        "src": "28421:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Currency_$46042",
                          "typeString": "contract Currency"
                        }
                      },
                      "id": 47869,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "28436:4:38",
                      "memberName": "mint",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 45901,
                      "src": "28421:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,uint256) external returns (bool)"
                      }
                    },
                    "id": 47872,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "28421:33:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 47873,
                  "nodeType": "ExpressionStatement",
                  "src": "28421:33:38"
                }
              ]
            },
            "documentation": {
              "id": 47838,
              "nodeType": "StructuredDocumentation",
              "src": "27977:173:38",
              "text": " @dev mints currency to `_to` and updates the vaults borrowedAmount and collateral's totalBorrowedAmount\n @dev reverts if CURRENCY_TOKEN.mint() fails"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_mintCurrency",
            "nameLocation": "28164:13:38",
            "parameters": {
              "id": 47849,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47841,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "28201:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47875,
                  "src": "28178:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 47840,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47839,
                      "name": "CollateralInfo",
                      "nameLocations": ["28178:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "28178:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "28178:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47844,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "28232:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47875,
                  "src": "28214:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 47843,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47842,
                      "name": "VaultInfo",
                      "nameLocations": ["28214:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "28214:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "28214:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47846,
                  "mutability": "mutable",
                  "name": "_to",
                  "nameLocation": "28248:3:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47875,
                  "src": "28240:11:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47845,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "28240:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47848,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "28261:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47875,
                  "src": "28253:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47847,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "28253:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "28177:92:38"
            },
            "returnParameters": {
              "id": 47850,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "28291:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 47969,
            "nodeType": "FunctionDefinition",
            "src": "28961:1089:38",
            "nodes": [],
            "body": {
              "id": 47968,
              "nodeType": "Block",
              "src": "29149:901:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 47894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 47891,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47888,
                      "src": "29323:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<=",
                    "rightExpression": {
                      "expression": {
                        "id": 47892,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47882,
                        "src": "29334:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 47893,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "29341:14:38",
                      "memberName": "borrowedAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46304,
                      "src": "29334:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "29323:32:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "id": 47966,
                    "nodeType": "Block",
                    "src": "29605:439:38",
                    "statements": [
                      {
                        "assignments": [47925],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 47925,
                            "mutability": "mutable",
                            "name": "_cacheBorrowedAmount",
                            "nameLocation": "29627:20:38",
                            "nodeType": "VariableDeclaration",
                            "scope": 47966,
                            "src": "29619:28:38",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "typeName": {
                              "id": 47924,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "29619:7:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 47928,
                        "initialValue": {
                          "expression": {
                            "id": 47926,
                            "name": "_vault",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47882,
                            "src": "29650:6:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                              "typeString": "struct IVault.VaultInfo storage pointer"
                            }
                          },
                          "id": 47927,
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberLocation": "29657:14:38",
                          "memberName": "borrowedAmount",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 46304,
                          "src": "29650:21:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "VariableDeclarationStatement",
                        "src": "29619:52:38"
                      },
                      {
                        "expression": {
                          "id": 47933,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "id": 47929,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47882,
                              "src": "29686:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            },
                            "id": 47931,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "29693:14:38",
                            "memberName": "borrowedAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46304,
                            "src": "29686:21:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "=",
                          "rightHandSide": {
                            "hexValue": "30",
                            "id": 47932,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "29710:1:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_0_by_1",
                              "typeString": "int_const 0"
                            },
                            "value": "0"
                          },
                          "src": "29686:25:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47934,
                        "nodeType": "ExpressionStatement",
                        "src": "29686:25:38"
                      },
                      {
                        "expression": {
                          "id": 47939,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "id": 47935,
                              "name": "_collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47879,
                              "src": "29725:11:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                "typeString": "struct IVault.CollateralInfo storage pointer"
                              }
                            },
                            "id": 47937,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "29737:19:38",
                            "memberName": "totalBorrowedAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46284,
                            "src": "29725:31:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "id": 47938,
                            "name": "_cacheBorrowedAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47925,
                            "src": "29760:20:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29725:55:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47940,
                        "nodeType": "ExpressionStatement",
                        "src": "29725:55:38"
                      },
                      {
                        "expression": {
                          "id": 47943,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 47941,
                            "name": "debt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46714,
                            "src": "29794:4:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "id": 47942,
                            "name": "_cacheBorrowedAmount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47925,
                            "src": "29802:20:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29794:28:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47944,
                        "nodeType": "ExpressionStatement",
                        "src": "29794:28:38"
                      },
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "id": 47946,
                              "name": "_owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47884,
                              "src": "29857:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 47947,
                              "name": "_cacheBorrowedAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47925,
                              "src": "29865:20:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 47945,
                            "name": "CurrencyBurned",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46257,
                            "src": "29842:14:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 47948,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29842:44:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47949,
                        "nodeType": "EmitStatement",
                        "src": "29837:49:38"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 47953,
                              "name": "_from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47886,
                              "src": "29920:5:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 47954,
                              "name": "_cacheBorrowedAmount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47925,
                              "src": "29927:20:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "id": 47950,
                              "name": "CURRENCY_TOKEN",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46700,
                              "src": "29900:14:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Currency_$46042",
                                "typeString": "contract Currency"
                              }
                            },
                            "id": 47952,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "29915:4:38",
                            "memberName": "burn",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 45932,
                            "src": "29900:19:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 47955,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29900:48:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 47956,
                        "nodeType": "ExpressionStatement",
                        "src": "29900:48:38"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 47958,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47882,
                              "src": "29979:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            },
                            {
                              "id": 47959,
                              "name": "_owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47884,
                              "src": "29987:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 47960,
                              "name": "_from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47886,
                              "src": "29995:5:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 47963,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "id": 47961,
                                "name": "_amount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47888,
                                "src": "30002:7:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": "-",
                              "rightExpression": {
                                "id": 47962,
                                "name": "_cacheBorrowedAmount",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 47925,
                                "src": "30012:20:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "src": "30002:30:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 47957,
                            "name": "_payAccruedFees",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 48009,
                            "src": "29963:15:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_struct$_VaultInfo_$46309_storage_ptr_$_t_address_$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (struct IVault.VaultInfo storage pointer,address,address,uint256)"
                            }
                          },
                          "id": 47964,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29963:70:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47965,
                        "nodeType": "ExpressionStatement",
                        "src": "29963:70:38"
                      }
                    ]
                  },
                  "id": 47967,
                  "nodeType": "IfStatement",
                  "src": "29319:725:38",
                  "trueBody": {
                    "id": 47923,
                    "nodeType": "Block",
                    "src": "29357:242:38",
                    "statements": [
                      {
                        "expression": {
                          "id": 47899,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "id": 47895,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47882,
                              "src": "29371:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            },
                            "id": 47897,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "29378:14:38",
                            "memberName": "borrowedAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46304,
                            "src": "29371:21:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "id": 47898,
                            "name": "_amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47888,
                            "src": "29396:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29371:32:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47900,
                        "nodeType": "ExpressionStatement",
                        "src": "29371:32:38"
                      },
                      {
                        "expression": {
                          "id": 47905,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "expression": {
                              "id": 47901,
                              "name": "_collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47879,
                              "src": "29417:11:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                "typeString": "struct IVault.CollateralInfo storage pointer"
                              }
                            },
                            "id": 47903,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": true,
                            "memberLocation": "29429:19:38",
                            "memberName": "totalBorrowedAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46284,
                            "src": "29417:31:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "id": 47904,
                            "name": "_amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47888,
                            "src": "29452:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29417:42:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47906,
                        "nodeType": "ExpressionStatement",
                        "src": "29417:42:38"
                      },
                      {
                        "expression": {
                          "id": 47909,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftHandSide": {
                            "id": 47907,
                            "name": "debt",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46714,
                            "src": "29473:4:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "Assignment",
                          "operator": "-=",
                          "rightHandSide": {
                            "id": 47908,
                            "name": "_amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 47888,
                            "src": "29481:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "29473:15:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 47910,
                        "nodeType": "ExpressionStatement",
                        "src": "29473:15:38"
                      },
                      {
                        "eventCall": {
                          "arguments": [
                            {
                              "id": 47912,
                              "name": "_owner",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47884,
                              "src": "29523:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 47913,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47888,
                              "src": "29531:7:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 47911,
                            "name": "CurrencyBurned",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46257,
                            "src": "29508:14:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                              "typeString": "function (address,uint256)"
                            }
                          },
                          "id": 47914,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29508:31:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 47915,
                        "nodeType": "EmitStatement",
                        "src": "29503:36:38"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 47919,
                              "name": "_from",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47886,
                              "src": "29573:5:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "id": 47920,
                              "name": "_amount",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 47888,
                              "src": "29580:7:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "id": 47916,
                              "name": "CURRENCY_TOKEN",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46700,
                              "src": "29553:14:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_Currency_$46042",
                                "typeString": "contract Currency"
                              }
                            },
                            "id": 47918,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "29568:4:38",
                            "memberName": "burn",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 45932,
                            "src": "29553:19:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                              "typeString": "function (address,uint256) external returns (bool)"
                            }
                          },
                          "id": 47921,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "nameLocations": [],
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "29553:35:38",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "id": 47922,
                        "nodeType": "ExpressionStatement",
                        "src": "29553:35:38"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 47876,
              "nodeType": "StructuredDocumentation",
              "src": "28467:489:38",
              "text": " @dev burns currency from `_from` or/and tranfers currency from `_from` to this contract\n @dev if `_amount` > the vaults borrowed amount, the rest is used to pay accrued fees (if it is too big for that too, it reverts). else it's only used to pay the borrowed amount\n @dev borrowed amount paid back is burnt while accrued fees paid back is sent to this contract\n @dev reverts if CURRENCY_TOKEN.burn() fails\n      reverts if _payAccruedFees() fails"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_burnCurrency",
            "nameLocation": "28970:13:38",
            "parameters": {
              "id": 47889,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47879,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "29016:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47969,
                  "src": "28993:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 47878,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47877,
                      "name": "CollateralInfo",
                      "nameLocations": ["28993:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "28993:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "28993:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47882,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "29055:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47969,
                  "src": "29037:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 47881,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47880,
                      "name": "VaultInfo",
                      "nameLocations": ["29037:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "29037:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "29037:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47884,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "29079:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47969,
                  "src": "29071:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47883,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "29071:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47886,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "29103:5:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47969,
                  "src": "29095:13:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47885,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "29095:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47888,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "29126:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 47969,
                  "src": "29118:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47887,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "29118:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "28983:156:38"
            },
            "returnParameters": {
              "id": 47890,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "29149:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 48009,
            "nodeType": "FunctionDefinition",
            "src": "30407:292:38",
            "nodes": [],
            "body": {
              "id": 48008,
              "nodeType": "Block",
              "src": "30515:184:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "id": 47986,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 47982,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47973,
                        "src": "30525:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 47984,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "30532:11:38",
                      "memberName": "accruedFees",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46306,
                      "src": "30525:18:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "-=",
                    "rightHandSide": {
                      "id": 47985,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47979,
                      "src": "30547:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "30525:29:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47987,
                  "nodeType": "ExpressionStatement",
                  "src": "30525:29:38"
                },
                {
                  "expression": {
                    "id": 47990,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 47988,
                      "name": "paidFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46716,
                      "src": "30564:8:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 47989,
                      "name": "_amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 47979,
                      "src": "30576:7:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "30564:19:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 47991,
                  "nodeType": "ExpressionStatement",
                  "src": "30564:19:38"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 47993,
                        "name": "_owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47975,
                        "src": "30608:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 47994,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47979,
                        "src": "30616:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 47992,
                      "name": "FeesPaid",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46263,
                      "src": "30599:8:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 47995,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "30599:25:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 47996,
                  "nodeType": "EmitStatement",
                  "src": "30594:30:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 48000,
                        "name": "_from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47977,
                        "src": "30662:5:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "arguments": [
                          {
                            "id": 48003,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "30677:4:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_Vault_$48280",
                              "typeString": "contract Vault"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_Vault_$48280",
                              "typeString": "contract Vault"
                            }
                          ],
                          "id": 48002,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "30669:7:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 48001,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "30669:7:38",
                            "typeDescriptions": {}
                          }
                        },
                        "id": 48004,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "30669:13:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 48005,
                        "name": "_amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 47979,
                        "src": "30684:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "id": 47997,
                        "name": "CURRENCY_TOKEN",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46700,
                        "src": "30634:14:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_Currency_$46042",
                          "typeString": "contract Currency"
                        }
                      },
                      "id": 47999,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "30649:12:38",
                      "memberName": "transferFrom",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 44584,
                      "src": "30634:27:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                        "typeString": "function (address,address,uint256) external returns (bool)"
                      }
                    },
                    "id": 48006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "30634:58:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48007,
                  "nodeType": "ExpressionStatement",
                  "src": "30634:58:38"
                }
              ]
            },
            "documentation": {
              "id": 47970,
              "nodeType": "StructuredDocumentation",
              "src": "30056:346:38",
              "text": " @dev used to move `_amount` of accrued fees from accruedFees vault and global variables to the vault's and collateral's paidFees variables and then transfer the fee from the user to this contract\n @dev reverts if `_amount` is greater than the vault's accruedFees\n      reverts if CURRENCY_TOKEN.transferFrom() fails"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_payAccruedFees",
            "nameLocation": "30416:15:38",
            "parameters": {
              "id": 47980,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 47973,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "30450:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48009,
                  "src": "30432:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 47972,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 47971,
                      "name": "VaultInfo",
                      "nameLocations": ["30432:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "30432:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "30432:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47975,
                  "mutability": "mutable",
                  "name": "_owner",
                  "nameLocation": "30466:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48009,
                  "src": "30458:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47974,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "30458:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47977,
                  "mutability": "mutable",
                  "name": "_from",
                  "nameLocation": "30482:5:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48009,
                  "src": "30474:13:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 47976,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "30474:7:38",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 47979,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "30497:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48009,
                  "src": "30489:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 47978,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "30489:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "30431:74:38"
            },
            "returnParameters": {
              "id": 47981,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "30515:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "id": 48046,
            "nodeType": "FunctionDefinition",
            "src": "30857:449:38",
            "nodes": [],
            "body": {
              "id": 48045,
              "nodeType": "Block",
              "src": "30948:358:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [48020, 48022],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 48020,
                      "mutability": "mutable",
                      "name": "_accruedFees",
                      "nameLocation": "30967:12:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48045,
                      "src": "30959:20:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48019,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "30959:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 48022,
                      "mutability": "mutable",
                      "name": "_currentTotalAccumulatedRate",
                      "nameLocation": "30989:28:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48045,
                      "src": "30981:36:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48021,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "30981:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 48027,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 48024,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48013,
                        "src": "31043:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 48025,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48016,
                        "src": "31056:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 48023,
                      "name": "_calculateAccruedFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48201,
                      "src": "31021:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$_t_uint256_$_t_uint256_$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view returns (uint256,uint256)"
                      }
                    },
                    "id": 48026,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "31021:42:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                      "typeString": "tuple(uint256,uint256)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "30958:105:38"
                },
                {
                  "expression": {
                    "id": 48032,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 48028,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48016,
                        "src": "31073:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 48030,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "31080:24:38",
                      "memberName": "lastTotalAccumulatedRate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46308,
                      "src": "31073:31:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 48031,
                      "name": "_currentTotalAccumulatedRate",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48022,
                      "src": "31107:28:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "31073:62:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 48033,
                  "nodeType": "ExpressionStatement",
                  "src": "31073:62:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48036,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 48034,
                      "name": "_accruedFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48020,
                      "src": "31229:12:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 48035,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "31245:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "31229:17:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48038,
                  "nodeType": "IfStatement",
                  "src": "31225:30:38",
                  "trueBody": {
                    "functionReturnParameters": 48018,
                    "id": 48037,
                    "nodeType": "Return",
                    "src": "31248:7:38"
                  }
                },
                {
                  "expression": {
                    "id": 48043,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "expression": {
                        "id": 48039,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48016,
                        "src": "31265:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 48041,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "memberLocation": "31272:11:38",
                      "memberName": "accruedFees",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46306,
                      "src": "31265:18:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "+=",
                    "rightHandSide": {
                      "id": 48042,
                      "name": "_accruedFees",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48020,
                      "src": "31287:12:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "31265:34:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 48044,
                  "nodeType": "ExpressionStatement",
                  "src": "31265:34:38"
                }
              ]
            },
            "documentation": {
              "id": 48010,
              "nodeType": "StructuredDocumentation",
              "src": "30705:147:38",
              "text": " @dev increments accrued fees of a vault by it's accrued fees since it's`_vault.lastUpdateTime`.\n @dev should never revert!"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_accrueFees",
            "nameLocation": "30866:11:38",
            "parameters": {
              "id": 48017,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48013,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "30901:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48046,
                  "src": "30878:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48012,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48011,
                      "name": "CollateralInfo",
                      "nameLocations": ["30878:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "30878:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "30878:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48016,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "30932:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48046,
                  "src": "30914:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 48015,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48014,
                      "name": "VaultInfo",
                      "nameLocations": ["30914:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "30914:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "30914:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "30877:62:38"
            },
            "returnParameters": {
              "id": 48018,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "30948:0:38"
            },
            "scope": 48280,
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48099,
            "nodeType": "FunctionDefinition",
            "src": "31455:1193:38",
            "nodes": [],
            "body": {
              "id": 48098,
              "nodeType": "Block",
              "src": "31605:1043:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [48059],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 48059,
                      "mutability": "mutable",
                      "name": "_totalUserDebt",
                      "nameLocation": "31923:14:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48098,
                      "src": "31915:22:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48058,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "31915:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 48065,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48064,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 48060,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48053,
                        "src": "31940:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 48061,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "31947:14:38",
                      "memberName": "borrowedAmount",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46304,
                      "src": "31940:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "+",
                    "rightExpression": {
                      "expression": {
                        "id": 48062,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48053,
                        "src": "31964:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 48063,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "31971:11:38",
                      "memberName": "accruedFees",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46306,
                      "src": "31964:18:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "31940:42:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "31915:67:38"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48068,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 48066,
                      "name": "_totalUserDebt",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48059,
                      "src": "32036:14:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 48067,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "32054:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "32036:19:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48071,
                  "nodeType": "IfStatement",
                  "src": "32032:33:38",
                  "trueBody": {
                    "expression": {
                      "hexValue": "30",
                      "id": 48069,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "32064:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "functionReturnParameters": 48057,
                    "id": 48070,
                    "nodeType": "Return",
                    "src": "32057:8:38"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48075,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 48072,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48053,
                        "src": "32234:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      },
                      "id": 48073,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "32241:19:38",
                      "memberName": "depositedCollateral",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46302,
                      "src": "32234:26:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 48074,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "32264:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "32234:31:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48082,
                  "nodeType": "IfStatement",
                  "src": "32230:61:38",
                  "trueBody": {
                    "expression": {
                      "expression": {
                        "arguments": [
                          {
                            "id": 48078,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "32279:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            },
                            "typeName": {
                              "id": 48077,
                              "name": "uint256",
                              "nodeType": "ElementaryTypeName",
                              "src": "32279:7:38",
                              "typeDescriptions": {}
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_type$_t_uint256_$",
                              "typeString": "type(uint256)"
                            }
                          ],
                          "id": 48076,
                          "name": "type",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -27,
                          "src": "32274:4:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_metatype_pure$__$returns$__$",
                            "typeString": "function () pure"
                          }
                        },
                        "id": 48079,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "32274:13:38",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_meta_type_t_uint256",
                          "typeString": "type(uint256)"
                        }
                      },
                      "id": 48080,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberLocation": "32288:3:38",
                      "memberName": "max",
                      "nodeType": "MemberAccess",
                      "src": "32274:17:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "functionReturnParameters": 48057,
                    "id": 48081,
                    "nodeType": "Return",
                    "src": "32267:24:38"
                  }
                },
                {
                  "assignments": [48084],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 48084,
                      "mutability": "mutable",
                      "name": "_collateralValueInCurrency",
                      "nameLocation": "32424:26:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48098,
                      "src": "32416:34:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48083,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "32416:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 48089,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 48086,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48050,
                        "src": "32483:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      {
                        "id": 48087,
                        "name": "_vault",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48053,
                        "src": "32496:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        },
                        {
                          "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                          "typeString": "struct IVault.VaultInfo storage pointer"
                        }
                      ],
                      "id": 48085,
                      "name": "_getCurrencyValueOfCollateral",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48130,
                      "src": "32453:29:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$_t_uint256_$",
                        "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view returns (uint256)"
                      }
                    },
                    "id": 48088,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "32453:50:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "32416:87:38"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "components": [
                          {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 48093,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "id": 48091,
                              "name": "_totalUserDebt",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 48059,
                              "src": "32576:14:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "*",
                            "rightExpression": {
                              "id": 48092,
                              "name": "HUNDRED_PERCENTAGE",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46694,
                              "src": "32593:18:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "32576:35:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "id": 48094,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "32575:37:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 48095,
                        "name": "_collateralValueInCurrency",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48084,
                        "src": "32614:26:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 48090,
                      "name": "_divUp",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48279,
                      "src": "32568:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 48096,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "32568:73:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 48057,
                  "id": 48097,
                  "nodeType": "Return",
                  "src": "32561:80:38"
                }
              ]
            },
            "documentation": {
              "id": 48047,
              "nodeType": "StructuredDocumentation",
              "src": "31312:138:38",
              "text": " @dev returns the collateral ratio of a vault where anything below 1e18 is liquidatable\n @dev should never revert!"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getCollateralRatio",
            "nameLocation": "31464:19:38",
            "parameters": {
              "id": 48054,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48050,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "31507:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48099,
                  "src": "31484:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48049,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48048,
                      "name": "CollateralInfo",
                      "nameLocations": ["31484:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "31484:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "31484:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48053,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "31538:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48099,
                  "src": "31520:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 48052,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48051,
                      "name": "VaultInfo",
                      "nameLocations": ["31520:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "31520:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "31520:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "31483:62:38"
            },
            "returnParameters": {
              "id": 48057,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48056,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 48099,
                  "src": "31592:7:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48055,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "31592:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "31591:9:38"
            },
            "scope": 48280,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48130,
            "nodeType": "FunctionDefinition",
            "src": "32795:433:38",
            "nodes": [],
            "body": {
              "id": 48129,
              "nodeType": "Block",
              "src": "32955:273:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [48112],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 48112,
                      "mutability": "mutable",
                      "name": "_currencyValueOfCollateral",
                      "nameLocation": "32973:26:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48129,
                      "src": "32965:34:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48111,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "32965:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 48126,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48125,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 48122,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 48120,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "arguments": [
                                {
                                  "id": 48114,
                                  "name": "_collateral",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 48103,
                                  "src": "33052:11:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                    "typeString": "struct IVault.CollateralInfo storage pointer"
                                  }
                                },
                                {
                                  "expression": {
                                    "id": 48115,
                                    "name": "_vault",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 48106,
                                    "src": "33065:6:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                      "typeString": "struct IVault.VaultInfo storage pointer"
                                    }
                                  },
                                  "id": 48116,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "33072:19:38",
                                  "memberName": "depositedCollateral",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 46302,
                                  "src": "33065:26:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                    "typeString": "struct IVault.CollateralInfo storage pointer"
                                  },
                                  {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                ],
                                "id": 48113,
                                "name": "_scaleCollateralToExpectedPrecision",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 48221,
                                "src": "33016:35:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_uint256_$returns$_t_uint256_$",
                                  "typeString": "function (struct IVault.CollateralInfo storage pointer,uint256) view returns (uint256)"
                                }
                              },
                              "id": 48117,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "nameLocations": [],
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "33016:76:38",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "*",
                            "rightExpression": {
                              "expression": {
                                "id": 48118,
                                "name": "_collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 48103,
                                "src": "33095:11:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                  "typeString": "struct IVault.CollateralInfo storage pointer"
                                }
                              },
                              "id": 48119,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "33107:5:38",
                              "memberName": "price",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46293,
                              "src": "33095:17:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "33016:96:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "id": 48121,
                            "name": "ADDITIONAL_FEED_PRECISION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46697,
                            "src": "33131:25:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33016:140:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 48123,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "33002:164:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "/",
                    "rightExpression": {
                      "id": 48124,
                      "name": "PRECISION",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46686,
                      "src": "33169:9:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "33002:176:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "32965:213:38"
                },
                {
                  "expression": {
                    "id": 48127,
                    "name": "_currencyValueOfCollateral",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 48112,
                    "src": "33195:26:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 48110,
                  "id": 48128,
                  "nodeType": "Return",
                  "src": "33188:33:38"
                }
              ]
            },
            "documentation": {
              "id": 48100,
              "nodeType": "StructuredDocumentation",
              "src": "32654:136:38",
              "text": " @dev returns the conversion of a vaults deposited collateral to the vault's currency\n @dev should never revert!"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getCurrencyValueOfCollateral",
            "nameLocation": "32804:29:38",
            "parameters": {
              "id": 48107,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48103,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "32857:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48130,
                  "src": "32834:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48102,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48101,
                      "name": "CollateralInfo",
                      "nameLocations": ["32834:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "32834:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "32834:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48106,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "32888:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48130,
                  "src": "32870:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 48105,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48104,
                      "name": "VaultInfo",
                      "nameLocations": ["32870:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "32870:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "32870:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "32833:62:38"
            },
            "returnParameters": {
              "id": 48110,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48109,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 48130,
                  "src": "32942:7:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48108,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "32942:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "32941:9:38"
            },
            "scope": 48280,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48159,
            "nodeType": "FunctionDefinition",
            "src": "33375:318:38",
            "nodes": [],
            "body": {
              "id": 48158,
              "nodeType": "Block",
              "src": "33534:159:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48156,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 48143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 48141,
                            "name": "_amount",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 48136,
                            "src": "33552:7:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "id": 48142,
                            "name": "PRECISION",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 46686,
                            "src": "33562:9:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33552:19:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 48144,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "33551:21:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "/",
                    "rightExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 48154,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 48148,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "expression": {
                                "id": 48145,
                                "name": "_collateral",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 48134,
                                "src": "33588:11:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                  "typeString": "struct IVault.CollateralInfo storage pointer"
                                }
                              },
                              "id": 48146,
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberLocation": "33600:5:38",
                              "memberName": "price",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 46293,
                              "src": "33588:17:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "*",
                            "rightExpression": {
                              "id": 48147,
                              "name": "ADDITIONAL_FEED_PRECISION",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 46697,
                              "src": "33608:25:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "33588:45:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "components": [
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 48152,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "hexValue": "3130",
                                  "id": 48149,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "33637:2:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_10_by_1",
                                    "typeString": "int_const 10"
                                  },
                                  "value": "10"
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "**",
                                "rightExpression": {
                                  "expression": {
                                    "id": 48150,
                                    "name": "_collateral",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 48134,
                                    "src": "33643:11:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                      "typeString": "struct IVault.CollateralInfo storage pointer"
                                    }
                                  },
                                  "id": 48151,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "33655:29:38",
                                  "memberName": "additionalCollateralPrecision",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 46299,
                                  "src": "33643:41:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "33637:47:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 48153,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "33636:49:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "33588:97:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 48155,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "33587:99:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "33551:135:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 48140,
                  "id": 48157,
                  "nodeType": "Return",
                  "src": "33544:142:38"
                }
              ]
            },
            "documentation": {
              "id": 48131,
              "nodeType": "StructuredDocumentation",
              "src": "33234:136:38",
              "text": " @dev returns the conversion of an amount of currency to a given supported collateral\n @dev should never revert!"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_getCollateralAmountFromCurrencyValue",
            "nameLocation": "33384:37:38",
            "parameters": {
              "id": 48137,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48134,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "33445:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48159,
                  "src": "33422:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48133,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48132,
                      "name": "CollateralInfo",
                      "nameLocations": ["33422:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "33422:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "33422:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48136,
                  "mutability": "mutable",
                  "name": "_amount",
                  "nameLocation": "33466:7:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48159,
                  "src": "33458:15:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48135,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33458:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "33421:53:38"
            },
            "returnParameters": {
              "id": 48140,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48139,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 48159,
                  "src": "33521:7:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48138,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33521:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "33520:9:38"
            },
            "scope": 48280,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48201,
            "nodeType": "FunctionDefinition",
            "src": "33833:541:38",
            "nodes": [],
            "body": {
              "id": 48200,
              "nodeType": "Block",
              "src": "33994:380:38",
              "nodes": [],
              "statements": [
                {
                  "assignments": [48174],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 48174,
                      "mutability": "mutable",
                      "name": "_totalCurrentAccumulatedRate",
                      "nameLocation": "34012:28:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48200,
                      "src": "34004:36:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48173,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "34004:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 48181,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 48177,
                        "name": "baseRateInfo",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46710,
                        "src": "34103:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      },
                      {
                        "expression": {
                          "id": 48178,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 48163,
                          "src": "34117:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        "id": 48179,
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberLocation": "34129:8:38",
                        "memberName": "rateInfo",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 46291,
                        "src": "34117:20:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        },
                        {
                          "typeIdentifier": "t_struct$_RateInfo_$46280_storage",
                          "typeString": "struct IVault.RateInfo storage ref"
                        }
                      ],
                      "expression": {
                        "id": 48175,
                        "name": "rateModule",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46707,
                        "src": "34055:10:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IRate_$46191",
                          "typeString": "contract IRate"
                        }
                      },
                      "id": 48176,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "34066:36:38",
                      "memberName": "calculateCurrentTotalAccumulatedRate",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46182,
                      "src": "34055:47:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_struct$_RateInfo_$46280_memory_ptr_$_t_struct$_RateInfo_$46280_memory_ptr_$returns$_t_uint256_$",
                        "typeString": "function (struct IVault.RateInfo memory,struct IVault.RateInfo memory) view external returns (uint256)"
                      }
                    },
                    "id": 48180,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "34055:83:38",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "34004:134:38"
                },
                {
                  "assignments": [48183],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 48183,
                      "mutability": "mutable",
                      "name": "_accruedFees",
                      "nameLocation": "34157:12:38",
                      "nodeType": "VariableDeclaration",
                      "scope": 48200,
                      "src": "34149:20:38",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 48182,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "34149:7:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 48195,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48194,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 48191,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "components": [
                              {
                                "commonType": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                },
                                "id": 48187,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "leftExpression": {
                                  "id": 48184,
                                  "name": "_totalCurrentAccumulatedRate",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 48174,
                                  "src": "34187:28:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "nodeType": "BinaryOperation",
                                "operator": "-",
                                "rightExpression": {
                                  "expression": {
                                    "id": 48185,
                                    "name": "_vault",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 48166,
                                    "src": "34218:6:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                      "typeString": "struct IVault.VaultInfo storage pointer"
                                    }
                                  },
                                  "id": 48186,
                                  "isConstant": false,
                                  "isLValue": true,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberLocation": "34225:24:38",
                                  "memberName": "lastTotalAccumulatedRate",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 46308,
                                  "src": "34218:31:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                },
                                "src": "34187:62:38",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "id": 48188,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "34186:64:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "*",
                          "rightExpression": {
                            "expression": {
                              "id": 48189,
                              "name": "_vault",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 48166,
                              "src": "34253:6:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                                "typeString": "struct IVault.VaultInfo storage pointer"
                              }
                            },
                            "id": 48190,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "34260:14:38",
                            "memberName": "borrowedAmount",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46304,
                            "src": "34253:21:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "34186:88:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 48192,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "34172:112:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "/",
                    "rightExpression": {
                      "id": 48193,
                      "name": "HUNDRED_PERCENTAGE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 46694,
                      "src": "34287:18:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "34172:133:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "34149:156:38"
                },
                {
                  "expression": {
                    "components": [
                      {
                        "id": 48196,
                        "name": "_accruedFees",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48183,
                        "src": "34324:12:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "id": 48197,
                        "name": "_totalCurrentAccumulatedRate",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48174,
                        "src": "34338:28:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "id": 48198,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "34323:44:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_uint256_$_t_uint256_$",
                      "typeString": "tuple(uint256,uint256)"
                    }
                  },
                  "functionReturnParameters": 48172,
                  "id": 48199,
                  "nodeType": "Return",
                  "src": "34316:51:38"
                }
              ]
            },
            "documentation": {
              "id": 48160,
              "nodeType": "StructuredDocumentation",
              "src": "33699:129:38",
              "text": " @dev returns the fees accrued by a user's vault since `_vault.lastUpdateTime`\n @dev should never revert!"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_calculateAccruedFees",
            "nameLocation": "33842:21:38",
            "parameters": {
              "id": 48167,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48163,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "33887:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48201,
                  "src": "33864:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48162,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48161,
                      "name": "CollateralInfo",
                      "nameLocations": ["33864:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "33864:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "33864:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48166,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "33918:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48201,
                  "src": "33900:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 48165,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48164,
                      "name": "VaultInfo",
                      "nameLocations": ["33900:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "33900:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "33900:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "33863:62:38"
            },
            "returnParameters": {
              "id": 48172,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48169,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 48201,
                  "src": "33972:7:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48168,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33972:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48171,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 48201,
                  "src": "33981:7:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48170,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "33981:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "33971:18:38"
            },
            "scope": 48280,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48221,
            "nodeType": "FunctionDefinition",
            "src": "34493:238:38",
            "nodes": [],
            "body": {
              "id": 48220,
              "nodeType": "Block",
              "src": "34649:82:38",
              "nodes": [],
              "statements": [
                {
                  "expression": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48218,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 48212,
                      "name": "amount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48207,
                      "src": "34666:6:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "*",
                    "rightExpression": {
                      "components": [
                        {
                          "commonType": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          },
                          "id": 48216,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "hexValue": "3130",
                            "id": 48213,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "number",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "34676:2:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_rational_10_by_1",
                              "typeString": "int_const 10"
                            },
                            "value": "10"
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "**",
                          "rightExpression": {
                            "expression": {
                              "id": 48214,
                              "name": "_collateral",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 48205,
                              "src": "34682:11:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                                "typeString": "struct IVault.CollateralInfo storage pointer"
                              }
                            },
                            "id": 48215,
                            "isConstant": false,
                            "isLValue": true,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberLocation": "34694:29:38",
                            "memberName": "additionalCollateralPrecision",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 46299,
                            "src": "34682:41:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "src": "34676:47:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "id": 48217,
                      "isConstant": false,
                      "isInlineArray": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "TupleExpression",
                      "src": "34675:49:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "34666:58:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 48211,
                  "id": 48219,
                  "nodeType": "Return",
                  "src": "34659:65:38"
                }
              ]
            },
            "documentation": {
              "id": 48202,
              "nodeType": "StructuredDocumentation",
              "src": "34380:108:38",
              "text": " @dev scales a given collateral to be represented in 1e18\n @dev should never revert!"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_scaleCollateralToExpectedPrecision",
            "nameLocation": "34502:35:38",
            "parameters": {
              "id": 48208,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48205,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "34561:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48221,
                  "src": "34538:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48204,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48203,
                      "name": "CollateralInfo",
                      "nameLocations": ["34538:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "34538:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "34538:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48207,
                  "mutability": "mutable",
                  "name": "amount",
                  "nameLocation": "34582:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48221,
                  "src": "34574:14:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48206,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34574:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "34537:52:38"
            },
            "returnParameters": {
              "id": 48211,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48210,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 48221,
                  "src": "34636:7:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48209,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "34636:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "34635:9:38"
            },
            "scope": 48280,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48243,
            "nodeType": "FunctionDefinition",
            "src": "34832:283:38",
            "nodes": [],
            "body": {
              "id": 48242,
              "nodeType": "Block",
              "src": "34990:125:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48237,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 48232,
                          "name": "_collateral",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 48225,
                          "src": "35024:11:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          }
                        },
                        {
                          "id": 48233,
                          "name": "_vault",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 48228,
                          "src": "35037:6:38",
                          "typeDescriptions": {
                            "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                            "typeString": "struct IVault.VaultInfo storage pointer"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                            "typeString": "struct IVault.CollateralInfo storage pointer"
                          },
                          {
                            "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                            "typeString": "struct IVault.VaultInfo storage pointer"
                          }
                        ],
                        "id": 48231,
                        "name": "_getCollateralRatio",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48099,
                        "src": "35004:19:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_struct$_CollateralInfo_$46300_storage_ptr_$_t_struct$_VaultInfo_$46309_storage_ptr_$returns$_t_uint256_$",
                          "typeString": "function (struct IVault.CollateralInfo storage pointer,struct IVault.VaultInfo storage pointer) view returns (uint256)"
                        }
                      },
                      "id": 48234,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "35004:40:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "expression": {
                        "id": 48235,
                        "name": "_collateral",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 48225,
                        "src": "35047:11:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                          "typeString": "struct IVault.CollateralInfo storage pointer"
                        }
                      },
                      "id": 48236,
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "35059:20:38",
                      "memberName": "liquidationThreshold",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 46286,
                      "src": "35047:32:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35004:75:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48241,
                  "nodeType": "IfStatement",
                  "src": "35000:108:38",
                  "trueBody": {
                    "errorCall": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 48238,
                        "name": "BadCollateralRatio",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 46199,
                        "src": "35088:18:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_error_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 48239,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "35088:20:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 48240,
                    "nodeType": "RevertStatement",
                    "src": "35081:27:38"
                  }
                }
              ]
            },
            "documentation": {
              "id": 48222,
              "nodeType": "StructuredDocumentation",
              "src": "34737:90:38",
              "text": " @dev reverts if the collateral ratio is above the liquidation threshold"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_revertIfCollateralRatioIsAboveLiquidationThreshold",
            "nameLocation": "34841:51:38",
            "parameters": {
              "id": 48229,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48225,
                  "mutability": "mutable",
                  "name": "_collateral",
                  "nameLocation": "34925:11:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48243,
                  "src": "34902:34:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                    "typeString": "struct IVault.CollateralInfo"
                  },
                  "typeName": {
                    "id": 48224,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48223,
                      "name": "CollateralInfo",
                      "nameLocations": ["34902:14:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46300,
                      "src": "34902:14:38"
                    },
                    "referencedDeclaration": 46300,
                    "src": "34902:14:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_CollateralInfo_$46300_storage_ptr",
                      "typeString": "struct IVault.CollateralInfo"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48228,
                  "mutability": "mutable",
                  "name": "_vault",
                  "nameLocation": "34964:6:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48243,
                  "src": "34946:24:38",
                  "stateVariable": false,
                  "storageLocation": "storage",
                  "typeDescriptions": {
                    "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                    "typeString": "struct IVault.VaultInfo"
                  },
                  "typeName": {
                    "id": 48227,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 48226,
                      "name": "VaultInfo",
                      "nameLocations": ["34946:9:38"],
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 46309,
                      "src": "34946:9:38"
                    },
                    "referencedDeclaration": 46309,
                    "src": "34946:9:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_struct$_VaultInfo_$46309_storage_ptr",
                      "typeString": "struct IVault.VaultInfo"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "34892:84:38"
            },
            "returnParameters": {
              "id": 48230,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "34990:0:38"
            },
            "scope": 48280,
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "id": 48279,
            "nodeType": "FunctionDefinition",
            "src": "35374:178:38",
            "nodes": [],
            "body": {
              "id": 48278,
              "nodeType": "Block",
              "src": "35448:104:38",
              "nodes": [],
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48255,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 48253,
                      "name": "_b",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48248,
                      "src": "35462:2:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 48254,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "35468:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "35462:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48259,
                  "nodeType": "IfStatement",
                  "src": "35458:21:38",
                  "trueBody": {
                    "expression": {
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 48256,
                        "name": "revert",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [-19, -19],
                        "referencedDeclaration": -19,
                        "src": "35471:6:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_revert_pure$__$returns$__$",
                          "typeString": "function () pure"
                        }
                      },
                      "id": 48257,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "nameLocations": [],
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "35471:8:38",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_tuple$__$",
                        "typeString": "tuple()"
                      }
                    },
                    "id": 48258,
                    "nodeType": "ExpressionStatement",
                    "src": "35471:8:38"
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 48262,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 48260,
                      "name": "_a",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48246,
                      "src": "35493:2:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "30",
                      "id": 48261,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "35499:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "35493:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 48265,
                  "nodeType": "IfStatement",
                  "src": "35489:21:38",
                  "trueBody": {
                    "expression": {
                      "hexValue": "30",
                      "id": 48263,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "35509:1:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "functionReturnParameters": 48252,
                    "id": 48264,
                    "nodeType": "Return",
                    "src": "35502:8:38"
                  }
                },
                {
                  "expression": {
                    "id": 48276,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 48266,
                      "name": "_c",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 48251,
                      "src": "35521:2:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 48275,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "hexValue": "31",
                        "id": 48267,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "35526:1:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_1_by_1",
                          "typeString": "int_const 1"
                        },
                        "value": "1"
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "+",
                      "rightExpression": {
                        "components": [
                          {
                            "commonType": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            },
                            "id": 48273,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "components": [
                                {
                                  "commonType": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  },
                                  "id": 48270,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "leftExpression": {
                                    "id": 48268,
                                    "name": "_a",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 48246,
                                    "src": "35532:2:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "nodeType": "BinaryOperation",
                                  "operator": "-",
                                  "rightExpression": {
                                    "hexValue": "31",
                                    "id": 48269,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "35537:1:38",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_1_by_1",
                                      "typeString": "int_const 1"
                                    },
                                    "value": "1"
                                  },
                                  "src": "35532:6:38",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_uint256",
                                    "typeString": "uint256"
                                  }
                                }
                              ],
                              "id": 48271,
                              "isConstant": false,
                              "isInlineArray": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "TupleExpression",
                              "src": "35531:8:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "/",
                            "rightExpression": {
                              "id": 48272,
                              "name": "_b",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 48248,
                              "src": "35542:2:38",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "src": "35531:13:38",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "id": 48274,
                        "isConstant": false,
                        "isInlineArray": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "TupleExpression",
                        "src": "35530:15:38",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "src": "35526:19:38",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "35521:24:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 48277,
                  "nodeType": "ExpressionStatement",
                  "src": "35521:24:38"
                }
              ]
            },
            "documentation": {
              "id": 48244,
              "nodeType": "StructuredDocumentation",
              "src": "35121:248:38",
              "text": " @dev divides `_a` by `_b` and rounds the result `_c` up to the next whole number\n @dev if `_a` is 0, return 0 early as it will revert with underflow error when calculating divUp below\n @dev reverts if `_b` is 0"
            },
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_divUp",
            "nameLocation": "35383:6:38",
            "parameters": {
              "id": 48249,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48246,
                  "mutability": "mutable",
                  "name": "_a",
                  "nameLocation": "35398:2:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48279,
                  "src": "35390:10:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48245,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "35390:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 48248,
                  "mutability": "mutable",
                  "name": "_b",
                  "nameLocation": "35410:2:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48279,
                  "src": "35402:10:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48247,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "35402:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "35389:24:38"
            },
            "returnParameters": {
              "id": 48252,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 48251,
                  "mutability": "mutable",
                  "name": "_c",
                  "nameLocation": "35444:2:38",
                  "nodeType": "VariableDeclaration",
                  "scope": 48279,
                  "src": "35436:10:38",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 48250,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "35436:7:38",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "35435:12:38"
            },
            "scope": 48280,
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "private"
          }
        ],
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 46667,
              "name": "IVault",
              "nameLocations": ["524:6:38"],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 46316,
              "src": "524:6:38"
            },
            "id": 46668,
            "nodeType": "InheritanceSpecifier",
            "src": "524:6:38"
          },
          {
            "baseName": {
              "id": 46669,
              "name": "Ownable",
              "nameLocations": ["532:7:38"],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 44381,
              "src": "532:7:38"
            },
            "id": 46670,
            "nodeType": "InheritanceSpecifier",
            "src": "532:7:38"
          },
          {
            "baseName": {
              "id": 46671,
              "name": "Pausable",
              "nameLocations": ["541:8:38"],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 46103,
              "src": "541:8:38"
            },
            "id": 46672,
            "nodeType": "InheritanceSpecifier",
            "src": "541:8:38"
          }
        ],
        "canonicalName": "Vault",
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "linearizedBaseContracts": [48280, 46103, 44381, 46316],
        "name": "Vault",
        "nameLocation": "515:5:38",
        "scope": 48281,
        "usedErrors": [
          44193, 44196, 44199, 44202, 46046, 46048, 46195, 46197, 46199, 46201, 46203, 46205, 46207,
          46209, 46211, 46213, 46215, 46217, 46219, 46221, 46223, 46225, 46227
        ],
        "usedEvents": [44209, 44214, 44219, 46231, 46237, 46245, 46251, 46257, 46263, 46273]
      }
    ],
    "license": "GPL-3.0"
  },
  "id": 38
}
