← Articles
Kamino Lend: isolated markets, vaults, and the klend program logo
kamino

Kamino Lend: isolated markets, vaults, and the klend program

· AUG 26, 2026 ·Updated AUG 28, 2026
Read
Share

You are not integrating an Aave clone. You pick a market, talk to klend (or a vault on top of it), and you use the same oracle the liquidators use.

devrels.xyz/a/262

If you only know Kamino as a borrow screen, the thing you actually call is klend. Each market is its own risk island. Vaults sit on top, so most product users never see a reserve address.

This is for people who have to deposit, borrow, or stand up a market without guessing from the UI. Program source: github.com/Kamino-Finance/klend.

The short version

Users deposit into a reserve, borrow against collateral, and get liquidated if they go over the line. There is no one giant shared risk pool. Each market is its own island: reserves, LTV, oracles, farms, admin. That is why curators can run different books on the same program.

A vault sits on top. One deposit mint in, share tokens out, weights and caps across reserves, curator fees. Most product users never see a reserve address. You still need to know which layer you are talking to, because CPI into kliquidity or a farm program when you meant klend is a wasted week.

Official docs now live at kamino.com/docs. Pin program IDs from there and the README, not from a tweet.

Which job you have

  • Wallet, bot, or app on existing markets — positions, health, deposit / borrow / repay / withdraw. TypeScript SDK or REST. You almost never create a market.
  • Curator launching a book — create an isolated market, add reserves (LTV, liquidation, rate curve, oracle), optional farms, then move admin to a Squads multisig before you take size.
  • Vault product — one deposit token, allocation across reserves, shares, fees. Users hold shares. The vault holds the lending positions.

Program IDs (pin these)

Staging runs klend on mainnet under a different program id, so prices and oracles match prod while the market stays isolated. That is not the same as Solana devnet. Devnet currently reuses the mainnet klend id. Same binary, not the same accounts.

KLend and vault deployments
WhatId
klend mainnet (and current devnet id)KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD
klend staging (mainnet)SLendK7ySfcEzyaFqy93gDnD3RtrpXJcnRwb6zFHJSh
kvault mainnetKvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd
kvault stagingstKvQfwRsQiKnLtMNVLHKS3exFJmZFsgfzBPWHECUYK

Filter Geyser / CPI on these. “A Kamino account I saw in a wallet” is not a program id.

How you actually talk to it

Pick the thinnest path that ships the feature. Kamino’s own split:

  • REST https://api.kamino.finance. Market list, positions, history, unsigned txs. Enumerate markets here (GET /v2/kamino-market). Language-agnostic.
  • TypeScript SDK @kamino-finance/klend-sdk (npm 10 as of July 2026). On-chain reads, tx builders, vault helpers. Pairs with klend-sdk and @solana/kit. The CLI (kamino-manager) lives in that repo.
  • Rust — bots, liquidators, CPI from another program.

Typical app path: load market + reserves via SDK → obligation health → build deposit or borrow ix → simulate → send. Do not hand-roll obligation math if the SDK already does it. Use V2 ixs when the SDK offers useV2Ixs: true.

typescript
import { KaminoMarket, KaminoAction, VanillaObligation } from "@kamino-finance/klend-sdk"
import { createSolanaRpc, address } from "@solana/kit"

const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com")
const market = await KaminoMarket.load(
  rpc,
  address("7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF"), // main market; pass yours
)

await market.loadReserves()
const usdc = market.getReserve("USDC")
// Then KaminoAction.buildDepositTxns({ kaminoMarket: market, amount, reserveAddress, owner, obligation, useV2Ixs: true, currentSlot })

Oracles and permissioned markets

Reserves pin Scope, Kamino’s aggregator (Kamino-Finance/scope). If you add a reserve, the feed is a risk decision. If you only draw a UI number, use the same feed the reserve uses or your health will disagree with liquidators.

Some curator markets are permissioned. The user wallet does not call klend for gated actions. It builds the klend ix, wraps it in kperm.permissioned_fwd_to_klend, and kperm CPI’s in with a Market Permissioner PDA as co-signer. Withdraw and repay stay open. Vaults, liquidators, and third-party UIs that compose ixs have to use that wrap or the tx reverts. Test on staging: unlisted wallet fails, listed wallet works.

A sane first week

  1. Clone klend. Confirm the ids above still match the README and curator quickstart.
  2. Install @kamino-finance/klend-sdk. Read one mainnet market and one obligation on a throwaway wallet.
  3. Deposit and withdraw a tiny size. Simulate every time.
  4. Only then borrow, liquidation hooks, or vault shares.
  5. Curators: market → reserves → farms → Squads. Staging first (--staging), not a hot key on prod.

People and links

Kamino Lend surfaces
WhatWhere
Productkamino.finance
Docskamino.com/docs
ProgramKamino-Finance/klend
TS SDK + CLIklend-sdk · npm @kamino-finance/klend-sdk
APIapi.kamino.finance
X@kamino

Resources

Keep reading

Get new articles in your inbox

Technical deep-dives on Solana tooling, infrastructure, and ecosystem. No noise.