Get Market Information
Retrieve market-wide TVL metrics for deposits and borrows.- TypeScript
Copy
Ask AI
import { createSolanaRpc, address } from '@solana/kit';
import { KaminoMarket } from '@kamino-finance/klend-sdk';
const slotDuration = 400; // ms
const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');
const marketPubkey = address('7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF');
const market = await KaminoMarket.load(rpc, marketPubkey, slotDuration);
console.log({
deposits: market!.getTotalDepositTVL(),
borrows: market!.getTotalBorrowTVL(),
});
Get Reserve Information
Check detailed metrics for all reserves including TVL, APY, and utilization rates.- TypeScript
Copy
Ask AI
import { createSolanaRpc, address } from '@solana/kit';
import { KaminoMarket } from '@kamino-finance/klend-sdk';
const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');
const marketPubkey = address('DxXdAyU3kCjnyggvHmY5nAwg5cRbbmdyX3npfDMjjMek');
const slotDuration = 400; // ms
const slot = await rpc.getSlot().send();
const market = await KaminoMarket.load(rpc, marketPubkey, slotDuration);
for (const reserve of market!.getReserves()) {
console.log(`Reserve ${reserve.symbol}:`);
console.log(` Deposit TVL: ${reserve.getDepositTvl().toFixed(2)}`);
console.log(` Borrow TVL: ${reserve.getBorrowTvl().toFixed(2)}`);
console.log(` Borrow APY: ${reserve.totalBorrowAPY(slot)}%`);
console.log(` Supply APY: ${reserve.totalSupplyAPY(slot)}%`);
console.log(` Utilization: ${reserve.calculateUtilizationRatio()}%`);
}
Get User Obligation Info
Retrieve detailed obligation information including deposits, borrows, and health metrics.- TypeScript
Copy
Ask AI
import { createSolanaRpc, address } from '@solana/kit';
import { KaminoMarket, VanillaObligation, PROGRAM_ID } from '@kamino-finance/klend-sdk';
const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');
const marketPubkey = address('7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF');
const userAddress = address('EZC9wzVCvihCsCHEMGADYdsRhcpdRYWzSCZAVegSCfqY');
const market = await KaminoMarket.load(rpc, marketPubkey, 400, PROGRAM_ID);
const kaminoObligation = await market!.getObligationByWallet(
userAddress,
new VanillaObligation(PROGRAM_ID)
);
if (!kaminoObligation) {
console.log('No obligation found for user:', userAddress);
} else {
console.log('Obligation Info:');
console.log('Owner:', kaminoObligation.state.owner.toString());
console.log('\nDeposits (Collateral):');
const deposits = [...kaminoObligation.deposits.values()];
deposits.forEach((deposit) => {
console.log(`Reserve:`, deposit.reserveAddress.toString());
console.log(` Amount:`, deposit.amount);
console.log(` Market Value:`, deposit.marketValueRefreshed);
});
console.log('\nBorrows:');
const borrows = [...kaminoObligation.borrows.values()];
borrows.forEach((borrow) => {
console.log(`Reserve:`, borrow.reserveAddress.toString());
console.log(` Amount:`, borrow.amount);
});
console.log('\nMetrics:');
console.log('Loan-to-Value:', kaminoObligation.loanToValue());
console.log('Borrow Utilization:', kaminoObligation.refreshedStats.borrowUtilization);
console.log('Number of Positions:', kaminoObligation.getNumberOfPositions());
}
Get All User Obligations
Retrieve all obligations for a user wallet, including different obligation types across the market.- TypeScript
Copy
Ask AI
import { createSolanaRpc, address } from '@solana/kit';
import { KaminoMarket, PROGRAM_ID, ObligationTypeTag } from '@kamino-finance/klend-sdk';
const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');
const marketPubkey = address('7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF');
const userWallet = address('Hs9ioQZ2pCUyvS18anwmBxjQJsZrMPShwTMLySD6Us3V');
const market = await KaminoMarket.load(rpc, marketPubkey, 400, PROGRAM_ID);
const obligations = await market.getAllUserObligations(userWallet);
if (obligations.length === 0) {
console.log('No obligations found for wallet:', userWallet);
} else {
console.log(`Found ${obligations.length} obligation(s):\n`);
obligations.forEach((obligation, i) => {
console.log(`Obligation ${i + 1}:`);
console.log('Address:', obligation.obligationAddress.toString());
console.log('Type:', ObligationTypeTag[obligation.obligationTag]);
console.log('Owner:', obligation.state.owner.toString());
console.log('\nDeposits (Collateral):');
const deposits = [...obligation.deposits.values()];
deposits.forEach((deposit) => {
console.log(` Reserve:`, deposit.reserveAddress.toString());
console.log(` Amount:`, deposit.amount);
console.log(` Market Value:`, deposit.marketValueRefreshed);
});
console.log('\nBorrows:');
const borrows = [...obligation.borrows.values()];
borrows.forEach((borrow) => {
console.log(` Reserve:`, borrow.reserveAddress.toString());
console.log(` Amount:`, borrow.amount);
console.log(` Market Value:`, borrow.marketValueRefreshed);
});
console.log('\nMetrics:');
console.log('Loan-to-Value:', obligation.loanToValue());
console.log('Borrow Utilization:', obligation.refreshedStats.borrowUtilization);
console.log('Number of Positions:', obligation.getNumberOfPositions());
});
}
Get All Obligations by Reserve
Retrieve all obligations that have deposits in a specific reserve. Useful for analyzing reserve utilization and user exposure.- TypeScript
Copy
Ask AI
import { createSolanaRpc, address } from '@solana/kit';
import { KaminoMarket, PROGRAM_ID, ObligationTypeTag } from '@kamino-finance/klend-sdk';
// Note: This example requires a paid/dedicated RPC node. Public RPCs will hit rate limits.
const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');
const marketPubkey = address('7u3HeHxYDLhnCoErrtycNokbQYbWGzLs6JSDqGAv5PfF');
const reserveAddress = address('37Jk2zkz23vkAYBT66HM2gaqJuNg2nYLsCreQAVt5MWK');
const market = await KaminoMarket.load(rpc, marketPubkey, 400, PROGRAM_ID);
const obligations = await market.getAllObligationsByDepositedReserve(reserveAddress);
if (obligations.length === 0) {
console.log('No obligations found with deposits in reserve:', reserveAddress);
} else {
console.log(`Found ${obligations.length} obligation(s) with deposits in this reserve:\n`);
obligations.forEach((obligation, i) => {
console.log(`Obligation ${i + 1}:`);
console.log('Address:', obligation.obligationAddress.toString());
console.log('Type:', ObligationTypeTag[obligation.obligationTag]);
console.log('Owner:', obligation.state.owner.toString());
const reserveDeposit = [...obligation.deposits.values()].find(
(deposit) => deposit.reserveAddress.toString() === reserveAddress.toString()
);
if (reserveDeposit) {
console.log('\nDeposit in this Reserve:');
console.log(' Amount:', reserveDeposit.amount);
console.log(' Market Value:', reserveDeposit.marketValueRefreshed);
}
const otherDeposits = [...obligation.deposits.values()].filter(
(deposit) => deposit.reserveAddress.toString() !== reserveAddress.toString()
);
if (otherDeposits.length > 0) {
console.log('\nOther Deposits:');
otherDeposits.forEach((deposit) => {
console.log(' Reserve:', deposit.reserveAddress.toString());
console.log(' Market Value:', deposit.marketValueRefreshed);
});
}
const borrows = [...obligation.borrows.values()];
if (borrows.length > 0) {
console.log('\nBorrows:');
borrows.forEach((borrow) => {
console.log(' Reserve:', borrow.reserveAddress.toString());
console.log(' Market Value:', borrow.marketValueRefreshed);
});
}
console.log('\nMetrics:');
console.log('Loan-to-Value:', obligation.loanToValue());
console.log('Number of Positions:', obligation.getNumberOfPositions());
console.log();
});
}
Get User Transaction History
Access all transaction history for a user’s wallet across deposits, borrows, repayments, and liquidations.- TypeScript
Copy
Ask AI
async function getUserObligationTransactions(): Promise<void> {
const marketPubkey = 'DxXdAyU3kCjnyggvHmY5nAwg5cRbbmdyX3npfDMjjMek'; // market address
const userPubkey = 'EZC9wzVCvihCsCHEMGADYdsRhcpdRYWzSCZAVegSCfqY'; // user address
const API_BASE_URL = 'https://api.kamino.finance';
const url = `${API_BASE_URL}/kamino-market/${marketPubkey}/users/${userPubkey}/transactions`;
const res = await fetch(url);
if (!res.ok) {
throw new Error(`Request failed: ${res.status} ${res.statusText}`);
}
const data = await res.json();
console.log(data);
}
getUserObligationTransactions().catch(console.error);