User Instructions
Last updated
Last updated
Interact program to program via these instructions, or refer to the GitHub link below:
DepositReserveLiquidityAndObligationCollateral (Supply)
Deposit reserve liquidity (Transfer) + mint cTokens (MintTo) + Transfer cTokens into CollateralSupplyAddress (Transfer)
Does not require RefreshReserve as it is impossible to worsen an obligation’s health by repaying.
WithdrawObligationCollateralAndRedeemReserveCollateral
Redeem cTokens from CollateralSupplyAddress
Exchange cTokens into Tokens using the cToken Rate
Requires RefreshReserve to ensure that the user is able to withdraw without defaulting their existing borrows
RefreshReserve → RefreshObligation → WithdrawObligationCollateralAndRedeemReserveCollateral
BorrowObligationLiquidity
Bundled with Refresh Reserve
if “borrow_reserve.last_update.is_stale(clock.slot)? {” fails, reserve is considered stale (refreshreserve + borrow must be in the same slot)
RefreshReserve → RefreshObligation → Borrow
RepayObligationLiquidity
Does not require RefreshReserve as it is impossible to worsen an obligation’s health by repaying.
DepositReserveLiquidity
Deposit funds into the reserve, mint cToken
No need to escrow the cTokens in the CollateralSupplyAddress
Relies on cToken:Token Ratio
RedeemReserveCollateral
Withdraw Funds, burn cTokens
Relies on cToken:Token Ratio
RefreshReserve
Update the price of every reserve, usually done before RefreshObligation
Pull Oracle prices
Update CumulativeBorrowRate to calculate interest paid since last refreshed block
Update the Obligation CumulativeBorrowRate to apply an increase in borrow value
Update cToken Rate for supply side users
Done 2x for every reserve, supply and borrow side
RefreshObligation
Done after RefreshReserves
Calculate individual obligations that ran the Withdraw or Borrow tx to calculate LTV before borrows
Assess whether the tx can go through based on account health
Notes:
RefreshReserve/RefreshObligation used to be required for all transactions, but were removed to reduce oracle reliance after Jan 2022’s network issues.
Liquidator will call RefreshObligation before liquidating
However, borrow/withdraw has to check whether the obligation is refreshed in the SAME slot. But obligations require that reserves are refreshed.
RefreshReserve → RefreshObligation (repeated through all the positions) requires a lot of memory, which is limited by Solana, and thus limits our positions to 6.