CU-optimized on-chain Solana router.
o8%8888,
o88%8888888.
8'- -:8888b
8' 8888
d8.-=. ,==-.:888b
>8 `~` :`~' d8888
88 ,88888
88b. `-~ ':88888
888b ~==~ .:88888
88888o--:':::8888
`88888| :::' 8888b
8888^^' 8888b
d888 ,%888b.
d88% %%%8--'-.
/88:.__ , _%-' --- -
'''::===..-' = --.
The program hasn't been audited. Use at your own risk.
Deployment address: FiCPMBXAsryUHu3Cf89YQ3cXcnACX7e7ybn1hip5HT6P
The router supports two modes of execution:
- chained: output of hop
Nfeeds asamount_into hopN+1, single slippage check at end. - split: each hop reads its own
amount_in, per-step slippage check on output delta.
List of supported programs:
- AlphaQ
- Aquifer
- BisonFi
- HumidiFi
- Obric
- Scorch
- SolFi
- Tessera
- ZeroFi
CU benchmarks between Mona, Jupiter and direct (non-router) program hit:
| market | direct | mona | jup |
|---|---|---|---|
| alphaq | 30,047 | 32,413 | 36,894 |
| aquifer | 74,069 | 79,924 | 80,183 |
| bisonfi | 69,748 | 71,968 | 76,656 |
| goonfi | — | — | 87,703 |
| humidifi | 41,194 | 47,342 | 52,723 |
| obric | 54,406 | 56,813 | 61,111 |
| scorch | TODO | TODO | TODO |
| solfi | 82,616 | 90,086 | 99,717 |
| tessera | — | 63,198 | 79,376 |
| zerofi | 34,734 | 37,238 | 41,910 |
swaps done at slot: 413,144,803
Simulation time comparison (single-hop sim_tx) ran on a Macbook M4 Pro:
The routing relies on a flat account layout, each adapter owns its full account slice.
Overview of the expected Instruction data:
selector=0x01 (swap_v1) selector=0x01 (swap_v1)
flags=0x01 (chained) flags=0x02 (split)
───────────────────────────────── ─────────────────────────────────
┌──────────────────────┐ ┌──────────────────────┐
│ flags (1B) │ │ flags (1B) │
│ amount_in (8B) │ │ num_steps (1B) │
│ amount_out_min (8B) │ ├──────────────────────┤
│ num_steps (1B) │ │ step[0].dex (1B) │
├──────────────────────┤ │ step[0].a_to_b (1B) │
│ step[0].dex (1B) │ │ step[0].amt_in (8B) │
│ step[0].a_to_b (1B) │ │ step[0].out_min (8B) │
│ ... │ │ ... │
└──────────────────────┘ └──────────────────────┘
header: 18B, step: 2B each header: 2B, step: 18B each
accounts:
┌──────────────────────────────────────────────┐
│ [0] payer (signer, writable) │
│ [1..N₀] hop 0 remaining accounts │ ← dex knows its own slice width
│ [N₀..N₁] hop 1 remaining accounts │ (mints, user TAs, vaults, etc.
│ ... │ all packed per-adapter)
└──────────────────────────────────────────────┘
LICENSE: MIT
