Receipt Tokens

What this page is for: every receipt token rFlow currently supports — mainnet mint address, Pyth feed ID, accrual mechanism, and how the protocol values it at lock and settlement.

Overview#

A receipt token is what a DeFi protocol gives you when you deposit. It represents your position and appreciates as the underlying earns yield. rFlow locks these tokens in a PDA vault and lets you sell the appreciation between today and a fixed expiry.

Two accrual patterns

Exchange-rate tokens

Balance stays constant; value rises via a growing exchange rate (mSOL, jitoSOL, bSOL, cUSDC, kUSDC). Settlement reads the rate from Pyth on mainnet.

Fee-accumulating positions

Fees accrue on a position account and must be claimed (Meteora DAMM v2). During an active deal, the buyer claims directly.

Whitelist is on-chain
Only mints in ProtocolConfig.allowed_mints can be locked. The list is admin-managed via update_config. Want a new mint listed? See Integration · whitelist a mint.

Marinade Staked SOL (mSOL)#

Marinade Staked SOL

Marinade Finance · Liquid staking

mSOL
APY 6–8%
Mechanism
Exchange-rate appreciation
rFlow status
Live · Pyth-anchored
Pyth feed
MSOL/USD
Mainnet mint
mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So
Pyth feed ID
c2289a6a43d2ce91c6f55caec370f4acc38a2ed477f58813334c6d03749ff2a4

mSOL is Marinade's liquid staking token. The supply stays constant; staking rewards accrue by making each mSOL redeemable for slightly more SOL. The Pyth MSOL/USD feed gives the program an authoritative value at settlement — no caller value accepted on mainnet.

Jito Staked SOL (jitoSOL)#

Jito Staked SOL

Jito · MEV-enhanced liquid staking

jitoSOL
APY 7–9%
Mechanism
Exchange-rate appreciation
rFlow status
Live · Pyth-anchored
Pyth feed
JITOSOL/USD
Mainnet mint
J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn
Pyth feed ID
67be9f519b95cf24338801051f9a808eff0a578ccb388db73b7f6fe1de019ffb

jitoSOL works like mSOL with an added MEV boost: a slice of the MEV captured by Jito-Solana validators is redistributed to stakers, pushing realized APY ~1–2% above standard staking.

Blaze Staked SOL (bSOL)#

Blaze Staked SOL

SolBlaze · Liquid staking

bSOL
APY 6–8%
Mechanism
Exchange-rate appreciation
rFlow status
Live · Pyth-anchored
Pyth feed
BSOL/USD
Mainnet mint
bSo13r4TkiE4KumL71LsHTPpL2euBYLFx6h9HP3piy1
Pyth feed ID
89875379e70f8fbadc17aef315adf3a8d5d160b811435537e03c97e8aac97d9c

bSOL is SolBlaze's liquid staking token, designed for delegated staking to community validators. Same exchange-rate mechanism; settlement uses the Pyth BSOL/USD feed.

Kamino (kUSDC)#

Kamino kUSDC

Kamino Lend

kUSDC
APY 3–8% (variable, market-driven)
Mechanism
Reserve exchange-rate appreciation
rFlow status
Supported via whitelist · oracle-tolerant settlement
Pyth feed

Kamino kTokens are reserve-specific — the mint address for kUSDC depends on the Kamino market. Fetch the canonical mint via KaminoMarket.load() and reserve.state.collateral.mintPubkey from the Kamino SDK. rFlow does not assume a single kUSDC mint.

Because Kamino has no first-party Pyth USD feed for kTokens, settlement uses the bounded caller-value path: a value within ±10% of exchange_rate_at_lock is accepted.

Solend / Save (cUSDC)#

Solend cUSDC

Solend / Save · Lending

cUSDC
APY 2–6% (variable)
Mechanism
Exchange-rate appreciation
rFlow status
Supported via whitelist · oracle-tolerant settlement
Pyth feed
Mainnet mint
993dVFL2uXWYeoXuEBFXR4BijeXdTv4s6BzsCjJZuwqk

cTokens use the same Compound-style mechanism as kTokens — supply stays constant, value rises via an exchange rate that tracks accrued borrower interest. No first-party Pyth feed; settlement uses the bounded caller-value path.

Meteora LP Positions#

Meteora DAMM v2 Positions

Concentrated liquidity · Position NFT

NFT
APR 10–50%+
Mechanism
Fee accumulation on position
Meteora program
cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG
Different from exchange-rate tokens
A Meteora position has no shared exchange rate. Fees accrue in token A and token B and have to be claimed from the pool. rFlow tracks them via fee_a_at_lock and fee_b_at_lock snapshots and lets the buyer claim during the active deal.

When you list a Meteora LP deal:

  1. Optionally split your position with split_meteora_position to sell only a portion
  2. Lock the Position NFT in a rFlow NFT vault via create_meteora_lp_deal
  3. Fees accumulated before lock are snapshotted — claim those first if you want them
  4. During the deal, the buyer calls claim_meteora_fees to harvest new fees
  5. At settlement, settle_meteora_lp_deal returns the NFT to you
  6. Unwind anytime after with withdraw_meteora_liquidity

How values are calculated#

Exchange-rate tokens (mainnet path)

oracle valuation
1// Pyth gives us a price and an exponent
2// price * 10^exponent = current USD per unit token
3//
4// Combined exponent normalizes for token decimals and USDC's 6 decimals:
5let combined_exponent = exponent + USDC_DECIMALS - token_decimals as i32;
6let base_value = receipt_tokens_amount * price;
7
8let oracle_value = if combined_exponent >= 0 {
9 base_value * 10u128.pow(combined_exponent as u32)
10} else {
11 base_value / 10u128.pow((-combined_exponent) as u32)
12};
13
14// Example: 1 jitoSOL at $200, exponent = -8
15// tokens = 1_000_000_000 (9 decimals)
16// price = 20_000_000_000
17// value = 200_000_000 // 200 USDC (6 decimals)

Devnet / non-LST tokens (bounded caller value)

anti-manipulation bound
1// Expected value if exchange rate were exactly the one stored at lock
2let expected_value = receipt_tokens_amount * exchange_rate_at_lock / EXCHANGE_RATE_SCALE;
3
4// ±10% tolerance (ORACLE_TOLERANCE_BPS = 1000)
5let tolerance = expected_value * ORACLE_TOLERANCE_BPS / 10_000;
6let min_acceptable = expected_value - tolerance;
7let max_acceptable = expected_value + tolerance;
8
9require!(
10 current_token_value >= min_acceptable && current_token_value <= max_acceptable,
11 PayflowError::InvalidTokenValue
12);

Numerical examples#

Example 1 · Marinade mSOL (90 days)

At lock
Locked100 mSOL
Exchange rate1.180 SOL/mSOL
Principal value118 SOL
SOL price$160
Principal USD$18,880
Listing
Expected yield18,880 × 7% × 90/365 = $326
Discount (15%)$49
Selling price$277 USDC
Protocol fee (2%)$5.54
Seller receives$271.46
At settlement (T + 90 days)
Pyth MSOL/USD reads new rate: 1.197 SOL/mSOL
Current value: 100 × 1.197 = 119.7 SOL ≈ $19,152
Actual yield: 19,152 − 18,880 = $272
Yield tokens (buyer): 100 × ($272 / $19,152) = ~1.42 mSOL
Principal tokens (seller): 100 − 1.42 = ~98.58 mSOL
Buyer P&L: paid $277, receives mSOL worth ~$272 → slightly under
Seller P&L: got $271 cash on day 0, still owns ~98.58 mSOL worth its full principal

Example 2 · Meteora SOL/USDC LP (90 days)

Position snapshot
Position value$10,000
Pool TVL$2,000,000
Position share0.5%
Pool fees (30d)$150,000
Fee projection
Pool fees / day$5,000
My fees / day$25
90-day projection$2,250
Discount (30%)$675
Selling price$1,575 USDC
Note: Meteora fee deals depend on pool volume. If volume craters, the buyer's claims will fall short of $2,250. The 30% discount is the seller's buffer; the buyer prices their downside in.