Reverse engineered
The OTC desk, read off the chain account by account, and what our Raydium version does instead.
READ ON 2026-11-03otcdesks.cash launches pump.fun coins that pay holders in tokenized stocks. We read its front end, the coins it launched and the transactions its wallets sign, then rebuilt the idea on Raydium LaunchLab with nothing in the middle: no hot wallet, no server, no worker. Every row below links to what we read. Where we could not confirm something, it says not found.
The OTC desk, on chain
| What it does | Evidence | |
|---|---|---|
Launch. A normal pump.fun create_v2, signed by the creator's wallet and the mint key. | create tx, another | verified |
Fees go to their wallet. In the same launch the creator signs pump's fee sharing: create_fee_sharing_config + update_fee_shares, 10000 bps to one wallet, 2k5h…pP5y. | tx, tx | verified |
For good. The coin's sharing config has admin_revoked = true: the creator can never point the fees anywhere else. | sharing config | verified |
| Claim and split. Their wallet sweeps the creator fee and splits it in one transaction: 67.5% stays for holders, 12.5% protocol, 10% buyback, 10% desk pot. | curve coin, graduated coin | verified |
| One pot for every coin. The holder share of all coins sits in that same hot wallet. There is no per-coin vault on chain. | 2k5h…pP5y | verified |
| Buy the stock. A Jupiter swap, SOL into the reward, lands in the hot wallet. | swap tx | verified |
Pay holders. Separate transactions from the hot wallet, 12 transferChecked each. No claim, no swap, no account opening inside. | payout, Token-2022 payout | verified |
| Holders open their own token accounts. 0.00307848 SOL per stock, and a $20 minimum holding, both constants in their front end. | their JS bundle + docs | verified |
| Buyback and burn. One wallet buys their token through Jupiter, then burns it in a second transaction. | buy, burn | verified |
| Desks. A Metaplex Core collection, 2,408 minted, its update authority is a config account of their own program. | collection, program | verified |
| The 5,000 desk cap. | nothing on chain says it | not found |
Desk pot address. Their docs name KLR4…UnJu; that address has no account. The split pays BZcv…BucR. | BZcv…BucR | docs differ |
| Their totals (revenue, paid to holders, coins launched) come from their own API. | /api/revenue, /api/rewards, /api/coins | not checked on chain |
The pump.fun pieces
The desk rides on pump.fun's own programs. We read them in lalalune/pumpfun-source, a community reconstruction of pump.fun's public programs. We do not run pump.fun's code and we are not pump.fun.
| pump.fun | What it does there | What we do on Raydium |
|---|---|---|
create_v2 | Creates the coin, takes a quote mint and the is_holder_reward flag. | LaunchLab initialize from your wallet. The basket is frozen in the metadata under extensions.otc. |
check_quote_mint_extensions | Refuses quote mints with Token-2022 extensions it can't handle. | Every reward mint is read before you can pick it: transfer hooks, transfer fees, frozen default accounts, pauses. Anything that would break a payout is blocked. |
distribute_fee_to_holders | An authority key passes a list of amounts; the program transfer_checkeds them from a holder-rewards account. | The creator's own wallet sends transferChecked to each holder. Amounts come from balances read from chain at that moment. |
create_fee_sharing_config, update_fee_shares | Routes a coin's creator fee to shareholders by bps. | LaunchLab has no fee sharing. The fee stays in your creator vault until you claim it. The split is written into the payout transactions. |
distribute_creator_fees | Pays the sharing config's shareholders out of the creator vault. | One transaction claims the vault (claimCreatorFee) and burns 10% as the main token. |
sweep_creator_fee | Moves the curve's creator fee into the creator vault. | LaunchLab pays the creator fee into its vault on every trade, nothing to sweep. |
buy_exact_quote_in_v2 | Spends an exact amount of the quote. | Each asset gets an exact SOL amount, swapped through a Jupiter route inside the transaction that pays its first holders. |
What our version does
The creator presses Pay holders on the coin page and signs once (one signAllTransactions):
- Transaction 1: claim the LaunchLab creator fee vault, spend 10% buying the main token (on its curve, or through Jupiter) and burn exactly what was bought.
- Then per asset: swap that asset's share of the holder cut, pay as many holders as fit 1,232 bytes, and carry the rest in follow-up transactions.
- Holders are the top wallets by balance at that moment, read with
getProgramAccounts. Pool and program accounts never count, nor does the creator. - Every transaction carries this desk's key and a memo, which is how the board, Rewards and Burns read history back from the chain with no database.
Holders get 90%, or 80% with 10% kept by the creator; the creator picks at launch. Where the OTC desk sends 12.5% to its protocol and 10% to desk holders, we take nothing.
What runs where
Raydium's program enforces the curve, the trading fees (0.25% protocol, 0.75% platform, 0.05% creator) and that only the creator wallet can claim its vault. The signed transactions do the claim, the burn, the swaps and the transfers; each is all or nothing. The creator decides when: payouts happen when the creator presses the button, and the basket in the metadata is followed by this site's code, not by Raydium's program. LaunchLab keeps one fee vault per creator wallet, so one claim takes the fees of every coin that wallet created.
The creator fee on Raydium's open platform is 0.05% of volume, so payouts start small and grow with volume.
The stocks
The 25 tokenized stocks on the launcher all trade on Solana with more than $20K of liquidity. Their mints are Token-2022 and carry the same extensions. We read them from the mints:
| Extension | What it means for a payout |
|---|---|
DefaultAccountState = initialized | New token accounts start unfrozen, so a fresh wallet can receive a stock. |
TransferHook, no program set | Transfers run no extra program. |
PausableConfig | The issuer can pause transfers. Not paused when we read them; the launcher checks again before you pick. |
PermanentDelegate | The issuer can move or burn any balance. |
| freeze authority set | The issuer can freeze an account. |
ScaledUiAmountConfig | Wallets show balances times a multiplier (1 to about 1.006 today). Payouts move raw units. |
A token account for one of these mints costs 0.00307848 SOL of rent (3,078,480 lamports), the same number the OTC desk quotes.
Stock curves on LaunchLab
While looking for a way to price coins in stocks, we decoded every LaunchLab global config on chain: 646 of them. 24 use a tokenized stock as the quote, with thousands of curves on them. Three of them: TSLAx Fny7…e2nR, NVDAx 2NuV…WFQ4 and SPYx B7ct…9adg. Raydium's own API does not list them. Coins on this desk trade against SOL and pay in stocks.
The numbers
| Assets per coin | 1 to 10, weighted 1 to 100 |
| Holder share | 90%, or 80% with 10% to the creator |
| Main token burn | 10% of every claimed vault |
| Holders paid per payout | top 5 to 50 wallets, picked at launch |
| Trading fee | 0.25% protocol, 0.75% platform, 0.05% creator, read from the pool |
| Stock token account | 0.00307848 SOL, opened when the holder's share is worth more |
| Curve | 1B supply, 793.1M on the curve, 85 SOL to graduate, then a Raydium CPMM pool |
The accounts
| Raydium LaunchLab program | LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj |
| Raydium open platform | 4Bu96XjU84XjPDSpveTVf6LYGCkfW5FK7SNkREWcEfV4 |
| SOL curve config | 6s1xP3hpbAfFoNtUNF8mfHsjr2Bd97JxFJRWLbL6aHuX |
| This desk's key | 8b5CoZHeJHUvtibhbv5t3PJXu7vfb2yLCHo3z58pHbE7 |
| Swaps | Jupiter routes, JUP6…TaV4 |
| Main token | set at its launch |