Overview

Introduction

Stags is a launchpad fee policy. A token launches priced in a tokenized stock, and an on-chain account decides, once and permanently, what its trading fees become. The fees do not go to a creator wallet. They go to work.

What it is#

A token launches through StonkFun, a front end and adoption layer over Raydium LaunchLab. The quote asset is a tokenized stock, so the launch is a token priced in a stock rather than in SOL. The Stags program is made the pool creator, which is the account the creator's share of the pool fee is forwarded to, and from then on an account called the policy owns that fee stream.

The policy is set at launch by the deployer and can be locked forever. It holds two splits: what claimed fees become, and what the vault's profit becomes. Nothing else about the token is special. It trades on the same curve everything else on LaunchLab trades on.

ThingValue
Program id4fhFQ8hgbswQq7PNsrwCcxkpE1oae6fsFcLvAjWEnPhD
Launch venueStonkFun, over Raydium LaunchLab LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj
LP and buyback venuecpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG
Quote assetsTokenized stocks (xStocks), Token-2022, 8 decimals
Perps venueHyperliquid
Options venueDerive v3, api.derive.xyz/v3. Not available today, see below.
Leverage cap5x, hard
Deployed to mainnetYes. Config FFv8SPhxKfj6DBfnUGaRiK6M6E3KDau1Yp9efDswmZ9H, 6 origins and 21 models registered.
What a launch costs0.0176 SOL, measured

How the pieces fit#

One Solana program, four off-chain services and two venues it cannot see. The program holds the policy, the bankroll, the escrows and the venue allowlist. A keeper anybody can run calls the permissionless money instructions. An attestor on its own key reports remote equity. An agent runner exists only in Agent mode. An indexer reads events and accounts and serves the API this documentation quotes throughout, and never writes anything.

Two legs of that picture are not the program's and are drawn dashed and gold below. StonkFun's forwarding of the creator share happens off chain, on StonkFun's schedule, and lands directly in the program's own quote escrow. The value bridge to Hyperliquid is an operator-run relayer rather than anything a Solana program can verify. Derive is dashed red because its own provisioning endpoints are down, so an options vault cannot be created at all today.

The system in four layers. At the top, the launch: a Raydium LaunchLab pool, with StonkFun collecting the pool fee and forwarding the creator share off chain, straight into the program's own quote escrow. In the middle, the Stags program on Solana, holding the policy, the bankroll, the escrows and the venue allowlist. Below it, four off-chain services: a keeper anyone can run, an attestor on its own key, an agent runner used only in Agent mode, and an indexer that reads and serves the API the web app and this documentation use. To Hyperliquid, value crosses through an operator-run relayer and equity comes back as an attestation. Derive cannot be provisioned today, because the two endpoints that would create a subaccount and a scoped key are returning errors. The program is live on Solana mainnet.THE LAUNCHRaydium LaunchLabthe pool and the curveStonkFunforwards the fee, off chaininto quote_escrowTHE PROGRAM, ON SOLANAStagsPolicybankrollescrows, holder_rewardsVenueAccount allowlistoperator-run relayerattested equityHyperliquidperpetualsDeriveoptions, not provisionableOFF CHAINthese drive and read the program aboveKeeperroute, compound,sweep, burnAttestorits own key,bounded by railsAgent runnerAgent mode only,inside the mandateIndexerreads only,serves the APIWeb appand this documentationimplementedoff chain, somebody else'snot available todaythe program is live on Solana mainnet

The gold legs are real and are not the program's: StonkFun forwards the creator share into quote_escrow on its own schedule, and an operator-run relayer carries value to Hyperliquid. Derive is dashed red because its own provisioning endpoints are returning errors, so a per-token options vault cannot be created today.

Where the money goes#

The program keeps two escrows and treats the two legs of the pair differently, because only one of them is money and the other is already the thing holders want destroyed.

A fee path in six steps. A trade on the LaunchLab pool pays a one percent fee, which StonkFun collects in full on chain. StonkFun then forwards the creator share off chain to the pool creator, which is the policy program address, where it arrives as an ordinary transfer rather than something the program claims. That address is the associated token account the program calls its quote escrow, so nothing has to move it. Route then splits the escrow three ways and empties it: the protocol cut, the bankroll share, and the LP share, which goes to a staging account rather than staying put.A trade on the LaunchLab poolStonkFun collects the pool's 1%on chain, platform_scale = 100%It forwards the creator's shareoff chain, on their scheduleIt arrives at the policy addressan ordinary transfer, nothing is claimedThat address is the escrowATA(creator, quote_mint), nothing to sweepquote_escrowrouteProtocol cutprotocol_fee_bpsfirst, off the topBankrollto_bankroll_bpsthe trading vaultLP shareto_lp_bpsmoved to lp_quotethe two shares sum to 10000 bps

Gold is off chain and StonkFun's: real, measured across five launches, and committed to by nothing. Everything from the escrow down is this program, live on mainnet.

The fees arrive by forwarding, and they land in the account route already reads

A Stags launch is StonkFun's standard mode on LaunchLab, which has no creator position to claim from. StonkFun collects the pool's 1% fee and forwards the creator's share itself, and the policy PDA is the pool's creator, so the share is forwarded to the policy PDA.

This is observed rather than taken from documentation. The forwarder is StonkFun's own platform_fee_wallet, the transaction is two instructions (create the creator's quote associated token account, which StonkFun pays for, then transfer into it), and the destination is ATA(creator, quote_mint), which is exactly this program's quote_escrow. Nothing extra has to be built to receive it: route already reads that account. The cadence across five real launches is on the fee split.

Two consequences worth carrying. claim_fees is not the mechanism for this launch type, so Policy.fees_claimed stays at zero while real fees flow, and nothing on chain commits StonkFun to forwarding, to a share or to an interval. Both are on what is not built yet.

quote fees ──▶ protocol cut
           ──▶ to_lp_bps       ──▶ compounded into the LP position
           ──▶ to_bankroll_bps ──▶ the bankroll, which buys and holds risk

base fees  ──▶ burned, unconditionally, no swap needed
              (the claim path delivers quote only, see below)

bankroll equity above its high water mark
           ──▶ profit_to_holders_bps  ──▶ buys the token back, then burns it
           ──▶ profit_to_lp_bps       ──▶ compounded into the LP position
           ──▶ profit_to_bankroll_bps ──▶ stays in the bankroll, compounding

"Prioritise fees into the trading vault" is just a high to_bankroll_bps. A launch that wants depth instead sets a high to_lp_bps. They are the same knob, and they must sum to 10000.

The one thing people get wrong#

Nothing is ever paid to a holder's wallet

There are no airdrops, no claims, no distributions and no snapshot. The holders' share of profit, profit_to_holders_bps, is spent buying the token back on the open market, and the tokens it buys are burned immediately in the same instruction. Holders benefit only through reduced supply. If you are looking for the page where the yield reaches your wallet, it does not exist.

The program has no instruction that sends a policy's funds to an address a caller chooses. That property stops at the program's edge: once value reaches a trading venue, the venue's own key model applies, and whether a Hyperliquid agent key can withdraw has never been probed. Both halves are on the safety model.

Status: live on mainnet#

Deployed, initialised and registered

The program is live on Solana mainnet at 4fhFQ8hgbswQq7PNsrwCcxkpE1oae6fsFcLvAjWEnPhD. Config is initialised at FFv8SPhxKfj6DBfnUGaRiK6M6E3KDau1Yp9efDswmZ9H, 6 origins and 21 models are written to the registry, and the launch readiness script reaches 12 of 12. A launch can be attempted.

The bytecode deployed there is the fixed version: two security defects found on 2026-09-23 were fixed and shipped the same day, and they changed the shape of two instructions. If you integrated against an older description of compound_lp or claim_fees, read the safety model before you build anything else.

Live is not the same as finished

No coin has launched through the program on mainnet yet, no Meteora position exists for compound_lp to compound into, and options cannot be offered because Derive's own provisioning endpoints are returning errors. Perps are the venue that works: value has crossed to Hyperliquid and an agent key has filled a real order. Read what is not built yet before treating anything here as a promise.

Start here#

House rules for this documentation#

Three rules this site follows, so you know how to read it:

  • Every number traces to a source. On-chain constants come from the program source, venue figures come from the venue's own public API, and model prices come from each provider's own pricing page on a stated date. Where a number does not exist, this site says so instead of printing a placeholder.
  • Unbuilt things are labelled unbuilt. A design that exists only in the specification is described as a design, not as a feature.
  • Evidence against the product is included. The agent evidence page exists because agent mode has no demonstrated edge, and that belongs in the documentation rather than in a footnote.

The API examples throughout are real responses. Most were captured from the indexer running against a local validator, and the addresses in those are fixture addresses rather than mainnet tokens; where a figure was read from mainnet instead, the page says so. Mainnet addresses on this site are the program, its Config, the pinned venue programs and StonkFun's own accounts.

the indexer's own liveness check
$ curl -s http://127.0.0.1:8941/health
{
  "ok": true,
  "service": "bankroll indexer API"
}

A note on the name

The program, the repository and several internal identifiers still use the working name bankroll. The product is Stags. Where an on-chain field or an API route says bankroll, that is the literal name of the thing on chain, and this documentation uses it verbatim rather than renaming it in prose.