Skip to main content
A reserve is the per-asset lending pool inside a market. Each reserve holds one mint, has its own LTV / liquidation threshold / IR curve, and connects to one oracle. A market without reserves accepts nothing; reserves are how you list assets.
Each (mint, market) pair can have at most one reserve. If you need multiple reserves for the same asset (e.g., separate fixed-term tracks), each one needs its own market.

Prerequisites

Add a reserve via SDK

The SDK exposes kaminoManager.addAssetToMarketIxs(params) which returns instructions for both creating the reserve account and applying its initial config. Build the asset config using AssetReserveConfig (or AssetReserveConfigCli if you want to load a JSON-shaped config).
1

Import dependencies

2

Initialize KaminoManager

3

Build the asset config

For full control over every reserve field (including elevation-groups, fixed-term, withdrawal caps, etc.), use AssetReserveConfigCli and load a ReserveConfig JSON object:
4

Generate the reserve keypair and admin liquidity source

5

Build and submit the transactions

addAssetToMarketIxs returns two batches of instructions — one for creating the reserve account, another for applying the config. Submit them in order.
configUpdateIxs is an array because a full config update may exceed a single transaction’s size limit; the SDK splits it into chunks. Submit each chunk in order.

Cloning an existing reserve config via SDK

To spawn a sibling reserve with the same parameters as an existing one, fetch the source’s config and pass it through AssetReserveConfigCli:

What the program does on-chain

  1. Allocates a new Reserve zero-copy account
  2. Initializes its ReserveConfig from your input
  3. Sets Reserve.lending_market to your market address
  4. Validates that the oracle accounts referenced in tokenInfo actually match the configured pubkeys
  5. Initializes the reserve’s liquidity and collateral substructures (zero balances)
  6. Initializes the reserve’s WithdrawQueue (empty)
The reserve immediately accepts deposits if status: 0 (Active) and depositLimit > 0. Borrows additionally require borrowLimit > 0.

Verify

After creation: Confirm:
  • status: 0
  • tokenInfo.scopeConfiguration.priceFeed is populated
  • borrowRateCurve.points[0].utilizationRateBps == 0
  • depositLimit > 0 and borrowLimit > 0 if you want both directions usable

Common errors

What’s next

Configure oracles

Pick the right oracle source and set TWAP and staleness guards.

Risk parameters

Choose LTV, thresholds, IR curves, and caps for the asset.