📖
Docs
  • Protocol
    • 🤟What is Phase?
    • ⚠️Acknowledgments
    • 📜License
  • Vaults
    • 🏦Yield on Collateral
    • 💳Credit Accounts
  • CASH Stablecoin
    • 🪙$CASH
    • 🔁PSM
    • 🏗️Vault Structure
  • Liquidation
    • 📠Math behind Liquidations
    • 🤩Become a Liquidator
  • Proxies
    • 💡Overview
    • 👮Admin Upgradeable Proxy
    • 📦Storage Upgradeable Proxy
    • 💎Diamonds
  • 🔗Socials
  • 📖Devdocs
Powered by GitBook
On this page
  1. CASH Stablecoin

Vault Structure

PreviousPSMNextMath behind Liquidations

Last updated 1 year ago

Every Vault is a unique Clone Diamond. This means the Manager can upgrade all the vaults at once by upgrading the main . Though, upgrading often also needs to call an initialize function to upgrade the logic with new variables. A vault stores info about every in its storage. A Vault also contains a lot of helpful functionality for frontends and liquidators, including but not limited to the following:

  • Getting user info such as deposit and debt value

  • Getting liquidation info on users with predictable results once executed on

  • Indexing all deposits and actions done on the vault

Vault interfaces:

IVault.sol
// SPDX-License-Identifier: BUSL-1.1
interface IVaultAccounting {
  /// @notice Adds collateral for the user
  /// @param user The user id
  /// @param amount The amount to add
  /// @param extraData The extra adapter data
  function addCollateral(
    uint256 user,
    uint256 amount,
    bytes memory extraData
  ) external payable;

  /// @notice Removes collateral from the user
  /// @param user The user id
  /// @param amount The amount to remove
  /// @param extraData The extra adapter data
  function removeCollateral(
    uint256 user,
    uint256 amount,
    bytes memory extraData
  ) external;

  /// @notice Mints CASH for the user
  /// @param user The user id
  /// @param amount Yhe amount to mint
  function mintUSD(uint256 user, uint256 amount) external;

  /// @notice Mints CASH for the user
  /// @param user The user id
  /// @param amount The amount to mint
  /// @param useMax If minting too much, mint max allowed instead
  function mintUSD(uint256 user, uint256 amount, bool useMax) external;

  /// @notice Repays CASH for the user
  /// @param user The user id
  /// @param shares The amount of shares to repay
  function repayUSD(uint256 user, uint256 shares) external;

  /// @notice Repays CASH for the user
  /// @param user The user id
  /// @param shares The amount of shares to repay
  /// @param useMax If repaying too much, repay as much as wallet balance allows
  function repayUSD(uint256 user, uint256 shares, bool useMax) external;
}

interface IVaultGetters {
  /// @notice Returns if the user is solvent
  /// @param user The user id
  /// @return If the user is solvent
  function isSolvent(uint256 user) external view returns (bool);

  /// @notice Returns the user's debt value in dollars
  /// @param user The user id
  /// @return The debt value
  function debtValue(uint256 user) external view returns (uint256);

  /// @notice Returns the user's deposit value in dollars
  /// @param user The user id
  /// @return The deposit value
  function depositValue(uint256 user) external view returns (uint256);

  /// @notice Returns the user's total deposit in token amount
  /// @param user The user id
  /// @return The total deposit
  function deposit(uint256 user) external view returns (uint256);

  /// @notice Returns the user's yield deposit in token amount
  /// @param user The user id
  /// @return The yield deposit
  function yieldDeposit(uint256 user) external view returns (uint256);

  /// @notice Returns the user's vault deposit in token amount
  /// @param user The user id
  /// @return The vault deposit
  function pureDeposit(uint256 user) external view returns (uint256);

  /// @notice Returns all yield sources used by the user
  /// @param user The user id
  /// @return The list of yield sources
  function yieldSources(uint256 user) external view returns (address[] memory);

  /// @notice Returns the price of the underlying asset from the oracle
  /// @return The underlying asset price
  function price() external view returns (uint256);

  /// @notice Returns the interest rate for the vault
  /// @return The interest rate
  function getInterest() external view returns (uint256);

  /// @notice Returns the total amount of collateral in the vault and invested in all yield sources
  /// @return The amount of collateral
  function collectiveCollateral() external view returns (uint256);

  /// @notice Returns all the available yield sources
  /// @return The list of yield sources
  function allYieldSources() external view returns (address[] memory);

  /// @notice Returns the user info for the user
  /// @param user The user id
  /// @return The user info
  function userInfo(uint256 user) external view returns (UserInfo memory);

  /// @notice Returns the yield info for the source
  /// @param yieldSource The yield source address
  /// @return The yield info
  function yieldInfo(
    address yieldSource
  ) external view returns (YieldInfo memory);

  /// @notice Returns the manager contract
  /// @return The manager contract
  function manager() external view returns (Manager);

  /// @notice Returns the cash contract
  /// @return The cash contract
  function cash() external view returns (ICash);

  /// @notice Returns the treasury contract
  /// @return The treasury contract
  function treasury() external view returns (ITreasury);

  /// @notice Returns the storage contract
  /// @return The storage contract
  function varStorage() external view returns (Storage);

  /// @notice Returns the asset token contract
  /// @return The asset token contract
  function asset() external view returns (IERC20);

  /// @notice Returns the price oracle contract
  /// @return The price oracle contract
  function priceOracle() external view returns (IOracle);

  /// @notice Returns the max mint
  /// @return The max mint
  function maxMint() external view returns (uint256);

  /// @notice Returns the interest contract
  /// @return The interest contract
  function interest() external view returns (IInterest);

  /// @notice Returns the max collateral ratio
  /// @return The max collateral ratio
  function maxCollateralRatio() external view returns (uint256);

  /// @notice Returns the borrow fee
  /// @return The borrow fee
  function borrowFee() external view returns (uint256);

  /// @notice Returns the liquidation fee
  /// @return The liquidation fee
  function liquidationFee() external view returns (uint256);

  /// @notice Returns the health target minimum
  /// @return The health target minimum
  function healthTargetMinimum() external view returns (uint256);

  /// @notice Returns the health target maximum
  /// @return The health target minimum
  function healthTargetMaximum() external view returns (uint256);

  /// @notice Returns the collective debt
  /// @return The collective debt
  function collectiveDebt() external view returns (uint256);

  /// @notice Returns the total debt shares
  /// @return The total debt shares
  function totalDebtShares() external view returns (uint256);

  /// @notice Returns the last debt update timestamp
  /// @return The last debt update timestamp
  function lastDebtUpdate() external view returns (uint256);

  /// @notice Returns if the context is currently locked due to a sensitive function being called
  /// @return If the context is currently locked
  function contextLocked() external view returns (bool);

  /// @notice Returns if the market is current locked
  /// @return If the matket is currently locked
  function marketsLocked() external view returns (bool);
}

interface IVaultLiquidation {
  /// @notice Liquidates a user based on liquidationInfo(user)
  /// @param user The user id
  function liquidateUser(uint256 user) external;

  /// @notice Returns liquidation info about the user
  /// @param user The user id
  /// @return The liquidation info
  function liquidationInfo(
    uint256 user
  ) external view returns (LiquidationInfo memory);
}

interface IVaultSetters {
  /// @notice Sets the health target for a liquidation for the user
  /// @param user The user id
  /// @param healthTarget The health target
  function setHealthTarget(uint256 user, uint256 healthTarget) external;
}

interface IVaultYield {
  /// @notice Deposits collateral into the yield source for the user
  /// @param user The user id
  /// @param yieldSource The yield source
  /// @param amount The deposit amount
  function depositYield(
    uint256 user,
    address yieldSource,
    uint256 amount
  ) external;

  /// @notice Withdraws collateral from the yield source for the user
  /// @param user The user id
  /// @param yieldSource The yield source
  /// @param amount The withdraw amount
  function withdrawYield(
    uint256 user,
    address yieldSource,
    uint256 amount
  ) external;

  /// @notice Withdraws all collateral from the yield source for the user
  /// @param user The user id
  /// @param yieldSource The yield source
  function withdrawFullYield(uint256 user, address yieldSource) external;

  /// @notice Withdraws all collateral from all yield sources for the user
  /// @param user The user id
  function withdrawEverythingYield(uint256 user) external;
}

// solhint-disable-next-line no-empty-blocks
interface IVault is
  IVaultAccounting,
  IVaultGetters,
  IVaultLiquidation,
  IVaultSetters,
  IVaultYield,
  IAccessControl,
  IMulticall
{ }
🏗️
Diamond
Credit Account