peard
Overview

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 chainInstrumentPrograms
Path Anosynthetic perpetualpeard_perps
Path Byesbonding curve against the real assetpeard_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.

Read the full mechanism

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:

VenueQuote inWho serves it today
Asset exists, venue accepts itMeteora DBCUSDCeveryone
Asset exists, venue refuses itpeard_ammthe asset itselfnobody
No asset exists at allpeard_perpsUSDC collateralnobody

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.

peard: the oracle is outside

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.

peard_perps: the oracle is inside

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.