SupplyCap, BorrowCap
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.
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 toReserveData
.
Within eachReserveData
struct, there is a nested struct of type ReserveConfigurationMap
. The nested struct contain a bitmap, storing the asset's configuration:

ReserveConfigurationMap
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 to1
after the~
operation.data & ~SUPPLY_CAP_MASK
will return a hexadecimal number in which all the characters are set to0,
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
, then0x000...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
Last updated
Was this helpful?