Skip to main content
Most Bags launches are quoted in SOL and start on a DBC bonding curve that later graduates to a DAMM v2 pool. A non-SOL quote launch is different: the token is created straight into a single-sided Meteora DAMM v2 pool quoted in a badged non-SOL mint (for example an xStock or an Ondo tokenized equity). There is no bonding curve and no migration step.

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.
Quote mint decimals vary per token (for example, xStocks use 8 decimals and Ondo mints use 9). The initialBuyQuoteAmount you pass later is in the quote mint’s base units, so always use the decimals value returned here to convert from a human amount.

3. The Launch Script

Here is the complete script. Save it as launch-token-non-sol-quote.ts. The flow is:
  1. Pick a supported quote token
  2. Create metadata (createTokenInfoAndMetadata)
  3. Build the launch transaction bundle (createDammV2LaunchTransaction)
  4. Sign and submit the bundle in order

Endpoints Used Under the Hood

This SDK flow calls these documented endpoints:

Understanding the launch bundle

createDammV2LaunchTransaction returns:
  • transactions — an ordered array of { type, transaction }, where transaction is a base58-encoded, partially-signed transaction. The type is 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, and impliedLaunchFdvUsd.
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

The LUT_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:
  1. GET /token-launch/claimable-positions to find the claimable position for your wallet.
  2. POST /token-launch/claim-txs/v2 with the position’s dammPositionInfo to build the claim transaction.
The simplified sdk.fee.getClaimTransactions() method (which calls claim-txs/v3) does not currently build custody claims for non-SOL DAMM v2 direct launches. Use the claim-txs/v2 endpoint with the dammPositionInfo object returned by claimable-positions, as shown below.
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 the launchToken(...) 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_LAUNCH status. Each mint from createTokenInfoAndMetadata() 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: initialBuyQuoteAmount is 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 the decimals from getDammV2SupportedQuoteTokens().
For more details, see the API Reference.