Kamino Lend: isolated markets, vaults, and the klend program
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/262If 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.
| What | Id |
|---|---|
| klend mainnet (and current devnet id) | KLend2g3cP87fffoy8q1mQqGKjrxjC8boSyAYavgmjD |
| klend staging (mainnet) | SLendK7ySfcEzyaFqy93gDnD3RtrpXJcnRwb6zFHJSh |
| kvault mainnet | KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd |
| kvault staging | stKvQfwRsQiKnLtMNVLHKS3exFJmZFsgfzBPWHECUYK |
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.
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
- Clone klend. Confirm the ids above still match the README and curator quickstart.
- Install
@kamino-finance/klend-sdk. Read one mainnet market and one obligation on a throwaway wallet. - Deposit and withdraw a tiny size. Simulate every time.
- Only then borrow, liquidation hooks, or vault shares.
- Curators: market → reserves → farms → Squads. Staging first (
--staging), not a hot key on prod.
People and links
| What | Where |
|---|---|
| Product | kamino.finance |
| Docs | kamino.com/docs |
| Program | Kamino-Finance/klend |
| TS SDK + CLI | klend-sdk · npm @kamino-finance/klend-sdk |
| API | api.kamino.finance |
| X | @kamino |
Resources
Keep reading
Leases, not generic loans. Pirin mainnet. Solray program 9ATDq9…HJYy2. npm install @nolus/nolusjs.
First non-EVM chain for 0x Swap API. Instructions-only design so Solana apps keep control of CU, priority fees, and landing.
One SDK surface for quoting and executing value across Solana and 20+ other chains — intent solver, money market, bridge — plus agent skills.
Get new articles in your inbox
Technical deep-dives on Solana tooling, infrastructure, and ecosystem. No noise.
