# User Instructions

Interact program to program via these instructions, or refer to the GitHub link below:

{% embed url="<https://github.com/solendprotocol/solana-program-library/blob/mainnet/token-lending/program/src/instruction.rs>" %}

**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.
* [Sample TX](https://solscan.io/tx/3Her2qWoAbits6VuagCmgskfaNiUSCBdr11ZuAV2z74Dcc2uNdT9dBJvXZ4NVUYEPpmGpri5RxPaT7caSQ24X39v)

**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.

### **cToken Instructions**:

**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

### **Monitoring/Misc Instructions**

**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&#x20;
* 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&#x20;

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.&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.save.finance/architecture/user-instructions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
