Overview
The Multiliquid SVM program does not implement a native laddered pricing model on chain. Instead, each pair stores one live discount rate and one live redemption fee. A capital provider can still build a laddered pricing model on top of those fields by using an off-chain worker to monitor rolling volume and update fees as thresholds are crossed.- Each
Pairhas oneredemption_fee_bpsand onediscount_rate_bps, which can be updated by the capital provider admin every block if needed - Each
Pairsources liquidity from two vaults: one vault for the stablecoin and one vault for the RWA - Swaps consume whatever fee values are currently stored in the pair
This page assumes an existing pair with stablecoin as quote and RWA as base, Treasury routing disabled, and no protocol spread charge. It uses
discount_rate_bps for the primary example, but the same approach can be mirrored onto redemption_fee_bps. For other stored mint orders, the capital provider selects the field matching the intended direction. Treasury-enabled capital providers also account for their Treasury position, because idle vault balances alone do not represent available liquidity.RWA1 while applying a tiered discount schedule across rolling 24-hour BaseToQuote volume.
The first ~$2.5M should clear at a 1% discount, giving the user 99% of the RWA1 NAV value in stablecoin.
From $2.5M to $5M, the discount is set at 5%. From $5M to $10M, the discount is set at 15%.
This pricing model is enforced by an off-chain worker that tracks cumulative rolling 24-hour volume for swaps on
RWA1.
- The capital provider keeps between
$1,000,000and$2,500,000of live stablecoin inventory in the vault at any given time - An off-chain worker measures rolling 24-hour volume
- The worker decides which tier is currently active
- When a threshold is crossed, the worker updates
discount_rate_bpsviaupdate_pair - The capital provider uses
add_liquidityto top up the stablecoin vault when balances fall below the chosen threshold, for example$1,000,000, potentially sourcing capital from a yield-generating product such as Multiliquid Treasury
What The Program Gives You
Pair Fee Fields
The pair stores only the currently active fee values:redemption_fee_bpsis the live fee forQuoteToBasediscount_rate_bpsis the live fee forBaseToQuote- the current ladder rung is represented by the current value stored in the pair
Live Fee Updates
The capital provider can rotate the active rung withupdate_pair:
Shared Vault Liquidity
Liquidity is not stored per pair. It is stored per capital provider + mint:- one vault per capital provider and stable mint
- one vault per capital provider and RWA mint
vault_authority PDA derived from ["vault_authority", liquidity_provider]. Each vault is the associated token account for (mint, vault_authority), not a token account owned by the global program authority.
So:
add_liquiditydeposits into the capital provider’s vault for a mintremove_liquiditywithdraws from that same vault- if the capital provider has multiple pairs using the same mint, those pairs share the same vault balance
Directional Fee And Inventory Mechanics
The two fee fields are directional:
For the scenario in this page, the ladder is a discount ladder, so the relevant direction is:
- user sells RWA to the capital provider
- the capital provider pays out stablecoin
- the live price lever is
discount_rate_bps - the constrained inventory is the capital provider’s stablecoin vault
- a rolling 24-hour counter off chain
- periodic
update_paircalls that change onlydiscount_rate_bps - periodic stablecoin
add_liquidityandremove_liquiditycalls
redemption_fee_bps can stay fixed while only discount_rate_bps changes with the ladder.
If the capital provider also wants a ladder on the opposite direction, the same pattern applies:
- maintain a separate rolling notional book for
QuoteToBase - choose the active
redemption_fee_bpsfrom that book - pass both the current
redemption_fee_bpsand currentdiscount_rate_bpsintoupdate_pair
Reference Ladder
For the example strategy, define the activediscount_rate_bps from rolling 24-hour notional:
This should be read as:
- there is one active rung at any point in time
- the worker recomputes the rolling 24-hour total
- the worker updates the pair to the fee corresponding to the current band
How To Measure The Rolling 24-Hour Volume
For a discount ladder onBaseToQuote, the cleanest operational metric is:
- on
BaseToQuote, the user receives stablecoin from the capital provider stable vault - protocol fees are paid separately from the capital provider fee-token ATA
- so
amount_outis the total stable inventory consumed by the fill
$1.00 stablecoin such as USDC, that rolling stable outflow is already a practical dollar proxy.
For
BaseToQuote, do not rely on the raw amount_in field from the SwapExecuted event as your primary volume metric. In this direction, the useful inventory measure is stablecoin consumed from the capital provider vault, which is amount_out.How The Live Inventory Band Works
Assume the capital provider wants to keep up to$2,500,000 of stablecoin live in the vault, and refill when the balance drops below $1,000,000.
Define:
- target stable vault balance:
$2,500,000 - refill floor:
$1,000,000 - refill amount:
target - current_vault_balance
- if the stable vault balance is below
$1,000,000, calladd_liquiditywith the delta back to$2,500,000 - if the stable vault balance is above
$2,500,000, callremove_liquidityfor the excess
$1,000,000 and $2,500,000 while allowing the capital provider to manage on-chain inventory independently from the rolling fee ladder.
That is the core distinction:
- live liquidity is what is currently sitting in the vault
- rolling 24-hour volume is what has traded through the vault over time
$10,000,000 while keeping between $1,000,000 and $2,500,000 of stablecoin inventory on chain, replenishing inventory as needed during the day.
Why remove_liquidity Matters
remove_liquidity is just as important as add_liquidity.
In this model:
BaseToQuoteflow drains stablecoin from the stable vault and accumulates RWA in the RWA vaultQuoteToBaseflow does the opposite: it adds stablecoin to the stable vault and drains RWA from the RWA vault
remove_liquidity in two practical ways:
- sweep excess stablecoin out of the stable vault when reverse flow pushes it above the
$2,500,000cap - sweep accumulated RWA out of the RWA vault after users sell RWA into the capital provider
Single-Pair And Multi-Pair Variants
Single Pair
For oneRWA / stablecoin pair, the model is simple:
- track rolling 24-hour volume for that pair
- update that pair’s
discount_rate_bps - manage the pair’s shared stable vault balance
Multiple Pairs Sharing The Same Stablecoin
If the capital provider wants one ladder across several pairs that all share the same stablecoin:- the stable vault is already shared across those pairs because the vault is keyed by
capital provider + stable mint - the worker should aggregate rolling notional across the full set of managed pairs
- the worker should push the same active
discount_rate_bpsto every pair in that set - stablecoin rebalancing is done once at the shared stable vault
Multiple Pairs Across Different Stablecoins
If the capital provider spans multiple stablecoins:- each stablecoin still has its own vault
- the worker must normalize fills into a common USD measure off chain
update_pairmust still be called per pair- liquidity rebalancing must still be done per stable vault
update_pair, and rebalances vault inventory with add_liquidity and remove_liquidity.
What To Do At 10M Rolling Volume
Because this page assumes no pause controls, the$10,000,000 level should be treated as a soft operating budget, not as a hard protocol-enforced stop.
In practice, the worker usually does one or both of the following once rolling 24-hour volume reaches the final band:
- keep the pair on the highest configured discount tier
- stop topping the stable vault back up after it drains below the capital provider’s desired exposure
- the fee schedule is controllable
- the live inventory band is controllable
- the exact rolling-volume ceiling is not enforced atomically by the program
Practical Summary
The current SVM swap program is sufficient to run this laddered model today:- use
discount_rate_bpsas the current active rung forBaseToQuote - keep
redemption_fee_bpsfixed unless the capital provider also wants a ladder onQuoteToBase - measure rolling 24-hour stable outflow off chain
- update the pair fee when the rolling total enters a new band
- keep only
$1,000,000to$2,500,000of live stablecoin inventory in the vault withadd_liquidityandremove_liquidity - if the ladder spans multiple pairs, aggregate volume off chain and push the selected rung to each managed pair
- treat the
$10,000,000threshold as an operational target rather than a hard on-chain invariant
Pair Management
Full reference for pair instructions, account structures, and liquidity management
Integration Guide
SDK installation, quoting, and swap execution