Liquidity Pool
The Aureus protocol automatically grows its own AUR/SOL liquidity by seeding a Meteora DLMM pool with protocol revenue. This creates a constantly deepening liquidity floor for AUR, funded entirely by arena activity — no team LPing required.
Architecture
graph TD
MATCHES["Matches Scored"] -->|"10% protocol cut"| PROTOCOL["Protocol Revenue"]
PROTOCOL -->|"40%"| LP_FUND["LP Fund<br/>(arena.lp_fund)"]
LP_FUND -->|"threshold reached"| DEPLOY["DeployLiquidity<br/>(permissionless)"]
DEPLOY --> WSOL["Vault wSOL ATA"]
WSOL -->|"syncNative"| SYNC["Balance Updated"]
SYNC -->|"ExecuteMeteoraLP"| METEORA["Meteora DLMM Pool<br/>AUR/SOL"]
METEORA -->|"swap activity"| FEES["Trading Fees Accrue"]
FEES -->|"ClaimPoolFees"| STAKERS["Staker Reward Pool"]How It Works
1. LP Fund Accumulates
Every scored match routes 40% of the protocol's 10% cut into arena.lp_fund:
Per match: 0.02 SOL × 10% × 40% = 0.0008 SOL added to LP fund2. Threshold Reached → Deploy
Once lp_fund exceeds the deployment threshold, anyone can trigger deployment. This is fully permissionless — no admin key needed.
3. Multi-Instruction Transaction
Deployment happens as a single atomic transaction with three instructions:
graph LR
subgraph TX["Single Transaction"]
IX1["IX 1: DeployLiquidity<br/>(transfer SOL → wSOL ATA)"] --> IX2["IX 2: syncNative<br/>(update wSOL balance)"]
IX2 --> IX3["IX 3: ExecuteMeteoraLP<br/>(CPI → Meteora add_liquidity)"]
end| Step | Instruction | What It Does |
|---|---|---|
| 1 | DeployLiquidity (IX 11) | Moves lamports from vault PDA to vault's wSOL ATA |
| 2 | syncNative (SPL Token) | Syncs the wSOL ATA balance to reflect deposited lamports |
| 3 | ExecuteMeteoraLP (IX 13) | CPIs into Meteora's add_liquidity_one_side with vault PDA signing |
Why three instructions? Solana's runtime prevents mixing direct lamport manipulation with CPIs in a single instruction (
UnbalancedInstructionerror). Splitting them across instructions in the same transaction keeps atomicity while respecting runtime rules.
4. One-Sided Liquidity
The protocol adds one-sided SOL liquidity — it doesn't need to pair SOL with AUR tokens. This avoids diluting AUR supply and uses all accumulated SOL efficiently:
- SOL goes into bins below the current active price
- When AUR price rises, sell pressure is absorbed by this SOL
- When AUR price drops, the SOL converts to AUR (buying the dip automatically)
5. Fee Collection — Both Tokens
Swap activity on the DLMM pool generates trading fees in both AUR and SOL. Anyone can call ClaimPoolFees (IX 14) to:
- Update fee accruals — CPI into Meteora's
update_fees_and_rewards - Claim fees — CPI into Meteora's
claim_fee, transferring both tokens to vault ATAs - Route by token type:
- wSOL fees →
staker_reward_pool(distributed to AUR stakers). If no stakers exist, redirected to T1 SOL jackpot. - AUR fees →
swap_fee_aur_jackpot→ added to T1 token jackpot when triggered (transferred from vault ATA, not re-minted)
graph LR
SWAP["DEX Traders<br/>swap AUR ↔ SOL"] -->|"trading fees"| POS["DLMM Position<br/>(vault PDA owns)"]
POS -->|"ClaimPoolFees IX"| CPI["CPI: update_fees<br/>+ claim_fee"]
CPI --> SPLIT{"Token type?"}
SPLIT -->|"wSOL"| CHECK{"Stakers exist?"}
CHECK -->|"Yes"| STAKERS["staker_reward_pool"]
CHECK -->|"No"| JP["T1 SOL Jackpot"]
SPLIT -->|"AUR"| JACKPOT["T1 token_jackpot"]Meteora DLMM
The protocol uses Meteora's DLMM (Dynamic Liquidity Market Maker) for concentrated liquidity:
| Feature | Value |
|---|---|
| Pool Type | Customizable Permissionless |
| Bin Step | 100 (1% per bin) |
| Token Pair | AUR / SOL |
| Position Owner | Vault PDA (trustless) |
| Bin Range | Configurable via InitPoolPosition |
Why DLMM?
- Concentrated liquidity — Capital efficiency far exceeds constant-product AMMs
- On-chain position — The vault PDA owns the position directly, no delegation
- Fee capture — Trading fees flow back to the protocol (and stakers)
- Composable — All interactions are CPIs, fully auditable on-chain
Position Management
InitPoolPosition (IX 12)
Creates a Meteora DLMM position owned by the vault PDA:
| Parameter | Type | Description |
|---|---|---|
lower_bin_id | i32 | Lower bound of the position's bin range |
width | i32 | Number of bins to cover |
Example: lower_bin_id = -35, width = 70
→ Position covers bins -35 to +35 (70 bins around active price)The position is created via CPI into Meteora's initialize_position with the vault PDA as the owner (signer).
Bin Arrays
Each bin range requires initialized bin array PDAs. The protocol creates these during setup:
graph LR
BA_NEG["Bin Array -1<br/>(bins -70 to -1)"] --> POS["Position<br/>(bins -35 to +35)"]
BA_0["Bin Array 0<br/>(bins 0 to +69)"] --> POSInstructions Reference
DeployLiquidity (IX 11)
| Account | Type | Description |
|---|---|---|
| Anyone | signer | Permissionless cranker |
| Arena PDA | writable | Reads/zeros lp_fund |
| SOL Vault | writable | Source of lamports |
| Destination | writable | Vault's wSOL ATA |
Data: [11] — No additional parameters needed.
InitPoolPosition (IX 12)
| Account | Type | Description |
|---|---|---|
| Payer | signer, writable | Pays rent |
| Vault PDA | — | Position owner |
| Position | signer, writable | New keypair |
| LB Pair | — | DLMM pool |
| System Program | — | For account creation |
| Rent Sysvar | — | Rent check |
| Event Authority | — | DLMM event auth |
| DLMM Program | — | Meteora program |
Data: [12, lower_bin_id_i32_le, width_i32_le]
ExecuteMeteoraLP (IX 13)
| Account | Type | Description |
|---|---|---|
| Anyone | signer | Cranker |
| Vault PDA | writable | Signs CPI as position owner |
| Vault wSOL ATA | writable | Source of wSOL |
| Position | writable | DLMM position |
| LB Pair | writable | DLMM pool |
| DLMM Program | — | Meteora |
| SOL Reserve | writable | Pool's SOL reserve |
| wSOL Mint | — | Native mint |
| Bin Arrays | writable | Lower + upper bin arrays |
| Token Program | — | SPL Token |
| Event Authority | — | DLMM event auth |
Data: [13, amount_u64_le, active_id_i32_le]
ClaimPoolFees (IX 14)
| Account | Type | Description |
|---|---|---|
| Anyone | signer | Permissionless |
| Arena PDA | writable | Updates staker_reward_pool + swap_fee_aur_jackpot |
| Vault PDA | — | Signs CPI as position owner |
| Position | writable | DLMM position |
| LB Pair | writable | DLMM pool |
| Bin Array Lower | writable | For fee calculation |
| Bin Array Upper | writable | For fee calculation |
| Reserve X | writable | Pool's token X reserve |
| Reserve Y | writable | Pool's token Y reserve |
| Vault ATA X | writable | Fee destination (token X) |
| Vault ATA Y | writable | Fee destination (token Y) |
| Token X Mint | — | Identifies token X |
| Token Y Mint | — | Identifies token Y |
| Token Program | — | SPL Token |
| Event Authority | — | DLMM event auth |
| DLMM Program | — | Meteora |
Data: [14] — No additional parameters.
Security Properties
- Trustless — All instructions are permissionless. No admin key can redirect funds.
- Atomic — The 3-instruction deploy TX either fully succeeds or fully reverts.
- Non-custodial — The vault PDA owns the position. Private keys never touch LP funds.
- Front-running resistant — LP deployment uses the accumulated fund, not user tokens.
- No dilution — One-sided SOL liquidity means no extra AUR is minted for LP.
Lifecycle Summary
graph TD
A["Arena matches<br/>generate protocol revenue"] --> B["40% goes to<br/>lp_fund"]
B --> C{"lp_fund ><br/>threshold?"}
C -->|"No"| A
C -->|"Yes"| D["Anyone calls<br/>DeployLiquidity TX"]
D --> E["SOL added to<br/>Meteora DLMM pool"]
E --> F["Trading generates<br/>swap fees"]
F --> G["Anyone calls<br/>ClaimPoolFees"]
G --> H1["wSOL fees →<br/>staker_reward_pool"]
G --> H2["AUR fees →<br/>T1 token jackpot<br/>(transfer-based)"]
H1 --> I["Stakers earn<br/>more SOL"]
H2 --> J["Jackpot grows<br/>(1/500 trigger)"]
I --> A
J --> AThe result is a self-reinforcing flywheel: more matches → more liquidity → more trading → more fees → stakers earn SOL + jackpot pool grows → more demand for AUR → more matches.