Pool Parameters
Fields, units, validation, and update authorities
Match this reference to your program version. Authorities below mean the pool admin or protocol admin.
Creation and identity
| Field | Rule |
|---|---|
config | Fixed parent config; pool PDA seed |
pool_id | Fixed creator-selected u64 salt |
| Token mints/order | 2–10 unique mints; fixed |
token_program | Mint owner at creation; stored for validation |
| Token decimals | From mint; maximum 18 |
| Initial virtual balances | Positive u64 per token |
The initializer's payer becomes pool admin. initialize_pool_alt separately
creates/freezes an ALT and stores pool.lookup_table; zero means none
provisioned through that instruction.
Pricing and fees
| Field | Units / bounds | Updated by |
|---|---|---|
normalized_weight | Bps; each 100–9,900; total 10,000 | Enabled manager |
virtual_balance | Raw u64 | Swaps, liquidity, manager |
actual_balance | Raw LP-owned reserves; initially zero; excludes protocol fees | Swaps, liquidity |
protocol_fees_owed | Raw protocol-owned fees | Accrual, collection |
swap_fee_rate | u32 / 1,000,000; 0–100,000; 3,000 = 0.3% | Pool admin |
protocol_fee_rate | u16 / 10,000; 0–10,000 (0%–100% of base fee) | Protocol admin |
Initial protocol share comes from config.default_protocol_fee_rate;
read the live pool value. Leverage is derived,
not a stored multiplier.
Pool and token switches
| Field | When disabled | Authority |
|---|---|---|
pool_enabled | Blocks swaps, proportional joins/exits, manager updates | Protocol |
swaps_enabled | Blocks swaps; proportional liquidity remains available | Pool / protocol |
Token is_active | Blocks selling that token in; buying out remains possible | Pool / protocol |
All start enabled. Liquidity still requires pool_enabled.
Sell-off window and surge fee
Pool admin calls set_max_selloff with one entry per token.
| Field | Units / constraints |
|---|---|
max_selloff_pct | 0–10,000 bps; zero disables window and surge |
max_selloff_period_length | Seconds; positive when enabled |
variable_fee_threshold_pct | Window-fill bps; below 10,000 when surge enabled |
variable_fee_slope_low_pct | Surge-rate bps at threshold |
variable_fee_slope_mid_pct | Surge-rate bps at optional kink |
variable_fee_slope_high_pct | Surge-rate bps at full fill; maximum 10,000 |
variable_fee_kink_pct | Whole percent; zero disables kink; otherwise threshold_bps / 100 < kink < 100 |
Rates satisfy low ≤ mid ≤ high. High = 0 disables surge without removing
a nonzero sell-off cap. Updating parameters does not reset usage;
lowering the cap can immediately constrain trades. See Fees.
Range-manager settings
Pool admin configures these fields; protocol admin can only disable the existing manager.
| Field | Meaning |
|---|---|
range_manager, range_manager_enabled | Authorized signer and enable flag |
range_manager_max_vb_change_pct | Relative change per update, 0–10,000 bps; zero forbids change |
range_manager_max_weight_change_pct | Same scale and zero semantics, for weights |
range_manager_min_update_interval_secs | Seconds; zero removes interval |
range_manager_min_leverage_bps, range_manager_max_leverage_bps | 10,000 = 1×; zero disables that bound; min ≤ max when both set |
range_manager_last_updated | Last successful update timestamp |
Bands apply only to changed virtual balances with positive actual reserves. See Range management for update checks.
Token extension policy
SPL Token and Token-2022 mints undergo layout, decimal and extension checks. For Token-2022:
chosen = creator_override ?? config.banned_extensions
floor = config.hard_banned_extensions or compiled fallback when zero
pool.banned_extensions = chosen OR floorDefaults ban TransferFeeConfig, MintCloseAuthority,
InterestBearingConfig, PermanentDelegate, TransferHook,
ScaledUiAmount, and Pausable. The fallback bans NonTransferable.
Independent admission checks reject non-transferable tokens, Token-2022 native mint, a default account state other than initialized, paused mints, unknown extensions and malformed layouts. Clearing bitmap bits cannot bypass them. Active transfer hooks can be admitted when the effective bitmap permits them.
Protocol-admin changes to config defaults/floor affect future creation. Each pool stores its effective policy. Runtime transfers validate current mint/account functionality without reapplying a new config bitmap to existing pools.
The current instruction implementation accounts for epoch-dependent token transfer fees and accepts an extra-account tail for hooks and required memos. Hooks requiring additional signers are outside this transfer profile. Confirm support in the deployed program and matching SDK; SDK extension limits can be narrower than contract support. Admission does not guarantee that an issuer-controlled token will remain transferable.