👻
Aave Book
  • Introduction
  • TradFi vs DeFi: Lending
  • Market forces x Interest Rate Models
  • On Indexes
    • Why use indexes?
  • Scaling and ATokens
  • Deposit & Borrow Interest
  • Stable borrowing
    • 🚧Under construction
  • Liquidation
    • 🚧TODO: Full example
    • 🚧Under construction: oracles
  • Primer
    • Bitmap & Masks
      • 🚧padding and bytes
    • WadRayLibrary
      • Math Operations
      • 🚧WIP: Scaling different decimal representations
      • 🚧WIP: 2's complement
      • 🚧casting: to uint128
    • PercentageMath
    • Embedded vs Linked Libraries
  • Functions
    • General Execution flow
    • Architecture & Design choices
      • 🚧Upgradability and Proxies
    • Common Functions
      • getReserveFactor, getDecimals
      • .cache
      • .updateState
      • .updateInterestRates
      • SupplyCap, BorrowCap
      • getFlags
        • 🚧more on flags
      • calculateUserAccountData
    • supply
      • validateSupply
      • transfer & mint
      • isFirstSupply
        • isUsingAsCollateralOne, isUsingAsCollateralAny
      • On check-effects-interactions pattern
    • withdraw
      • get user balance & withdraw amount
      • validateWithdraw
      • collateral check
      • burn ATokens
      • Ensure existing loans are collateralized
    • borrow
      • getIsolationModeState
      • .validateBorrow
      • Mint debt token
      • setBorrowing
      • update IsolationMode debt
      • transfer underlying to user
    • repay
      • get current debt
      • validateRepay, paybackAmount
      • burn debt tokens
      • Cleanup + Collect repay
    • liquidate
      • _calculateDebt
      • validateLiquidationCall
      • getConfigurationData
      • calculateAvailableCollateralToLiquidate
      • 🚧_burnDebtTokens
      • liquidate/burn collateral
      • liquidation Fee
      • Wrap-up
    • 🚧swapBorrowRateMode
    • 🚧setUserUseReserveAsCollateral
  • Contracts
    • AToken
      • Simple example: mint & balanceOf
    • StableDebtToken
      • Implementation explained
    • VariableDebtToken
    • DefaultReserveInterestRateStrategy
    • L2
      • 🚧PriceOracleSentinel
  • Audit findings
    • 🚧Under construction
  • Appendix
    • Simple, Compound, APR, APY
  • Aave Features
    • Risk Management
      • Supply & Borrow Caps
      • Isolation Mode
      • Siloed Borrowing
    • Other features
      • Repay with ATokens
      • eMode: High efficiency Mode
      • 🚧Aave Vault
      • 🚧Portal
Powered by GitBook
On this page
  • TLDR
  • How are the caps stored
  • getSupplyCap
  • getBorrowCap

Was this helpful?

Edit on GitHub
  1. Functions
  2. Common Functions

SupplyCap, BorrowCap

Previous.updateInterestRatesNextgetFlags

Last updated 1 year ago

Was this helpful?

TLDR

Borrow caps: limits of how much of each asset can be borrowed, which reduces insolvency risk.

Supply caps: limits how much of a certain asset is supplied. Helps control excessive exposure to a certain asset and mitigate attacks like infinite minting or price oracle manipulation.

If borrow/supply cap is set to 0; this sigifies that there is no cap.

In case Borrow Cap of the reserve is set lower than the current totalDebt, the existing borrowers are not effected but no more borrows (stable or variable) can be initiated for that reserve.

In case Supply Cap of the reserve is set lower than the current liquidity of the reserve, the existing suppliers are not effected but no more liquidity can be supplied to that reserve.

How are the caps stored

Each asset has a corresponding ReserveData struct which outlines its key information and configuration.

  • PoolStorage holds mapping _reserves which maps asset address to ReserveData.

Within eachReserveData struct, there is a nested struct of type ReserveConfigurationMap. The nested struct contain a bitmap, storing the asset's configuration:

An asset's borrow and supply caps are defined within the bitmap, along with other relevant information.

getSupplyCap

To retrieve a specific asset's supply cap, we call getSupplyCap and pass said asset's ReserveConfigurationMap.

uint256 internal constant SUPPLY_CAP_START_BIT_POSITION = 116
uint256 internal constant SUPPLY_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
  • Only bits 116 - 151 are set to 0 in the mask; these bits will be set to 1 after the ~ operation.

  • data & ~SUPPLY_CAP_MASK will return a hexadecimal number in which all the characters are set to 0,except potentially the bits representing the supply cap.

  • These bits will return the hex value of the supply cap.

  • If supply cap is indeed 0, then 0x000...000 would be returned.

Numbers in Solidity are left-padded. Therefore to convert our resulting hexadecimal number to the appropriate number representation so that it can be cast as a uint256, right shifting by 116 bits is required.

  • this will remove all the 0s on the right, from the least significant bit to the value

  • left-padding will be done accordingly, to ensure 32 byte representation

getBorrowCap

uint256 internal constant BORROW_CAP_START_BIT_POSITION = 80
uint256 internal constant BORROW_CAP_MASK = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000FFFFFFFFFFFFFFFFFFFF;
  • Process is similar to getSupplyCap

See more at

getReserveFactor
ReserveConfigurationMap