Risk Mitigation
Dolomite has an expressive system for managing the protocol's risks.
Last updated
Dolomite has an expressive system for managing the protocol's risks.
Last updated
Dolomite leverages Chainlink price oracles wherever possible in its collateral calculations for ordinary assets. Dolomite's usage and collaboration with Chainlink through the BUILD program is documented in the following press release about joining the program.
Some unique assets, like GLP
, require some extra calculations and precaution when marking the value of it as collateral. After accounting for any additional business logic required for a unique asset, common collateral calculations then done through Chainlink, as usual.
Market ID | Symbol | Oracle Type |
---|---|---|
Dolomite is able to institute supply caps for individual assets, which limits the protocol's exposure to debt taken against those assets as well as limits the ability to borrow those same assets. If a supply cap is instituted and the protocol is beyond the limitation, the protocol will be in a wind-down-only mode for that asset. Meaning, all transactions executed against Dolomite Margin
for that asset needs to size down the market or, at the minimum, leave it unchanged.
You can check these numbers by visiting the Stats Page on Dolomite or by visiting DolomiteMargin on Arbiscan, clicking Read Contract
, selecting the getMarketMaxWei
function and plugging in the corresponding marketId
into the input field.
Typical to any money market protocol, Dolomite mandates a global minimum collateralization that all positions must have to be considered healthy. Any position that slips below this threshold is subject to liquidation (more on this below).
Some assets have additional collateralization requirements beyond the global minimum. The table below denotes the collateralization requirements for each asset on each network Dolomite Margin
is deployed.
Minimum collateralization: 115% (86.9565% LTV)
Minimum collateralization: 115% (86.9565% LTV)
Minimum collateralization: 115% (86.9565% LTV)
Minimum collateralization: 115% (86.9565% LTV)
You can check these numbers by visiting the Stats Page on Dolomite or by visiting DolomiteMargin on Arbiscan, clicking Read Contract
, selecting the getMarginRatio
function, adding 1e18
then dividing by 1e18.
Doing so gives you the global minimum collateralization (115%).
Then, select the getMarketMarginPremium
function and plug in the corresponding marketId
into the input field. With the margin premium, add 1e18
, divide by 1e18
, then multiply the result by 115% (the global minimum collateralization).
For example, the Margin Premium
for GLP
is 43478260869565217
. By adding 1e18
and dividing by 1e18
the result is 1.043478260869565217
. When you multiply 115% by 1.043478260869565217
, you get about 120%.
Dolomite can put assets into collateral-only mode, to prevent any user from borrowing them. If a market moves from collateral-only mode being disabled
to enabled
, then the market will be in a wind-down mode with respect to any out standing borrows. Users that have any debt will not be able to increase the size of our loans and the protocol could enforce liquidations for those users to forcefully pay their debt back. Putting an asset into collateral-only mode could be due to a variety of reasons, like:
The asset's price oracle is manipulatable to the upside (which increases the surface area for economic attack vectors)
The asset's price oracle offers a quote that is lower-than-normal, like the price oracle for GLP
Economically speaking, Dolomite or an integrating protocol doesn't want to encourage the borrowing of certain assets
The table below denotes the borrowing status of each asset on each network Dolomite Margin
is deployed.
You can check these numbers by visiting the Stats Page on Dolomite or by visiting DolomiteMargin on Arbiscan, clicking Read Contract
, selecting the getMarketIsClosing
function and plugging in the corresponding marketId
into the input field.
Isolation Mode is an extremely expressive mechanism for limiting or expanding the functionality of certain assets in Dolomite Margin
. Using Isolation Mode
allows Dolomite to dictate which assets can be borrowed against a specific collateral asset, which collateral assets can be used in a position with the Isolation Mode
asset, and allow native interactions with the underlying tokens for things like on-chain voting, capturing rewards, or other actions that are specific to the asset.
Once an asset is deployed with Isolation Mode
enabled, it can never be disabled. However the settings for Isolation Mode
can be tweaked over time if the implementation (per asset) allows for it, liquidity constraints change, or other factors that are outside of Dolomite's control.
Isolation Mode
assets are deployed as wrapped contracts around the listed asset. So the contract address you see on block explorers may appear different. Typically, these assets will be listed with a lowercase d
in the symbol
and the name
will be prefixed with Dolomite Isolation:
. Meaning, for plvGLP, the technical name
on-chain is Dolomite Isolation: Plutus Vault GLP
and the symbol
is dplvGLP
.
When you make your first deposit of an Isolation Mode
asset into Dolomite, the token approval will be set on your vault address. The vault smart contract isn't created until the deposit occurs, so it may look like an externally-owned account (EOA), but it's not. Dolomite uses Create2
for the creation of the vaults, so your vault address is known before the deposit is executed and the vault is created.
Notably, if you open a borrow position with an Isolation Mode
asset, it can never contain another asset in the position that is in Isolation Mode
. The differences amongst different Isolation Mode
levels can be seen in the table below.
The table below denotes the isolation mode status of each asset on each network Dolomite Margin
is deployed.
You can check these numbers by visiting the Stats Page on Dolomite or by visiting DolomiteMargin on Arbiscan, clicking Read Contract
, selecting the getMarketTokenAddress
function and plugging in the corresponding marketId
into the input field. Click on the resulting address and on the page whose address you are directed to, check that the contract name contains WrappedTokenUserVaultFactory
.
Dolomite can enforce an expiration timestamp for any positions that are opened with an Isolation Mode asset with this setting toggled. This feature is essential to preserve the health and solvency of markets that have a maturity. For example, Pendle's YT assets decay toward a value of 0 as they approach maturity. Thus, having an expiration ensures all positions with Pendle's YT tokens can be closed before they are liquidated due to their price declining toward 0.
Dolomite can whitelist what types of users can interact with certain Isolation Mode assets. There may be use cases for an asset only being accessible to real users (externally-owned-accounts (EOAs), smart contract wallets, or some other category that makes sense).
If this protective mode is enabled, only users that meet the criteria can deposit, withdraw, borrow, or otherwise use that particular asset in Dolomite. The table below denotes which assets are only accessible via an EOA.
Dolomite offers a unique Pause Sentinel
to reduce contamination risk between assets if there's an issue with a particular listed asset on Dolomite. If external redemptions are ever made unavailable, are paused, etc. Dolomite can dynamically disable borrowing, disable increasing position size, or more for, but only for the paused asset and its respective positions.
This breakthrough enables Dolomite to isolate technical risk and potential black swans between external integrations to reduce spillover between collateral assets on Dolomite. Let's walk through an example:
Suppose you have a position open with jUSDC
borrowing USDC
as debt. If Jones DAO activates their Emergency Pause functionality, users of jUSDC
would be unable to redeem for USDC
. This would put massive strain on Dolomite while the situation resolves, resulting in users ramping up their USDC
debt as a way to "exit" their jUSDC
position while Jones DAO's system is paused. Dolomite's Pause Sentinel
is able to disable increasing debt involving jUSDC
and automatically moves the jUSDC
market into downsize only mode - enforcing users can only pay back loans. Meanwhile, a user taking out a loan against GLP
collateral is unaffected by the jUSDC
market being paused!
The table below denotes which assets have the Pause Sentinel active:
Liquidations occur when account's collateralization falls below the minimum threshold for the debt asset(s) they owe. The liquidation threshold is defined as:
When a liquidator force-closes an underwater position, the underwater account incurs a liquidation penalty (more on this below). The amount of assets seized by a liquidator upon liquidation is defined as:
Dolomite supports full account liquidations and partial liquidations, depending on the preference of the liquidator.
Expirations occur when a position's expiry has passed, and the position is subject to being liquidated. Mechanically, expirations work similar to liquidations; having a position force-closed due to expiration follows the same formula above, when the position's collateral asset(s) are seized:
On the Borrow page, you'll see something called a Health Factor
attached to each position. The position's health is represented as a ratio of how close your equity to debt ratio is to reaching 115% collateralization (or higher if the asset has a risk premium applied). When your Health Factor
falls below 1.00
your position is subject to being force-closed via liquidation.
Here's an example of the calculation assuming the liquidation threshold is 115% collateralization, you have $120 worth of assets and your debt is $100:
Dolomite uses the concept of a Health Factor
because it normalizes different liquidation thresholds that could be different across the diverse set of potential assets in your position. For example, if you're supplying GLP
and USDC
as well as borrowing LINK
and ETH
, each of those assets could have different liquidation thresholds, which cannot be represented through a simple liquidation price.
Liquidation penalties serve as a deterrent for borrowers to try to not get liquidated and an incentive for liquidators to perform their role and maintain the solvency of Dolomite's money market system. DolomiteMargin
specifies a global liquidation penalty that is the minimum value that can be set for each market. Each market can add a Liquidation Spread Premium
, which is used to increase the liquidation penalty. Generally, illiquid and riskier markets have higher liquidation penalties than less risky and more liquid ones. In a way, the penalty is a reflection of the risk the protocol takes on by listing the asset in the system for usage.
Liquidation Spread Premiums
aggregate to reflect the compounded risk of borrowing a risky asset with a risky collateral asset. Using the example of WBTC
and LINK
on Arbitrum One, which both have Liquidation Spread Premiums
of 40%, the liquidation penalty when you borrow one using the other asset collateral is 9.8% (1.4 * 1.4 * 5%
).
To check the math of this, you can visit DolomiteMargin on Arbiscan, click Read Contract
, select the getLiquidationSpreadForPair
function and input 3 and 4 as the heldMarketId
and owedMarketId.
Doing so gives you the liquidation penalty of 9.8% if you divide the result by 1e18
.
Global liquidation penalty: 5%
Global liquidation penalty: 5%
Global liquidation penalty: 5%
Global liquidation penalty: 5%
You can check these numbers by visiting the Stats Page on Dolomite or by visiting DolomiteMargin on Arbiscan, clicking Read Contract
, selecting the getLiquidationSpread
function and dividing by 1e18.
Doing so gives you the global liquidation penalty of 5%.
Then, select the getMarketSpreadPremium
function and plug in the corresponding marketId
into the input field. With the spread premium, add 1e18
, divide by 1e18
, then multiply the result by 5% (the global liquidation penalty).
For example, the Liquidation Penalty
for WBTC
is 400000000000000000
. By adding 1e18
and dividing by 1e18
the result is 1.400000000000000000
. When you multiply 5% by 1.400000000000000000
, you get 7%.
Vaporizations can occur after a liquidation if an underwater account is left with 0 collateral assets but still holds a non-zero amount of debt. Vaporizing an account from a liquidator account will essentially "donate" the liquidators assets to cover any shortfall in bad debt the underwater account accrued.
Market ID | Asset | Oracle Type |
---|---|---|
Market ID | Asset | Oracle Type |
---|---|---|
Market ID | Asset | Oracle Type |
---|---|---|
Level | Description |
---|---|
Market ID | Symbol | Isolation Mode Level |
---|---|---|
Market ID | Symbol | Forcefully Expired? |
---|---|---|
Market ID | Symbol | Only EOA? |
---|---|---|
Market ID | Symbol | Pause Sentinel Trigger |
---|---|---|
0
WETH
Chainlink (Market Price)
1
DAI
Chainlink (Market Price)
2
USDC.e
Chainlink (Market Price)
3
LINK
Chainlink (Market Price)
4
WBTC
Chainlink (Market Price)
5
USDT
Chainlink (Market Price)
6
GLP
Algorithmic + Chainlink (Market Price)
7
ARB
Chainlink (Market Price)
8
magicGLP
mGLP -> GLP - Chainlink (Automation) GLP -> USD - Algorithmic + Chainlink (Market Price)
9
plvGLP
Algorithmic + Chainlink (Automation)
10
jUSDC
jUSDC -> USDC - Chainlink (Automation)
USDC -> USD - Chainlink (Market Price)
11
PT-GLP (Mar 2024)
PT-GLP -> GLP - Pendle TWAP
GLP -> USD - Algorithmic + Chainlink (Market Price)
12
UNI
Chainlink (Market Price)
13
MIM
Chainlink (Market Price)
14
wstETH
wstETH -> stETH - Chainlink (Exchange Rate)
stETH -> ETH - Chainlink (Market Price)
ETH -> USD - Chainlink (Market Price)
15
rETH
rETH -> ETH - Chainlink (Exchange Rate) ETH -> USD - Chainlink (Market Price)
16
YT-GLP (Mar 2024)
YT-GLP -> GLP - Invert Pendle TWAP
GLP -> USD - Algorithmic + Chainlink (Market Price)
17
USDC
Chainlink (Market Price)
18
GRAIL
GRAIL -> ETH/USDC - Camelot TWAP ETH/USDC -> USD - Chainlink (Market Price)
19
MAGIC
Chainlink (Market Price)
20
DPX
Camelot TWAP
21
PENDLE
Chainlink (Market Price)
22
PT-rETH (Jun 2025)
PT-rETH -> rETH Pendle TWAP rETH -> ETH Chainlink (Exchange Rate) ETH -> USD - Chainlink (Market Price)
23
PT-stETH (Jun 2024)
PT-stETH -> stETH Pendle TWAP stETH -> ETH Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
24
PT-stETH (Jun 2025)
PT-stETH -> stETH Pendle TWAP stETH -> ETH Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
25
JONES
JONES -> ETH/USDC - Camelot TWAP ETH/USDC -> USD - Chainlink (Market Price)
26
PREMIA
PREMIA -> ETH/USDC - Camelot TWAP ETH/USDC -> USD - Chainlink (Market Price)
27
RDNT
Chainlink (Market Price)
28
vARB
Chainlink (Market Price)
29
GMX
Chainlink (Market Price)
30
Staked-GMX
Chainlink (Market Price)
31
GM: ARB-USD
Algorithmic + Chainlink (Market Price)
32
GM: BTC-USD
Algorithmic + Chainlink (Market Price)
33
GM: ETH-USD
Algorithmic + Chainlink (Market Price)
34
GM: LINK-USD
Algorithmic + Chainlink (Market Price)
35
weETH
weETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
36
PT-eETH (Apr 2024)
PT-eETH -> eETH - Pendle TWAP eETH -> weETH - Chainlink (Exchange Rate) weETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
37
ezETH
ezETH -> ETH - Chainlink (Exchange Rate) ETH -> USD - Chainlink (Market Price)
38
PT-ezETH (Jun 2024)
PT-ezETH -> ezETH - Pendle TWAP ezETH -> ETH - Chainlink (Exchange Rate) ETH -> USD - Chainlink (Market Price)
39
XAI
Chainlink (Market Price)
40
sGLP
Algorithmic + Chainlink (Market Price)
41
PT-GLP (Sep 2024)
PT-GLP -> GLP - Pendle TWAP GLP -> USD - Algorithmic + Chainlink (Market Price)
42
PT-eETH (Jun 2024)
PT-eETH -> eETH - Pendle TWAP eETH -> weETH - Chainlink (Exchange Rate) weETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
43
jUSDC V2
jUSDC V2 -> USDC - Chainlink (Automation) USDC -> USD -> Chainlink (Market Price)
44
GM: BTC
Algorithmic + Chainlink (Market Price)
45
GM: ETH
Algorithmic + Chainlink (Market Price)
46
GRAI
Ramses TWAP
47
GM: UNI-USD
Algorithmic + Chainlink (Market Price)
48
wUSDM
Chronicle (Market Price)
49
rsETH
rsETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
50
PT-eETH (Sep 2024)
PT-eETH -> eETH - Pendle TWAP eETH -> weETH - Chainlink (Exchange Rate) weETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
51
PT-ezETH (Sep 2024)
PT-ezETH -> ezETH - Pendle TWAP ezETH -> ETH - Chainlink (Exchange Rate) ETH -> USD - Chainlink (Market Price)
52
PT-rsETH (Sep 2024)
PT-rsETH -> rsETH - Pendle TWAP rsETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
53
wOETH
wOETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
54
USDe
USDe -> USD - Chainlink (Market Price)
55
GM: AAVE-USD
Algorithmic + Chainlink (Market Price)
56
GM: DOGE-USD
Algorithmic + Chainlink (Market Price)
57
GM: GMX-USD
Algorithmic + Chainlink (Market Price)
58
GM: SOL-USD
Algorithmic + Chainlink (Market Price)
59
GM: wstETH-USD
Algorithmic + Chainlink (Market Price)
60
PT-eETH
PT-eETH -> eETH - Pendle TWAP eETH -> weETH - Chainlink (Exchange Rate) weETH -> ETH - Chainlink (Market Price) ETH -> USD - Chainlink (Market Price)
61
PT-rsETH
PT-rsETH -> ETH - Pendle TWAP (No rsETH market price) ETH -> USD - Chainlink (Market Price)
0
WETH
Chronicle (Market Price)
1
WMNT
Chronicle (Market Price)
2
USDC
Chronicle (Market Price)
3
WBTC
Chronicle (Market Price)
4
USDT
Chronicle (Market Price)
5
mETH
Chronicle (Market Price)
6
USDe
Chronicle (Market Price)
7
PT-USDe
PT-USDe -> USDe - Pendle TWAP USDe -> USD - Chronical (Market Price)
8
USDY
Chronicle (Market Price)
9
sMNT
Chronicle (Market Price)
10
PT-USDe
PT-USDe -> USDe - Pendle TWAP USDe -> USD - Chronical (Market Price)
11
PT-mETH
PT-mETH -> ETH - Pendle TWAP ETH -> USD - Chronicle (Market Price)
12
PT-MNT
PT-MNT -> MNT - Pendle TWAP MNT -> USD - Chronicle (Market Price)
13
FBTC
FBTC -> WBTC - Chronicle (Market Price) WBTC -> USD - Chronicle (Market Price)
0
WETH
Chainlink (Market Price)
1
DAI
Chainlink (Market Price)
2
Chainlink (Market Price)
3
LINK
Chainlink (Market Price)
4
WBTC
Chainlink (Market Price)
5
USDT
Chainlink (Market Price)
6
MATIC
Chainlink (Market Price)
7
USDC.E
Chainlink (Market Price)
0
WETH
Chainlink (Market Price)
1
WOKB
Chainlink (Market Price)
2
USDC
Chainlink (Market Price)
3
WBTC
Chainlink (Market Price)
4
USDT
Chainlink (Market Price)
1
Can contain any debt or collateral asset in the same position, as long as those assets are not in isolation mode. Since this is the default level for all isolation mode assets, we don't list them in the table below.
2
Can contain only specific collateral assets or specific debt assets in the same position. Cannot contain assets in the same position that are in isolation mode.
3
Cannot contain any other collateral asset in the same position. Can only contain specific debt assets in the same position. Cannot contain assets in the same position that are in isolation mode.
10
jUSDC
3 (can only have USDC
and USDC.e
as debt; no other collateral assets are allowed)
16
YT-GLP (Mar 2024)
2 (can only have WETH
, DAI
, USDC
, USDT
, WBTC
, and MIM
debt)
31
GM: ARB-USD
2 (can only have ARB
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
32
GM: BTC-USD
2 (can only have BTC
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
33
GM: ETH-USD
2 (can only have ETH
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
34
GM: LINK-USD
2 (can only have LINK
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
43
jUSDC V2
3 (can only have USDC
and USDC.e
as debt / collateral)
44
GM: BTC
2 (can only have BTC
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
45
GM: ETH
2 (can only have ETH
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
47
GM: UNI-USD
2 (can only have UNI
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, and USDT
debt / collateral)
55
GM: AAVE-USD
2 (can only have DAI
, GRAI
, MIM
, USDC
, USDC.e
, USDT
, wUSDM
, and USDe
debt / collateral)
56
GM: DOGE-USD
2 (can only have ETH
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, USDT
, wUSDM
, and USDe
debt / collateral)
57
GM: GMX-USD
2 (can only have SOL
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, USDT
, wUSDM
, and USDe
debt / collateral)
58
GM: SOL-USD
2 (can only have DAI
, GRAI
, MIM
, USDC
, USDC.e
, USDT
, wUSDM
, and USDe
debt / collateral)
59
GM: wstETH-USD
2 (can only have wstETH
, DAI
, GRAI
, MIM
, USDC
, USDC.e
, USDT
, wUSDM
, and USDe
debt / collateral)
16
YT-GLP (Mar 2024)
TRUE; Maximum position duration is the lesser of 4 weeks OR 1 week until maturity (Thu Mar 28 2024 00:00:00 GMT
; 1711584000
unix timestamp)
10
jUSDC
TRUE
43
jUSDC V2
TRUE
9
plvGLP
If the vaultParams()
disable redemptions
10
jUSDC
If the JonesUSDCIsolationModeUnwrapperTrader
is unable to bypass the 24hr withdrawal period or is not whitelisted. If the JonesGlpVaultRouter toggles the isPaused
state.
11
PT-GLP (Mar 2024)
If the SY GLP token is paused
16
YT-GLP (Mar 2024)
If the SY GLP token is paused
22
PT-rETH (Jun 2025)
If the SY rETH token is paused
23
PT-wstETH (Jun 2024)
If the SY wstETH token is paused
24
PT-wstETH (Jun 2025)
If the SY wstETH token is paused
31
GM: ARB-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
32
GM: BTC-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
33
GM: ETH-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
34
GM: LINK-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
36
PT-eETH (Apr 2024)
If the SY eETH token is paused
38
PT-ezETH (Jun 2024)
If the SY ezETH token is paused
41
PT-GLP (Sep 2024)
If the SY GLP token is paused
42
PT-eETH (Jun 2024)
If the SY eETH token is paused
43
jUSDC V2
If the JonesUSDCIsolationModeUnwrapperTrader
is unable to bypass the 24hr withdrawal period or is not whitelisted. If the JonesGlpVaultRouter toggles the isPaused
state.
44
GM: BTC
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
45
GM: ETH
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
47
GM: UNI-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
55
GM: AAVE-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
56
GM: DOGE-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
57
GM: GMX-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
58
GM: SOL-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small
59
GM: wstETH-USD
If the market is disabled, if withdrawals are disabled, if the P&L factor for the pool is too large, or if the callback gas limit is too small