create_market can only be called by
the admin key in the global config. This is deliberate. The entire safety
model assumes the synthetic market stays small relative to the real market it
references, and that assumption is enforced at listing time, off chain, by
depth criteria. Permissionless listing with on-chain depth attestations is a
roadmap item.
Depth criteria
A listing has to demonstrate that the reference market is deep enough that the synth market cannot become its price setter. Graded cards (flagship asset class):- Graded population large enough that no single holder controls the float. Mid-tier cards with hundreds or thousands of graded copies qualify; pop-10 grails do not.
- Steady sale frequency: enough recent prints per lookback window for the price feed’s median estimator (the relayer, see card pipeline) to be meaningful.
- Multi-venue presence: prices observable on at least two independent venues (eBay/TCG aggregators, tokenized marketplaces) so the cross-source agreement check has something to compare.
- Sustained trading volume, not a one-week spike.
- Listing depth near the floor: manipulating the floor must require moving many listings, not one.
- Holder count and distribution consistent with a real market.
Sizing the hedge reserve (max_open_interest)
max_open_interest sets the size of the hedge reserve: the preminted
allocation hedgers can draw against collateral, denominated in token base
units. (In derivatives language this bounds open interest, total short debt.)
It is the on-chain expression of the depth criteria: the synthetic market is
never allowed to grow beyond a fixed multiple of what the reference market
actually trades. As a rule of thumb, size the reserve at a small multiple of
the collectible’s typical lookback-window sale volume, and revisit as the
reference market grows or shrinks. The reserve binds only CDP draws; curve
and AMM supply are bounded by the launch itself.
What a listing consists of
1
Underlying spec
A precise definition of the unit: for cards, game + set + card + grade
(for example PSA 10 of one specific card); for NFT collections, the
verified collection mint. Baskets define members and fixed weights. This
becomes the relayer config entry.
2
Market parameters
A full
MarketParams set: oracle windows and breaker, funding constants,
collateral ratios, fees, curve shape, graduation target, insurance share,
and the open-interest cap. See Parameters for
every field. Passing null uses the global defaults.3
create_market
The admin calls
create_market(collection, params), which initializes the
market account, the synth mint, the pool, treasury, and item reserve token
accounts, and the SOL vault, premints the fixed supply (curve allocation,
hedging reserve, and item-swap reserve),
and revokes the mint authority, all in one transaction. The
collection pubkey is an opaque identifier: for cards it identifies the
card+grade spec, for NFTs the collection mint.4
Relayer activation
The market is created in
Bootstrap with no index. The relayer starts
pushing prices, and graduation requires a nonzero
index, so a market cannot go live before its oracle feed does.The program itself is underlying-agnostic. Everything that distinguishes a
card market from an NFT market lives in the relayer configuration and the
listing policy described here, not in the on-chain code.

