Liquid Staking (LSTs)
Liquid staking tokens (LSTs) represent staked SOL that trades as SPL mints. Integrate them when users want staking yield without locking native SOL or when protocols accept LST collateral.
Recipe
Quick-reference recipe card - copy-paste ready.
# Stake SOL for jitoSOL via Jito CLI / stake pool UI
spl-token balance J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn// Sanctum - swap between LSTs
const res = await fetch("https://sanctum-api.example/swap", {
method: "POST",
body: JSON.stringify({ inputMint: "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn", amount: "1000000000" }),
});When to reach for this:
- Treasury holds yield-bearing SOL exposure.
- Lending markets accept jitoSOL/mSOL as collateral.
- Routing stake pool deposits in a wallet or vault product.
- Unified LST liquidity via Sanctum.
Working Example
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
const jitoSolMint = address("J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn");
const msolMint = address("mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So");
const [jitoSupply, msolSupply] = await Promise.all([
rpc.getTokenSupply(jitoSolMint).send(),
rpc.getTokenSupply(msolMint).send(),
]);
console.log("jitoSOL supply:", jitoSupply.value.amount);
console.log("mSOL supply:", msolSupply.value.amount);What this demonstrates:
- Each LST is a distinct SPL mint with its own stake pool program.
- Supply grows as users stake; exchange rate vs SOL increases over time.
- Integrations must reference exact mint pubkeys, not ticker symbols alone.
Deep Dive
How It Works
- User deposits SOL into a stake pool program; receives LST minted 1:1 at current exchange rate.
- Pool delegates SOL to validators; staking rewards increase SOL-per-LST rate.
- Redeeming burns LST and returns SOL (instant or delayed depending on pool liquidity).
- Sanctum routes swaps between LSTs using pool liquidity and stake pool integrations.
Major LST Mints (mainnet)
| LST | Mint | Operator |
|---|---|---|
| jitoSOL | J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn | Jito |
| mSOL | mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So | Marinade |
| bSOL | bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1 | BlazeStake |
Rust Notes
// Convert LST amount to SOL equivalent using on-chain exchange rate
pub fn lst_to_sol(lst_amount: u64, sol_per_lst: u64, precision: u64) -> Result<u64> {
lst_amount
.checked_mul(sol_per_lst)
.and_then(|v| v.checked_div(precision))
.ok_or(ErrorCode::MathOverflow.into())
}Gotchas
- Exchange rate drift - UI showing 1:1 SOL:LST is wrong. Fix: Read stake pool
sol_value/token_supplyeach render. - Wrong mint - Many fake LST tokens exist. Fix: Allowlist mints from official docs only.
- Depeg events - LST can trade below NAV under stress. Fix: Show market price and NAV separately for collateral.
- Withdrawal delays - Instant unstake may have fees or limits. Fix: Document delayed vs instant paths in UX.
- Validator risk - LST yield depends on operator performance. Fix: Disclose operator and commission in product copy.
- Collateral haircuts - Lending protocols haircut LST vs SOL. Fix: Read market LTV params on-chain.
Alternatives
| Alternative | Use When | Don't Use When |
|---|---|---|
| Native stake | Maximum simplicity, no DeFi | You need composable collateral |
| SOL only | Widest acceptance | You forfeit staking yield |
| LRT/restaking products | Extra yield layers | You want audited, simpler risk |
FAQs
Do LST balances rebase?
No - balances stay fixed; the SOL value per token increases via exchange rate.
How do I get the SOL value of jitoSOL?
Read the Jito stake pool state account or use their API/SDK for stake_pool_exchange_rate.
What is Sanctum?
A liquidity layer routing swaps between many LST mints - useful when your protocol accepts multiple LSTs.
Can I use LST in Jupiter swaps?
Yes - LST mints trade like any SPL token on aggregated routes.
How does jitoSOL relate to Jito MEV?
Jito operates the stake pool and MEV infrastructure; tips contribute to jitoSOL yield. See Jito & MEV.
Are LSTs safe collateral?
Protocols apply haircuts due to depeg and liquidity risk - never treat 1 LST = 1 SOL for lending math.
How do I stake from a program PDA?
Rare and complex - stake pool deposits need signer rules. Most protocols use client-signed deposits.
Devnet LST testing?
Limited pools - clone mainnet stake pool accounts or use Surfpool 0.12.0 fork.
What fees do stake pools charge?
Deposit, withdrawal, and epoch management fees vary - read Fee fields in pool state.
How often does exchange rate update?
Every epoch when staking rewards are credited to the pool - typically ~2 days on mainnet.
Related
- Jito & MEV - Jito stake pool and tips
- Lending & Borrowing - LST collateral
- Vote Accounts & Staking - native staking mechanics
- DeFi Integrations Best Practices - LST allowlist policy
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.