Skip to main content
In this guide, Metsumi will walk you through the steps to create a DBC token launch pool on Meteora. Whether you’re a seasoned developer or just starting out, this guide has got you covered to deploy liquidity and launch your project on Meteora.

What You’ll Achieve

By the end of this quicklaunch, you’ll have built a liquidity pool on Meteora by:
  • Configuring your bonding curve pool and graduated DAMM v1/v2 pool settings
  • Interacting with our Dynamic Bonding Curve program
  • See your token tradeable across all trading terminals e.g. Jupiter Pro, Axiom, Photon etc.
Why Meteora?Meteora is a hyper optimized liquidity layer that ensures that your project’s provided liquidity is secure, sustainable and composable for anyone to trade on. By following this guide, you’ll be able to launch a bonding curve config and a token pool using the bonding curve config on Meteora in just a few quick and easy steps.

Prerequisites

  • Node.js >= 18.0.0
  • pnpm >= 10.0.0
If you don’t have pnpm installed, you can install it by running the following command.
Terminal
npm install -g pnpm

Steps

1

Clone and Setup Meteora Invent

Meteora Invent is a toolkit consisting of everything you need to invent innovative token launches on Meteora. Run the following command in your terminal to get started.
Terminal
git clone https://github.com/MeteoraAg/meteora-invent.git
Once you’ve cloned the repository, you’ll have a new project directory with a meteora-invent folder. Run the following to install pnpm and the project dependencies.
Terminal
cd meteora-invent
pnpm install
2

Optional: Start a Local Test Validator

In Meteora Invent we provide an optional command for you to run a local validator to test your pool before deploying it to devnet or mainnet. Run the following command in your code editor terminal to get started.
Terminal
pnpm studio start-test-validator
This will start a local validator on your machine which will be hosted on http://localhost:8899.

3

Setup Environment Variables

We provide an easy way to setup environment variables when getting started. Run the following command in your code editor terminal to get started.
Terminal
cp studio/.env.example studio/.env
This will copy the example environment variables file to your .env file. Configure the following variables:
  • PRIVATE_KEY - Your private key for the wallet you will be using to deploy the pool.
Therafter, you will need to run this command to generate a keypair from your wallet private key.
Terminal
pnpm studio generate-keypair

# For devnet (airdrops 5 SOL)
pnpm studio generate-keypair --network devnet --airdrop

# For localnet (airdrops 5 SOL)
# Ensure that you have already started the local validator with pnpm start-test-validator
pnpm studio generate-keypair --network localnet --airdrop
This will generate a keypair.json file in the studio directory which will be used for all actions in this guide.

4

Configure your DBC Token Pool

Navigate to the studio/config/dbc_config.jsonc file and configure your DBC token pool settings.

Your can configure everything DBC token pool related in this file.
The comments in the file are to help you understand the different settings you can configure. Please ensure that you read through the comments while configuring your pool.
dbc_config.jsonc
 {
   /* rpcUrl is required. You can switch between mainnet, devnet and localnet or use your own RPC URL. */
   "rpcUrl": "https://api.devnet.solana.com", // mainnet: https://api.mainnet-beta.solana.com | devnet: https://api.devnet.solana.com | localnet: http://localhost:8899

   /* dryRun is required. If true, transactions will be simulated and not executed. If false, transactions will be executed. */
   "dryRun": false,

   /* keypairFilePath is required and will be the payer + signer for all transactions */
   "keypairFilePath": "./keypair.json",

   /* computeUnitPriceMicroLamports is required and can be adjusted to fit your needs */
   "computeUnitPriceMicroLamports": 100000,

   /* quoteMint is required for the following actions:
   * 1. dbc-create-config
   * 2. dbc-create-pool (if there is no configKeyAddress)
   * SOL: So11111111111111111111111111111111111111112 | USDC: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | any other token address
   */
   "quoteMint": "So11111111111111111111111111111111111111112",

   /* dbcConfig is only used in the following actions:
   * 1. dbc-create-config
   * 2. dbc-create-pool (if there is no --config flag indicated in the command)
   */
   "dbcConfig": {
     "buildCurveMode": 0, // 0 - buildCurve | 1 - buildCurveWithMarketCap | 2 - buildCurveWithTwoSegments | 3 - buildCurveWithLiquidityWeights | 4 - buildCurveWithMidPrice | 5 - buildCurveWithCustomSqrtPrices

     /* Only use the following parameters for buildCurveMode: 0 (buildCurve)
     * 1. percentageSupplyOnMigration
     * 2. migrationQuoteThreshold
     */
     "percentageSupplyOnMigration": 20, // percentage of total token supply to be migrated
     "migrationQuoteThreshold": 10, // migration quote threshold needed to migrate the DBC token pool

     /* Only use the following parameters for buildCurveMode: 1 (buildCurveWithMarketCap)
     * 1. initialMarketCap
     * 2. migrationMarketCap
     */
     // "initialMarketCap": 20, // the market cap of the DBC token pool when the pool is created specified in terms of quoteMint (not in lamports)
     // "migrationMarketCap": 600, // the market cap of the DBC token pool when the pool graduates specified in terms of quoteMint (not in lamports)

     /* Only use the following parameters for buildCurveMode: 2 (buildCurveWithTwoSegments)
     * 1. initialMarketCap
     * 2. migrationMarketCap
     * 3. percentageSupplyOnMigration
     */
     // "initialMarketCap": 20, // the market cap of the DBC token pool when the pool is created specified in terms of quoteMint (not in lamports)
     // "migrationMarketCap": 600, // the market cap of the DBC token pool when the pool graduates specified in terms of quoteMint (not in lamports)
     // "percentageSupplyOnMigration": 20, // percentage of total token supply to be migrated

     /* Only use the following parameters for buildCurveMode: 3 (buildCurveWithLiquidityWeights)
     * 1. initialMarketCap
     * 2. migrationMarketCap
     * 3. liquidityWeights
     */
     // "initialMarketCap": 20, // the market cap of the DBC token pool when the pool is created specified in terms of quoteMint (not in lamports)
     // "migrationMarketCap": 600, // the market cap of the DBC token pool when the pool graduates specified in terms of quoteMint (not in lamports)
     // "liquidityWeights": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], // a array of 16 liquidity weights for each liquidity segment in the curve

     /* Only use the following parameters for buildCurveMode: 4 (buildCurveWithMidPrice)
     * 1. initialMarketCap
     * 2. migrationMarketCap
     * 3. midPrice
     * 4. percentageSupplyOnMigration
     */
     // "initialMarketCap": 20, // the market cap of the DBC token pool when the pool is created specified in terms of quoteMint (not in lamports)
     // "migrationMarketCap": 600, // the market cap of the DBC token pool when the pool graduates specified in terms of quoteMint (not in lamports)
     // "midPrice": 0.001, // the mid-point price of the curve in terms of quoteMint
     // "percentageSupplyOnMigration": 20, // percentage of total token supply to be migrated

     /* Only use the following parameters for buildCurveMode: 5 (buildCurveWithCustomSqrtPrices)
     * 1. sqrtPrices - array of custom sqrt prices (must be in ascending order, at least 2 elements)
     * 2. liquidityWeights - optional weights for each segment (length must be sqrtPrices.length - 1)
     */
     // "sqrtPrices": [], // array of custom sqrt prices (ascending order). First = starting price (pMin), Last = migration price (pMax)
     // "liquidityWeights": [1, 2, 3], // optional: weights for each segment. If omitted, liquidity is distributed evenly

     /* Token Configuration */
     "token": {
       "totalTokenSupply": 1000000000, // total token supply (not in lamports)
       "tokenBaseDecimal": 6, // token base decimal
       "tokenQuoteDecimal": 9, // token quote decimal
       "tokenType": 0, // 0 - SPL | 1 - Token 2022
       "tokenUpdateAuthority": 1, // 0 - CreatorUpdateAuthority | 1 - Immutable | 2 - PartnerUpdateAuthority | 3 - CreatorUpdateAndMintAuthority | 4 - PartnerUpdateAndMintAuthority
       "leftover": 0 // leftover tokens in the bonding curve (claimable once pool migrates)
     },

     /* Fee Configuration */
     "fee": {
       "baseFeeParams": {
         "baseFeeMode": 0, // 0 - Fee Scheduler: Linear | 1 - Fee Scheduler: Exponential | 2 - Rate Limiter
         "feeSchedulerParam": {
           "startingFeeBps": 100, // starting fee (max 99% fee === 9900 bps)
           "endingFeeBps": 100, // ending fee (minimum 0.01% fee === 1 bps)
           "numberOfPeriod": 0, // number of period
           "totalDuration": 0 // total duration (If activationType is 0 (slots), totalDuration = duration / 0.4 | If activationType is 1 (timestamp), totalDuration = duration)
         }
         /*
               "baseFeeMode": 2, // 2 - Rate Limiter
               "rateLimiterParam": {
                   "baseFeeBps": 200, // base fee (max 99% base fee === 9900 bps)
                   "feeIncrementBps": 200, // fee increment (max fee increment = 9900 bps - baseFeeBps)
                   "referenceAmount": 0, // reference amount (not in lamports)
                   "maxLimiterDuration": 0 // if activationType is 0 (slots), maxLimiterDuration = duration / 0.4, if activationType is 1 (timestamp), maxLimiterDuration = duration)
               }
               */
       },
       "dynamicFeeEnabled": true, // If true, dynamic fee will add 20% of minimum base fee to the total fee.
       "collectFeeMode": 0, // 0 - Quote Token | 1 - Output Token
       "creatorTradingFeePercentage": 0, // Bonding curve trading fee sharing (0% to 100%) - 0% means all trading fees go to the partner
       "poolCreationFee": 0, // Pool creation fee in SOL (0 or between 0.001 SOL to 100 SOL). Token creators pay this fee when creating a pool. Partner can claim this fee later.
       "enableFirstSwapWithMinFee": false // If true, allows the pool creator to do their first swap (buy) without anti-sniper fees. Useful for single-transaction pool creation + first buy.
     },

     /* Migration Configuration */
     "migration": {
       "migrationOption": 1, // 0 - Migrate to DAMM v1 | 1 - Migrate to DAMM v2
       "migrationFeeOption": 3, // 0 - LP Fee 0.25% | 1 - LP Fee 0.3% | 2 - LP Fee 1% | 3 - LP Fee 2% | 4 - LP Fee 4% | 5 - LP Fee 6% | 6 - Customizable
       "migrationFee": {
         "feePercentage": 0, // Percentage of fee taken from migration quote threshold once pool migrates (0% to 50%)
         "creatorFeePercentage": 0 // Percentage of the migrationFee.feePercentage claimable by creator (0% to 100%)
       }
       /* Migrated Pool Fee (DAMM v2 only)
       * Configure migratedPoolFee when using migrationFeeOption: 6 (Customizable) or when configuring marketCapFeeSchedulerParams.
       * Note: When marketCapFeeSchedulerParams is configured, the SDK will automatically set migrationFeeOption to Customizable (6).
       */
       // "migratedPoolFee": {
       //   "collectFeeMode": 0, // 0 - Quote Token | 1 - Output Token
       //   "dynamicFee": 0, // 0: Disabled, 1: Enabled
       //   "poolFeeBps": 100, // The pool fee in basis points. Minimum 10, Maximum 1000 bps. Required when marketCapFeeSchedulerParams is configured.
       //   "baseFeeMode": 3, // 3 - FeeMarketCapSchedulerLinear | 4 - FeeMarketCapSchedulerExponential (only for DAMM v2)
       //   "marketCapFeeSchedulerParams": {
       //     "endingBaseFeeBps": 50, // The ending (minimum) base fee in basis points
       //     "numberOfPeriod": 100, // The total number of fee reduction periods
       //     "sqrtPriceStepBps": 100, // The sqrt price increase (in bps) required to advance one period
       //     "schedulerExpirationDuration": 86400 // The maximum duration (seconds) after which the scheduler expires and defaults to minimum fee
       //   }
       // }
     },

     /* LP Distribution Configuration (must total 100%)
     * IMPORTANT: At least 10% of LP must remain locked/vesting for at least 1 day post-migration.
     *
     * For DAMM v1: partnerPermanentLockedLiquidityPercentage + creatorPermanentLockedLiquidityPercentage >= 10%
     *
     * For DAMM v2: 3 options to achieve 10% locked/vesting:
     *   Option 1 (Permanent Only): Set creator + partner permanent locked percentages >= 10% (LP locked forever)
     *   Option 2 (Vesting Only): Use creator + partner vestingInfoParams with cliffDurationFromMigrationTime >= 86400 (1 day)
     *   Option 3 (Combination): Mix permanent + vesting to reach 10% (5% permanent + 5% vesting >= 1 day)
     */
     "liquidityDistribution": {
       "partnerLiquidityPercentage": 45, // Partner claimable LP (withdrawable LP once pool migrates)
       "creatorLiquidityPercentage": 45, // Creator claimable LP (withdrawable LP once pool migrates)
       "partnerPermanentLockedLiquidityPercentage": 5, // Partner permanently locked LP (permanently locked LP once pool migrates)
       "creatorPermanentLockedLiquidityPercentage": 5 // Creator permanently locked LP (permanently locked LP once pool migrates)
       // NOTE: Total liquidity percentages (partner + creator + partnerLocked + creatorLocked + partnerVested + creatorVested) must equal 100%
       // NOTE: Must have minimum 10% (1000 bps) of locked liquidity after 1 day (86400 seconds). This can be permanently locked or vested liquidity.
       /* LP Vesting (DAMM v2 only)
       * Optional vesting schedule for partner/creator LP tokens after migration.
       * Only applicable when migrationOption = 1 (DAMM v2).
       */
       // "partnerLiquidityVestingInfoParams": {
       //   "vestingPercentage": 50,                // % of non-permanent LP to vest (0-100)
       //   "bpsPerPeriod": 100,                    // BPS released per period (100 = 1%)
       //   "numberOfPeriods": 100,                 // Total vesting periods
       //   "cliffDurationFromMigrationTime": 86400, // Cliff delay in seconds (86400 = 1 day)
       //   "totalDuration": 2592000                // Total vesting duration in seconds (30 days)
       // },
       // "creatorLiquidityVestingInfoParams": {
       //   "vestingPercentage": 50,
       //   "bpsPerPeriod": 100,
       //   "numberOfPeriods": 100,
       //   "cliffDurationFromMigrationTime": 86400,
       //   "totalDuration": 2592000
       // }
     },

     /* Locked Vesting Configuration */
     "lockedVesting": {
       "totalLockedVestingAmount": 0, // total locked vesting amount (not in lamports)
       "numberOfVestingPeriod": 0, // number of vesting period
       "cliffUnlockAmount": 0, // cliff unlock amount (not in lamports)
       "totalVestingDuration": 0, // total vesting duration (in seconds)
       "cliffDurationFromMigrationTime": 0 // cliff duration from migration time (in seconds)
     },

     "activationType": 1, // 0 - Slot | 1 - Timestamp

     "leftoverReceiver": "Dc85YcHkAWs62ndssWcGN5V4xYaQzPzgUDiRGtvnZas6", // leftover receiver address
     "feeClaimer": "Dc85YcHkAWs62ndssWcGN5V4xYaQzPzgUDiRGtvnZas6" // fee claimer address
   },

   /* dbcPool is only used in the following actions:
   * 1. dbc-create-pool
   */
   "dbcPool": {
     // "baseMintKeypairFilepath": "./mint-keypair.json", // optional base mint keypair file path
     "name": "YOUR_TOKEN_NAME", // token name
     "symbol": "YOUR_TOKEN_SYMBOL", // token symbol
     "metadata": {
       // "uri": "https://gateway.irys.xyz/123456789", // if you already have a metadata URI created, you can specify it here

       /* Only use the following parameters for createBaseToken if you don't have an existing metadata uri
       * This will create an image uri and a new metadata uri and upload everything to Irys
       */
       "image": "./data/image/test-token.jpg", // this can be a URL of the image address (e.g. https://example.com/token-image.png) or the image file path (e.g. ./data/image/test-token.jpg)
       "description": "YOUR_TOKEN_DESCRIPTION", // token description
       "website": "https://example.com", // project website
       "twitter": "https://x.com/yourproject", // twitter URL
       "telegram": "https://t.me/yourproject" // telegram URL
     }
   },

   /* dbcSwap is only used in the following actions:
   * 1. dbc-swap (Buy or Sell)
   */
   "dbcSwap": {
     "amountIn": 1.03, // the amount of quoteMint or baseMint to be swapped
     "slippageBps": 100, // slippage in bps
     "swapBaseForQuote": false, // if true, swap base for quote | if false, swap quote for base
     "referralTokenAccount": null // optional referral token account address
   }
 }
Creating a DBC token pool will automatically mint the token within the same initialize_virtual_poolinstruction, so if you want to provide a vanity mint address, you will need to specify the baseMintKeypairFilepath in the dbc_config.jsonc file.
The toolkit contains logic to make it easier for you to create the DBC token pool such as:
  • Configuring your bonding curve shape based on your buildCurveMode.
  • Launching the DBC config and token pool using the config immediately.
  • Configuring your Anti-Sniping settings (such as Fee Scheduler or Rate Limiter) easily.
  • Setting up liquidity vesting schedules for DAMM v2 migrations.
  • Configuring market cap-based fee schedules for graduated pools.
  • Enabling first swap with minimum fee for pool creators.
  • Abstracts the math behind crafting the bonding curve.
5

Create your DBC Token Pool

After configuring your DBC token pool settings in dbc_config.jsonc, you can now create your token pool by running the following command.If you don’t have a DBC config key, you can run the following command and the config key + pool will be created together.
pnpm studio dbc-create-pool
If you already have an existing DBC config key, you can provide it via the CLI with a --config flag and run the following command.
pnpm studio dbc-create-pool --config <YOUR_DBC_CONFIG_KEY>
This will create your DBC curve config (if there is no config key) and token pool. You will also be able to see the token address and other relevant information in the console.

Voilà! You’ve successfully created your DBC token pool on Meteora. You can now see your token in action on Jupiter Pro, Axiom or Photon.