System Overview
The Multiliquid Program is built on a modular, account-based architecture that enables atomic swaps between multiple permissioned Real World Asset (RWA) tokens and multiple stablecoins on Solana. The system is designed for institutional-grade operations with comprehensive access controls, transparent fee structures, and flexible pricing mechanisms.Design Principles
- Account-Based State: All state stored in Program-Derived Address (PDA) accounts
- Anchor Framework: Type-safe program development with automatic serialization
- Atomicity: All operations either fully succeed or fully revert within a transaction
- Transparency: All state changes emit comprehensive events via Anchor’s event system
- Extensibility: New assets can be integrated without program upgrades
Core Account System
The program consists of five primary account types that work together to enable secure, atomic swaps between RWAs and stablecoins.How the Accounts Work Together
At the heart of the system, GlobalConfig acts as the central configuration holding program-wide settings including the admin, fee wallet, and protocol fees. When an admin registers a new token, an AssetConfig account is created to store the token’s NAV pricing sources and configuration. When a trading pair is created, a Pair account links an RWA to a stablecoin with LP-specific settings, while LpStableConfig tracks the LP’s stablecoin-specific pause state. Token custody is managed through Vault accounts derived from the LP and token mint, with protocol fees collected in FeeVault accounts per asset. This separation of concerns ensures each account focuses on its specialized responsibility while maintaining atomic execution.1. GlobalConfig Account
PDA Seeds:["global_config"]
The central configuration account managing program-wide settings.
Core Responsibilities
- Admin Management: Track current admin and pending admin transfer
- Fee Configuration: Store protocol fee percentage
- Global Pause: Control program-wide pause state
- Fee Wallet: Destination for claimed protocol fees
View GlobalConfig Instructions
Complete instruction details for global configuration management
2. AssetConfig Account
PDA Seeds:["asset", mint_address]
Per-token configuration storing NAV pricing sources and asset-level controls.
Asset Types
Core Responsibilities
- NAV Pricing: Store and manage up to 5 pricing sources per asset
- Price Validation: Enforce maximum price divergence between sources
- Asset Pause: Independent pause control per asset
- Usage Tracking: Track how many pairs reference this asset
View AssetConfig Instructions
Complete instruction details for asset configuration
3. Pair Account
PDA Seeds:["pair", liquidity_provider, stable_mint, asset_mint]
Trading pair state linking an RWA to a stablecoin with LP-specific configuration.
Core Responsibilities
- Fee Configuration: Store LP-specific redemption and discount fees
- Pair Identity: Link specific RWA and stablecoin tokens
- LP Ownership: Track the liquidity provider controlling this pair
- Pair Pause: Independent pause control per pair
View Pair Instructions
Complete instruction details for pair management
4. LpStableConfig Account
PDA Seeds:["lp_stable_config", stable_mint, liquidity_provider]
Per-LP, per-stablecoin configuration for controlling multiple pairs at once.
Core Responsibilities
- Batch Pause Control: Pause all pairs for a specific LP/stablecoin combination
- LP Identification: Link configuration to specific liquidity provider
- Stablecoin Association: Scope configuration to specific stablecoin
5. Vault Accounts
Vault PDA Seeds:["vault", mint_address, liquidity_provider]
Fee Vault PDA Seeds: ["fee_vault", mint_address]
Token accounts for custody and fee collection.
Vault (Liquidity Custody)
- Holds liquidity for a specific LP/token combination
- Shared across multiple pairs using the same LP and token
- Tracked by
UserVaultInfoaccount for usage counting
Fee Vault (Protocol Fees)
- Created per asset when asset config is initialized
- Protocol fees accumulate only in stablecoin fee vaults, since fees are always denominated in stablecoins
- Claimed via
claim_feesinstruction to fee wallet
6. UserVaultInfo Account
PDA Seeds:["user_vault_info", mint_address, liquidity_provider]
Tracks vault usage across pairs.
7. Program Authority
PDA Seeds:["program_authority"]
The program authority is a signer PDA used to authorize all outbound token transfers from vaults and fee vaults via CPI. It holds no state — it exists solely as a signing authority for the program.
Operational Flow
Swap Execution Flow
NAV Pricing System
The program supports three types of NAV (Net Asset Value) pricing sources:NavData Types
Price Aggregation
When multiple NAV sources are configured:- All prices are normalized to 9 decimal places
- Price divergence is validated against
price_difference_bps - If divergence exceeds threshold, the function returns 0 (blocking swaps)
- Average price is returned if all sources agree within tolerance
View Price Source Details
Complete documentation on NAV pricing configuration
Fee Structure
Protocol Fees
Configured inGlobalConfig.protocol_fees_bps:
- Range: 0-9900 basis points (0% - 99%)
- Applied to all swaps regardless of direction
- Collected in stablecoin fee vaults
- Claimed to
fee_walletviaclaim_feesinstruction
LP Fees
Configured per pair by the liquidity provider:| Fee Type | Direction | Description |
|---|---|---|
redemption_fee_bps | Stable → RWA | Fee charged when redeeming stablecoin for RWA |
discount_rate_bps | RWA → Stable | Fee charged when swapping RWA for stablecoin |
Fee Calculation Order
Stable → RWA (StableToAsset):- Calculate protocol fees and redemption fee simultaneously from input
- Deduct both fees from input amount
- Apply NAV exchange rate to post-fee amount
- Apply NAV exchange rate
- Apply discount rate to output
- Deduct protocol fees from discounted amount
Permission Model
The program implements a comprehensive permission model:Admin Role
Controlled by:GlobalConfig.admin
Permissions:
- Initialize and update global configuration
- Set and confirm new admin (two-step transfer)
- Initialize asset configurations
- Update asset configurations
- Initialize pairs on behalf of LPs
- Set pause state for assets and LP configs
Liquidity Provider Role
Identified by: Pair and vault ownership Permissions:- Update pair configuration (fees, pause state)
- Close pairs they own
- Add and remove liquidity from their vaults
- Set pause state for their LP stable configs
User Role (Permissionless)
Anyone can:- Execute swaps on active pairs
- Claim protocol fees (sent to fee_wallet)
Permission Hierarchy
Event System
The program emits events for all significant state changes using Anchor’s event system:Swap Events
Administrative Events
Events are emitted for configuration changes, pair updates, liquidity operations, and pause state changes.Extensibility
The program’s modular architecture enables straightforward extension:Adding a New Token
- Admin Action: Call
init_asset_config_accountwith NAV sources - Fee Vault Created: Automatic fee vault creation for the asset
- Configure NAV: Set appropriate pricing sources (Pyth, hardcoded, etc.)
- Test Integration: Validate NAV reads correctly
Adding a New Pair
- Admin Action: Call
init_pairspecifying LP, RWA, and stablecoin - Vaults Created: Automatic vault creation if needed
- LP Configuration: LP calls
update_pairto set fees and unpause - Add Liquidity: LP adds tokens to vaults
- Enable Trading: Pair is ready for swaps
Next: Security & Access Control
Review the comprehensive security measures, access controls, and pause mechanisms