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

     /* 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

     "totalTokenSupply": 1000000000, // total token supply (not in lamports)
     "migrationOption": 1, // 0 - Migrate to DAMM v1 | 1 - Migrate to DAMM v2
     "tokenBaseDecimal": 6, // token base decimal
     "tokenQuoteDecimal": 9, // token quote decimal
     "lockedVestingParam": {
       "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)
     },
     "baseFeeParams": {
       "baseFeeMode": 0, // 0 - Fee Scheduler: Linear | 1 - Fee Scheduler: Exponential
       "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.
     "activationType": 1, // 0 - Slot | 1 - Timestamp
     "collectFeeMode": 0, // 0 - Quote Token | 1 - Output Token
     "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%
     "tokenType": 0, // 0 - SPL | 1 - Token 2022
     "partnerLpPercentage": 100, // Partner claimable LP (withdrawable LP once pool migrates)
     "creatorLpPercentage": 0, // Creator claimable LP (withdrawable LP once pool migrates)
     "partnerLockedLpPercentage": 0, // Partner locked LP (permanently locked LP once pool migrates)
     "creatorLockedLpPercentage": 0, // Creator locked LP (permanently locked LP once pool migrates)
     "creatorTradingFeePercentage": 0, // Bonding curve trading fee sharing (0% to 100%) - 0% means all trading fees go to the partner
     "leftover": 0, // leftover tokens in the bonding curve (claimable once pool migrates)
     "tokenUpdateAuthority": 1, // 0 - CreatorUpdateAuthority | 1 - Immutable | 2 - PartnerUpdateAuthority | 3 - CreatorUpdateAndMintAuthority | 4 - PartnerUpdateAndMintAuthority
     "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%)
     },
     "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.
  • 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.