Use this file to discover all available pages before exploring further.
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.
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
import { createSolanaRpc, createSolanaRpcSubscriptions, address, generateKeyPairSigner, pipe, createTransactionMessage, setTransactionMessageFeePayerSigner, setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstructions, signTransactionMessageWithSigners, sendAndConfirmTransactionFactory,} from '@solana/kit';import { KaminoManager, AssetReserveConfig, DEFAULT_RECENT_SLOT_DURATION_MS, PROGRAM_ID,} from '@kamino-finance/klend-sdk';import { parseKeypairFile } from '@kamino-finance/klend-sdk/dist/utils/signer.js';import { TOKEN_PROGRAM_ADDRESS } from '@solana-program/token';import { findAssociatedTokenPda } from '@solana-program/token-2022';import { Decimal } from 'decimal.js';
For full control over every reserve field (including elevation-groups, fixed-term, withdrawal caps, etc.), use AssetReserveConfigCli and load a ReserveConfig JSON object:
import { AssetReserveConfigCli } from '@kamino-finance/klend-sdk';import { ReserveConfig } from '@kamino-finance/klend-sdk/dist/@codegen/klend/types';const reserveConfig: ReserveConfig = /* fully-populated ReserveConfig object */;const assetConfig = new AssetReserveConfigCli( address('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'), TOKEN_PROGRAM_ADDRESS, reserveConfig,);
4
Generate the reserve keypair and admin liquidity source
const reserveKeypair = await generateKeyPairSigner();// The admin's associated token account for the asset (used to seed the reserve at init)const [adminLiquiditySource] = await findAssociatedTokenPda({ mint: assetConfig.mint, owner: adminSigner.address, tokenProgram: TOKEN_PROGRAM_ADDRESS,});
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.
To spawn a sibling reserve with the same parameters as an existing one, fetch the source’s config and pass it through AssetReserveConfigCli:
import { Reserve } from '@kamino-finance/klend-sdk/dist/@codegen/klend/accounts';const sourceReserve = await Reserve.fetch(rpc, address('<EXISTING_RESERVE_ADDRESS>'));if (!sourceReserve) throw new Error('Reserve not found');const clonedConfig = sourceReserve.config;// Update tokenInfo and any reserve-specific fields before applyingclonedConfig.tokenInfo.name = encodeTokenName('NEW_TOKEN');clonedConfig.tokenInfo.scopeConfiguration.priceFeed = address('<NEW_SCOPE_FEED>');const newAssetConfig = new AssetReserveConfigCli( address('<NEW_TOKEN_MINT>'), TOKEN_PROGRAM_ADDRESS, clonedConfig,);// Use newAssetConfig in addAssetToMarketIxs
Adding reserves is not available via the REST API. The Kamino API supports reading reserve metrics and historical data; reserve creation and configuration is an admin operation available through the SDK or Kamino CLI.
To add a reserve, use the SDK or Kamino CLI tabs.For reading reserve data after creation, see Read market data and the API reference.
The reserve config is a JSON file authored once per reserve. Fields use camelCase in JSON; the on-chain Rust struct uses snake_case. The CLI handles the conversion.A reference config ships with klend-sdk: klend-sdk/configs/reserve_config_example.json
The example file may contain legacy fields that the program ignores (assetTier, multiplierSideBoost, multiplierTagBoost). Treat them as no-ops; the canonical schema is in the Reserve config reference.