Overview

Quote assets and pairs

A launch is quoted in something other than SOL, which is the point of the venue. The catalogue is StonkFun's, not ours, and a meaningful part of it cannot be used by the program as currently written.

The catalogue#

The launchable pairs come from StonkFun's public API, polled into the indexer and served at /quotes. Read against mainnet on 2026-09-23 that endpoint returns 509 pairs, every one of them marked both launchable and launchLabReady.

The catalogue moves, so re-read it rather than quoting this page

An earlier read of StonkFun's /pairs?launchable=true&launchLabReady=true returned 503, then 504, and it is 509 today. Every count on this page is a property of one day's list. The shapes are stable; the totals are not.

The quote is not always a stock

Stags is described as launching a token priced in a stock, and the stocks are the interesting case, but StonkFun's catalogue is broader than that. Of the 509 pairs, 24 are tokenized stocks. The rest are memecoins, exchange-listed tokens and a handful of other categories, listed below.

What the 509 are made of#

Category is StonkFun's own label on each pair. The token program column was resolved separately, by reading all 509 mint accounts from Solana mainnet with getMultipleAccounts on 2026-09-23, because the catalogue does not publish it.

CategoryPairsToken-2022Classic SPLDecimals seen
custom3891941956, 9, 8, 5, 11, 4, 2, 12
backpack7460146, 9, 8, 4
xstock242408
prestock7709
currency5056, 9
solana3039, 6
leverage3036
collectible2026
tessera2209
Total509287222

Categories, counts and decimals from the live /quotes response; token programs from getMultipleAccounts against Solana mainnet, all 509 mints resolved, 2026-09-23. Decimals are listed most common first.

The tokenized stocks#

All 24 xstock pairs share the same shape: Token-2022, 8 decimals, no exceptions. They are the category the product was designed around, and the only one where "a token priced in a stock" is literally true.

the 24 xstock symbols, from the live /quotes response
AMZNX  APPLX  BRKX   COINX  CRCLX  DFDV
GLDX   GMEX   GOOGLX HOODX  INTCX  KOX
MCDX   METAX  MSFTX  MSTRX  NVDAX  PLTRX
QQQX   SPCXX  SPYX   STRCX  TSLAX  VIDAX

A further 7 pairs are labelled prestock, also Token-2022, but at 9 decimals rather than 8.

The Token-2022 constraint#

222 of the 509 pairs cannot launch as the program is written

init_policy takes a single token_program account and uses it for every token account it creates: the quote escrow, the base escrow, the bankroll, the holder rewards account and the fee key account. The base mint is always created by LaunchLab's initialize_with_token2022, so that one program must be Token-2022. A quote mint owned by the classic SPL Token program therefore cannot be paired, because the same account would have to be both programs at once.

222 of the 509 catalogue pairs are classic SPL (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA). They appear in the launch picker and would fail at init_policy.

None of the 24 tokenized stocks is affected: every one of them is Token-2022. The constraint bites in the custom category, where it is close to an even split, and on the currency, solana, collectible and leverage categories, which are classic SPL throughout. This is listed again on what is not built yet, because it is a real gap and not a design choice.

Token programAddressPairs
Token-2022TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb287
Classic SPL TokenTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA222

The stocks themselves launch, and that took a fix

The classic SPL problem above spares the 24 tokenized stocks, but for a while a second problem did not. init_policy used to fail with InvalidAccountData for any quote mint carrying a PausableConfig extension, which every xStock sampled has, because the program sized its token accounts against a build of spl-token-2022 that predates the extension.

Fixed on 2026-09-23 by creating all of the policy's token accounts through the associated token program, which sizes them against the live Token-2022 program instead. init_policy has since been proven to succeed against a real cloned SPYX mint. The story is kept, as history, on what is not built yet.

One figure worth having right if you are provisioning rent: a SPYX token account is 179 bytes, measured on chain. That is the 165-byte base, one byte of account type, then ImmutableOwner, TransferHookAccount and PausableAccount. A plain token account is 165.

Three further properties of the live SPYX mint make it easier to work with than its extension list suggests. Its TransferHook.programId is the system program, which Token-2022 treats as no hook at all, so a transfer needs no extra account metas. Its PausableConfig.paused is false. And its DefaultAccountState is Initialized rather than Frozen, so no account the program creates needs thawing by the issuer before it can receive anything.

Decimals, and why they matter#

The quote's decimals are not cosmetic. StonkFun's raise amount is a raw amount in the quote's decimals, and the Raydium SDK's default of 85 SOL becomes 850 units on an 8-decimal stock and 85,000 on a 6-decimal stablecoin. StonkFun's own warning is that a launch which copies the constant blindly will graduate at a market cap nobody intended.

DecimalsPairs
6372
982
844
55
42
112
21
121

From the live /quotes response, 2026-09-23, all 509 pairs. Every program instruction that moves quote reads decimals off the mint and passes them to transfer_checked, so the program itself is decimal-agnostic; the launch sizing is not.

The quote mint is recorded on the policy#

There is no protocol-wide quote mint. Every quote-denominated account on a policy, meaning the bankroll, both escrows, the holder rewards account and every registered venue account, is held in that policy's own quote_mint, and register_venue_account rejects a token account held in anything else. The protocol fee destination is stored as a wallet rather than a token account for the same reason: its associated token account is derived per call, for whichever stock that policy happens to be quoted in.

Reading the catalogue yourself#

GET /quotes
$ curl -s 'http://127.0.0.1:8941/quotes?search=SPY' | head -20
{
  "source": "stonkfun:/pairs + /launchlab/pricing",
  "items": [
    {
      "mint": "XsoCS1TfEyfFhfvj8EtZ528L3CaKBDBRqRapnBbDF2W",
      "symbol": "SPYX",
      "name": "SP500",
      "decimals": 8,
      "category": "xstock",
      "launchable": true,
      "launchLabReady": true,
      "logoUrl": "https://www.stonkfun.xyz/api/asset/quote-logo/...",
      "policyCount": 0,
      "startMarketCapUsd": null,
      "graduationMarketCapUsd": null,
      "graduationMultiple": null
    }
  ]
}

Why the market cap fields are null here

startMarketCapUsd, graduationMarketCapUsd and graduationMultiple come from StonkFun's /launchlab/pricing endpoint per quote, and the local indexer has not populated them for every pair. A null here means the indexer has no reading, not that the value is zero. The same distinction is made explicitly elsewhere in the API by the absent envelope.