Senior and Junior LP tokens are standard SPL token mints. They can be transferred between wallets, held by vaults, paired in AMMs, or accepted by external programs. The LP token itself does not expose a vault preview interface. The mint is only the transferable claim token. The tranching market account is the source of truth for NAV, utilization, coverage, fees, and lifecycle state. LP mints are initialized with the same decimals as the linked SY mint. Fetch mint metadata when displaying balances, and keep raw LP amounts in mint units when building instructions.
Token Addresses
| Token | SDK helper | Account field |
|---|---|---|
| Senior LP mint | market.lpMint(TrancheSide.Senior) or market.mintLpSenior | mint_lp_senior |
| Junior LP mint | market.lpMint(TrancheSide.Junior) or market.mintLpJunior | mint_lp_junior |
| User Senior LP ATA | market.lpAta(TrancheSide.Senior, owner) | Derived from Senior LP mint |
| User Junior LP ATA | market.lpAta(TrancheSide.Junior, owner) | Derived from Junior LP mint |
| SY mint backing the market | market.syMint | sy_mint |
| Market SY escrow | market.tokenSyEscrow | token_sy_escrow |
Transfers do not run onchain market sync.
market.reload() only refreshes the SDK’s local account state; it does not update NAV onchain. For LP pricing, read the latest market account state. Deposit and withdrawal instructions run their own market-update path during execution.State and Field Map
The following fields are the core inputs for DeFi integrations. The SDK column shows the TypeScript surface. The Rust column shows the account fields after deserializingExponentTranchingMarket.
| Purpose | SDK helpers or fields | Rust account fields | Raw dimension | Reference |
|---|---|---|---|---|
| Lifecycle state | state.marketState, state.statusFlags | market.market_state, market.status_flags | Enum and bitmask | Market State, Status Flags |
| Raw NAV | getSrNetAssetValue(), getJrNetAssetValue() | market.financials.sr_raw_net_asset, market.financials.jr_raw_net_asset | Number NAV derived from raw SY units | NAV Accounting, TranchingMarketFinancials |
| Effective NAV | getSrEffNetAssetValue(), getJrEffNetAssetValue() | market.financials.sr_effective_net_asset, market.financials.jr_effective_net_asset | Number NAV after waterfall accounting | NAV Accounting, LP Pricing |
| LP supply | state.trancheSupplyState.totalSeniorLpSupply, state.trancheSupplyState.totalJuniorLpSupply | market.tranche_supply_state.total_senior_lp_supply, market.tranche_supply_state.total_junior_lp_supply | Raw LP mint units | TrancheSupplyState, LP Pricing |
| SY assigned to each tranche | state.trancheAssetState.seniorSyAmount, state.trancheAssetState.juniorSyAmount | market.tranche_asset_state.senior_sy_amount, market.tranche_asset_state.junior_sy_amount | Raw SY token units | TrancheAssetState |
| Capacity | getSrRemainingCapacityNetAssetValue(), getJrRemainingCapacityNetAssetValue() | Derived from NAV, supply, and risk fields. See Rust Capacity Function | Raw Number NAV. LP capacity helpers return raw LP units | Capacity Helpers, Restrictions |
| Utilization | state.financials.utilization | market.financials.utilization | Number ratio. 1_000_000_000_000 means 1.0 | Utilization |
| Coverage requirement | state.riskConfig.minCoverage, state.riskConfig.beta | market.risk_config.min_coverage, market.risk_config.beta | Number ratios | Coverage, TranchingRiskConfig |
| Observation window | state.riskConfig.fixedTermDurationSec, state.financials.fixedTermEndTs | market.risk_config.fixed_term_duration_sec, market.financials.fixed_term_end_ts | Seconds and Unix timestamp seconds | Recovery Period, TranchingRiskConfig |
| Fees | state.protocolFeeConfig.*, pending fee share fields | market.protocol_fee_config.*, market.tranche_supply_state.pending_*_protocol_fee_lp_shares | Fee rates are Number ratios. Pending fee shares are raw LP units | Fee Structure, Units and Fees |
| Return allocation | state.returnModel, state.financials.currentJuniorReturnShare | market.return_model_storage, market.financials.current_junior_return_share, market.financials.tw_junior_return_share_accrued | Curve data and Number ratios | Return Curves, ReturnModel |
Rust Field Example
Rust integrations usually start from the deserialized market account and then read the same inputs used by the SDK helpers.effective_nav with total_*_lp_supply, see LP Pricing.
Rust Capacity Function
Capacity is derived. There is no singleExponentTranchingMarket field that equals getSrRemainingCapacityNetAssetValue() or getJrRemainingCapacityNetAssetValue().
lp_price, see LP Pricing. For lp_out, see Deposit Previews.
fixedTermDurationSec is the fixed-term observation period duration used by Recovery Period accounting. If it is 0, fixed-term recovery is disabled. fixedTermEndTs is the timestamp when the current recovery window ends.
tranchingFromNumber and tranchingNumberToRaw only convert the Number fixed-point encoding. In Rust, use precise_number::Number; one unit is Number::DENOM, or 1_000_000_000_000. Apply token mint decimals separately when showing SY, LP, or NAV amounts to users.
Token Integration Notes
| Area | Guidance |
|---|---|
| Transfers | LP tokens are transferable SPL tokens. A transfer does not change market NAV or utilization |
| Custody | Vaults and lending protocols can hold LP token accounts directly |
| Pricing | Price balances from effective NAV, not from raw SY balance alone |
| Redemption | Redemption rules depend on market state, utilization, and tranche side |
| Risk display | Show Senior and Junior separately. They do not have the same risk profile |