How it differs from a standard launch
- No DBC bonding curve and no migration. The pool exists and is fully seeded the moment the launch transaction lands.
- No fee share config key. You do not call the fee share config endpoint. Fee routing is handled by the launch itself (fee-share position custody).
- Fees are collected in the quote token, not SOL. A flat 2% base fee accrues in the pool’s quote mint. All amounts (initial buy, claimable fees, vault balances) are denominated in that quote mint’s base units.
- Liquidity is permanently locked. The launch creates two positions (50% / 50%) that are permanently locked and deposited into fee-share position custody. The creator claims accrued fees, not liquidity.
Standard SOL-quoted launches are covered in Launch a Token. This guide is only for launching directly into a DAMM v2 pool with a non-SOL quote token.
Prerequisites
Before starting, make sure you have:- Completed our TypeScript and Node.js Setup Guide.
- Got your API key from the Bags Developer Portal.
- A Solana wallet with some SOL for transaction fees and rent.
- If you want to perform an initial buy at launch, a balance of the quote token in your wallet (the initial buy is spent in the quote token, not SOL).
- A token image URL (recommended) or image file.
- Installed the additional dependencies for this guide:
1. Set Up Environment Variables
This guide requires your wallet’s private key. Add it to your base.env file:
You can export your private key from wallets like Bags, Phantom, or Backpack.
2. Pick a Quote Token
Non-SOL launches must use a supported (badged) quote mint. Fetch the current list and pick one. Each entry includes the mint, its owning token program, decimals, and metadata.3. The Launch Script
Here is the complete script. Save it aslaunch-token-non-sol-quote.ts.
The flow is:
- Pick a supported quote token
- Create metadata (
createTokenInfoAndMetadata) - Build the launch transaction bundle (
createDammV2LaunchTransaction) - Sign and submit the bundle in order
Endpoints Used Under the Hood
This SDK flow calls these documented endpoints:GET /token-launch/damm-v2/supported-quote-tokensviasdk.tokenLaunch.getDammV2SupportedQuoteTokens()POST /token-launch/create-token-infoviasdk.tokenLaunch.createTokenInfoAndMetadata()POST /token-launch/damm-v2/create-transactionviasdk.tokenLaunch.createDammV2LaunchTransaction()GET /token-launch/damm-v2/launchesviasdk.tokenLaunch.getDammV2Launches()
Understanding the launch bundle
createDammV2LaunchTransaction returns:
transactions— an ordered array of{ type, transaction }, wheretransactionis a base58-encoded, partially-signed transaction. Thetypeis one of:LUT_SETUP— creates the address lookup table the launch transaction depends on.CREATE_TOKEN— creates the SPL mint and metadata (omitted on rebuilds where the mint already exists).LAUNCH— the single atomic transaction that creates the pool, locks both positions, deposits them into custody, and performs the optional initial buy.LUT_DEACTIVATE/LUT_CLOSE— optional cleanup to reclaim the lookup-table rent after the launch (see below).
launch— details about the launch:pool,quoteMint,quoteTokenProgram,treasuryPositionNftMint,feeClaimerPositionNftMint,feeClaimerWallet,lookupTable,positionCustody,custodyAuthority,launchPriceQuotePerToken, andimpliedLaunchFdvUsd.
Unlike the classic SOL launch helper,
createDammV2LaunchTransaction returns base58 strings (not VersionedTransaction objects). Deserialize each with VersionedTransaction.deserialize(bs58.decode(item.transaction)) before signing, as shown above.Optional: reclaim the lookup-table rent
TheLUT_SETUP step pays rent for an address lookup table. After the launch confirms you can reclaim that rent with the LUT_DEACTIVATE and LUT_CLOSE transactions. These are not server-signed and use a fixed blockhash, so refresh the blockhash before signing, and note that LUT_CLOSE is only valid roughly 513 slots after LUT_DEACTIVATE lands. This cleanup is optional and can be skipped.
4. Verify the Launch
Confirmed launches appear in the DAMM v2 direct launches feed. You can filter by the quote mint you used:5. Claim Creator Fees
Creator fees on a non-SOL launch accrue in the pool’s quote mint and are claimed from the fee-share position custody. The claim flow is:GET /token-launch/claimable-positionsto find the claimable position for your wallet.POST /token-launch/claim-txs/v2with the position’sdammPositionInfoto build the claim transaction.
Claimed amounts are paid out in the pool’s quote mint, not SOL. Convert using the quote mint’s decimals when displaying balances.
6. Claim Partner and Deployer Fees
Partners and deployers do not hold a DAMM v2 position directly. Their revenue share accrues into a per-wallet aggregate vault (one per quote mint) that is swept with the vault endpoints. These claims are gas-sponsored: the gas sponsor pays the transaction fee and your wallet co-signs as the authorizer.7. Run Your Script
Edit thelaunchToken(...) call at the bottom of the script with your token details and a quoteMint from step 2, then run:
8. Troubleshooting
Common issues:- Token already launched: The token mint must still be in
PRE_LAUNCHstatus. Each mint fromcreateTokenInfoAndMetadata()can only be launched once. - Quote mint not supported: Only mints returned by
getDammV2SupportedQuoteTokens()can be used. Re-fetch the list, as it can change. - Insufficient quote balance for initial buy:
initialBuyQuoteAmountis spent from your wallet’s quote-token balance at build time. Make sure you hold at least that amount, in base units. - Insufficient SOL: Your wallet still needs SOL to pay transaction fees and rent, even though trading is quoted in a non-SOL token.
- Wrong decimals:
initialBuyQuoteAmount, claimable amounts, and vault balances are all in the quote mint’s base units. Convert using thedecimalsfromgetDammV2SupportedQuoteTokens().
