# plain language, no schema required
"Track every Kamino lending reserve,
expose current supply APY and
utilisation, and stream updates
when a rate moves more than 5 bps."
import { createClient } from "@solanasdk/kamino-reserves";
const sdk = createClient({ apiKey: process.env.SDK_KEY });
// fully typed — no decoding, no PDAs
const reserves = await sdk.listReserves();
reserves.forEach(r => {
console.log(r.symbol, r.supplyApy, r.utilization);
});
// schema-validated stream
sdk.onRateChange({ minBps: 5 }, e => {
alert(`${e.symbol}: ${e.from} → ${e.to}`);
});
use solanasdk_kamino::{Client, RateFilter};
let sdk = Client::from_env()?;
// typed structs, generated from the IDL
let reserves = sdk.list_reserves().await?;
for r in &reserves {
println!("{} {:.2}% util {:.1}%",
r.symbol, r.supply_apy, r.utilization);
}
// stream with a validated shape
let mut s = sdk.rate_changes(RateFilter { min_bps: 5 }).await?;
while let Some(e) = s.next().await { handle(e); }
import { useReserves, useRateChanges } from "@solanasdk/react";
export function ReserveTable() {
const { data, isLoading } = useReserves();
useRateChanges({ minBps: 5 }, toast);
if (isLoading) return <Skeleton />;
return data.map(r => (
<Row key={r.address}
symbol={r.symbol}
apy={r.supplyApy}
util={r.utilization} />
));
}