This page covers concepts specific to Exponent Core. For general protocol concepts, see:
Vault
A vault is a single yield stripping market with a fixed maturity date. It holds SY in escrow, tracks the SY exchange rate, and mints PT and YT when users strip.
Each vault also owns its own YieldTokenPosition — this collects yield on unstaked YT (YT that was minted via strip but hasn’t been deposited into a user’s position). When a user deposits YT into their own position, yield tracking transfers from the vault’s position to theirs.
In the SDK, the Vault class is the primary entry point for interacting with a market. See the Vault Account Reference for the full onchain struct.
Yield Token Position
YT is a regular SPL token — the program cannot track yield on tokens held in a wallet. To earn yield, you deposit YT into a YieldTokenPosition, a per-user, per-vault PDA that escrows your YT and records the current SY exchange rate as your entry point (last_seen_index).
When you later stage yield, the program computes the delta between your entry rate and the current rate to determine how much interest you’ve earned. Earned amounts move into the position’s staged field, where they can be collected.
See the YieldTokenPosition Account Reference for the full onchain struct.
Yield Collection
Collecting yield is a multi-step process:
- Initialize position — Create a
YieldTokenPosition for the user via ixInitializeYieldPosition. One-time per vault.
- Deposit YT — Transfer YT into the position via
ixDepositYt. Yield tracking starts from this point.
- Stage yield — Call
ixStageYield to compute earned interest and emissions. This updates last_seen_index and moves earned amounts into staged.
- Collect — Call
ixCollectInterest (for SY interest) or ixCollectEmission (for reward tokens) to withdraw staged amounts.
ixStripFromBase combines steps 1–2 by automatically depositing YT into the yield position after stripping. The position must be initialized first.
See the SDK Quickstart for code examples.
Emissions
Emissions are auxiliary reward tokens distributed to YT depositors, separate from SY interest. For example, a vault wrapping a Kamino lending position might distribute KMNO tokens as emissions.
Each vault can have multiple emission tokens. The vault tracks each emission’s index via EmissionInfo, and each yield position tracks its own per-emission state via YieldTokenTracker.
Emissions use a per-share index model:
earned = (current_index - last_seen_index) × sy_balance
current_index — the vault’s EmissionInfo.final_index, synced from the SY program’s SyState.emission_indexes
last_seen_index — the position’s YieldTokenTracker.last_seen_index, updated when yield is staged
sy_balance — the position’s SY-equivalent balance (YT converted to SY at final_sy_exchange_rate)
To collect: call ixStageYield first (updates both interest and emission trackers), then ixCollectEmission with the emission index (0-based, matching the vault’s emission list).