The two paths
A vault holding a real asset, or a synthetic perpetual. One registry field decides which.
The venue has two instruments, and which one a market gets is decided by a single registry field.
Where a tokenised version of the asset exists on chain, the pool holds the real thing and quotes against it directly. That is the better answer whenever it is available, and 44 of the 111 registry entries qualify as of 2026-08-25.
Where no token exists, and for most of these no token is ever going to exist, a chart alone is not worth much. What is worth building is a position: being long the thing, and being able to close it later for more or less money than you opened it with. That needs a synthetic, and it needs funding to manufacture the other side.
| Underlying exists on chain | Instrument | Programs | |
|---|---|---|---|
| Path A | no | synthetic perpetual | peard_perps |
| Path B | yes | bonding curve against the real asset | peard_amm + peard |
Of the 111 pairables in the registry on 2026-08-25, 67 are index grade and therefore Path A. On devnet, 48 perp markets are live and 2 pools are live.
The router reads the grade
scripts/launch.ts is a router, not a launcher. It reads the registry entry,
reads the pairable account, and picks a path off one field:
grade == hard and an assetMint that really exists here -> PATH B
anything else -> PATH A
The paths are not exclusive. The PDA seeds are disjoint, so a hard pairable can carry both a perp and a pool. Calling this a recommendation rather than a partition is the honest framing, and the script says so itself.
A perpetual on something nobody can hold. The curve is virtual: nobody deposits into it, nobody owns a share of it, and its only job is to price size so that a large order costs more than a small one. Collateral is real and lives in a token vault denominated in the cluster's dollar mint.
base_reserve = depth_usd_e6 * 1e9 / price_twap
quote_reserve = depth_usd_e6
mark_price = quote_reserve * 1e9 / base_reserve
At launch the reserves are sized so the mark starts exactly at the index.
depth_usd is the free parameter, derived as max(50_000, 100 * price),
and it is also where the router refuses: a pairable whose one unit is worth
$419,200, like HOME-US-MED, would need $41.9m of depth to be tradeable at
sane impact, so the router says so and skips it rather than launching
something unusable.
Funding is what ties the curve to reality. When the curve trades above the index, longs pay shorts, and that payment is what makes being short attractive at exactly the moment nobody wants to be. Normally a perp tracks something with a deep spot market and arbitrage does most of the work. Here funding does all of it, because there is no spot market to arbitrage against, and most of the caution in the program is downstream of that fact.
Why Path B needs its own venue
Meteora's Dynamic Bonding Curve accepts a Token-2022 mint as a quote mint only
when MetadataPointer and TokenMetadata are its sole extensions:
if *mint_info.owner == Token::id() { return Ok(true); }
for e in extensions { if e != MetadataPointer && e != TokenMetadata { return Ok(false); } }
Every xStock and PAXG carries far more than that: permanentDelegate,
pausableConfig, defaultAccountState, transferHook, scaledUiAmountConfig.
So DBC refuses all 35 of the Token-2022 entries in the hard tier, which is
every tokenised equity, PAXG and all three Etherfuse bonds. USDC is a classic
SPL mint with no extensions and sails through, and so would the nine
classic-SPL hard entries.
Three tiers, and the middle one is the business:
| Venue | Quote in | Who serves it today | |
|---|---|---|---|
| Asset exists, venue accepts it | Meteora DBC | USDC | everyone |
| Asset exists, venue refuses it | peard_amm | the asset itself | nobody |
| No asset exists at all | peard_perps | USDC collateral | nobody |
Row 2 is the gap the venue was built for. Row 3 is a different problem entirely, and no venue's policy is involved in it: there is simply nothing to put in a pool.
The paths differ in where the oracle sits
This is the sharpest difference between them, and it is deliberate rather than incidental.
A frozen or stale price blocks accrual, claims and fulfilment. It never blocks a swap, because the swap happens in a pool that has never heard of the pairable. The worst case is a frozen chart.
The index decides funding and decides who is liquidatable, so a bad print costs somebody their position. Every path that consumes the index refuses a stale, frozen or expired one rather than working around it. A market whose index has aged out does not trade on the last good number. It stops.
peard_perps's state.rs is explicit that this inverts a property of the other
program, and both halves of the inversion are the point: refusing halts the book
rather than liquidating into a guess.
peard