Skip to content

Program reference ​

Addresses ​

These are the only official addresses

Don't trust an address for the Corium launchpad from anywhere else. Your wallet shows the program ID before you approve a transaction: it should be NovanpiewpH4zvYgtzAQN2zWQ94KcKWrHCTswWdZ1Y1 or one of Meteora's below.

Mainnet ​

Appcorium.so
Corium program (corium_launch)NovanpiewpH4zvYgtzAQN2zWQ94KcKWrHCTswWdZ1Y1
Corium config (Meteora DBC)D4CPCPQ3BqVyAV7WQAjLFdq91WNJjvP1MtcJMyoHtYC2 (every new coin)
First Corium configHdY7SdqgdquPcSSFD6gkFaLUQ4zRTdCjPDaPa57DgbRw (coins launched before the stepped pool fee)
Fee claimer (the Corium vault)HdtdnxH8mqD4UhSKsA1gueo89DYNsc9QaoAXqWoZaodb
TreasuryGLVXkNtqT7Atdz1vCyd22kWDPcFdCbktHFGHiWx19yg4 (a Squads multisig)
Admin and upgrade authorityGLVXkNtqT7Atdz1vCyd22kWDPcFdCbktHFGHiWx19yg4 (the same Squads multisig)
Crank (posts payouts)DU3PVbRgL4G9rdFnJ5guRC5rt26JCEEckGJmMKGdc1JG
Graduates at85 SOL

The program is verified: OtterSec rebuilt it from its public source, github.com/corium-solana/corium-launch, and the result matches the on-chain program byte for byte (verification). Its security contact is embedded in the program (security.txt) and at corium.so/security.txt. No single key can upgrade it or change its admin settings: both need the Squads multisig.

Devnet (testing) ​

Corium program (corium_launch)NovanpiewpH4zvYgtzAQN2zWQ94KcKWrHCTswWdZ1Y1
Corium config (Meteora DBC)7QjxUbrRoZCJA4zX2wLcZMBMJikckzZsD5GrbQRKuHZS
Fee claimer (the Corium vault)HdtdnxH8mqD4UhSKsA1gueo89DYNsc9QaoAXqWoZaodb
Graduates at5 SOL (a test config; mainnet graduates at 85 SOL)

Meteora programs (same on mainnet and devnet) ​

Dynamic Bonding Curvedbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN
DAMM v2cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG

The coin config ​

One Meteora DBC config for every new coin (coins launched on the first config keep its terms, which differ only in the pool: its fee and its split):

QuoteSOL
Supply1,000,000,000, 6 decimals, immutable mint and metadata
Migration threshold85 SOL (quote reserve)
Supply into the pool at migration20%
Base fee1%; exponential scheduler from 50% to 1% over 60 × 1 s periods
First buy by the creatorPays the minimum fee
Fee split37% of the partner + creator share to the creator
Fee claimerThe Corium vault
Migrates toDAMM v2, liquidity 75% creator / 25% Corium, all permanently locked (coins on the first config: 50/50)
Pool fee1% at graduation, stepping down by market cap to 0.25% at 100,000 SOL (75 linear steps of the square root of the price), back up if the price falls; 20% of what Meteora leaves compounds into the pool's liquidity. Coins on the first config: 1% flat

Accounts ​

All addresses are PDAs of the Corium program:

AccountSeedsHolds
Config["config"]Admin, crank, treasury, claim window
Vault["vault"]SOL for escrows and payouts; the DBC fee claimer; owner of Corium's DAMM v2 positions
Route["route", dbc_config]The config's bounty share in basis points (5000), fixed forever
Bounty["bounty", pool]A coin's escrow: accrued (lamports), fees (all partner fees claimed), distributed
Distribution["dist", pool]A posted payout: root, total, claimed, expiry, the IPFS URI of its scores
ClaimRecord["claim", distribution, wallet]Exists once a wallet has claimed

Instructions ​

InstructionSignerDoes
initializeUpgrade authority, onceSets admin, crank, treasury, claim window
set_crank, set_treasuryAdminRotate those addresses
propose_admin, cancel_admin_offerAdminOffer the admin role to a new address, or withdraw the offer
accept_adminThe proposed adminTakes the admin role; a two-step handover, so it can't go to a mistyped address
create_routeAdmin, once per configRegisters a DBC config and its bounty share
claim_feesAnyoneClaims a pool's partner fees; route share to its escrow, the rest to the treasury
create_distributionCrankPosts a graduated coin's merkle root for exactly its escrow
claimWinnerPays a proven amount
sweep_expiredAnyoneAfter the window: unclaimed rest to the treasury
release_bountyAnyoneNo payout within the window after graduation: escrow to the treasury
claim_lp_feesAnyoneDAMM v2 position fees to the treasury's token accounts
claim_surplusAnyoneCurve surplus to the treasury's token account

Bounties and requests (pots) ​

Sponsored bounties, requests and the stretch ledger are instructions in the same program, with their own accounts: PotConfig, Pot, Contribution, Entry, PotClaim, Stretch and Credit. Each pot’s SOL sits in the pot’s own token account, never in the vault above, so pots can’t reach supernova escrows or the treasury. The full list of accounts and instructions is on Bounties & requests: the rules.

The pump.fun program, read (never called) by the stretch ledger and by mark_winner for pump.fun bounties: 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P.

Verifying a payout ​

Every Distribution carries the URI of a JSON report with each winner's stretch credit, stretch tokens, balance at the hold check, score, amount and merkle proof. To check one:

  1. Fetch every swap on the coin's pool, oldest first, and score the final stretch with the rules on the bounty page.
  2. Read each scoring wallet's balance at the hold check, and scale its credit.
  3. Split the Bounty escrow pro rata by score, rounding down, with the rounding dust to the top score.
  4. Build the tree and compare its root with the one on chain.

The tree:

leaf = sha256("corium:leaf" ‖ distribution ‖ wallet ‖ amount as u64 little-endian)
node = sha256("corium:node" ‖ min(a, b) ‖ max(a, b))

The distinct prefixes keep an inner node from ever passing as a leaf, and sorting each pair means a proof is just the list of sibling hashes.

If these docs and the chain disagree, the chain wins.