Dutch open

A steady climb — each buyer pays a little more than the last.Fee 80% → 2%4× · 40 → 160 SOL mcap

← All configs

Drag across the chart, or focus it and use the arrow keys, to read the price at any point of the raise.4×1×2×3×4×First trade25%50%75%GraduationQuote raised toward graduationPrice vs first trade45% raised · 2.35×Dutch open curve: 45% raised · 2.35×

Try a buy

Already raised Your buyLeft is the first trade. Right is graduation.

Price before you
2.05×
You pay, on average
2.2×
Price after you
2.35×
Left to graduation
55%

The raise is 35% full. You take the next 10%, leaving it 45% of the way to graduation. The price before you is 2.05× the first trade, and 2.35× after you. Across that slice you pay about 2.2× on average. If the whole supply were priced along this curve, market cap moves from about 82 SOL to 94 SOL. The trading fee fades with time, so this walk only shows the price.

Brief

The curve is a straight line. The fee starts at 80% and melts to 2% over ten minutes.

The price path is a plain straight climb — the auction is in the fee, not the curve. Buying in the first seconds costs an 80% fee, and the fee falls in even steps to 2% over ten minutes, so every buyer picks their own moment on the way down. It suits a hyped mint where nobody agrees on the opening price and you would rather the market bid the fee down than let bots sweep a cheap open.

Pick this if

  • You expect a loud open and want price discovery to happen in the fee, not in a wiped-out curve.
  • You can tell buyers one sentence: the longer you wait, the less fee you pay.

Leave it if

  • Your buyers are impatient and an 80% opening fee will just scare them off.
  • You only want the first blocks to be expensive — the two-minute anti-snipe fade is the sharper tool.

How the money moves

  • If the whole supply were priced at the first trade, the market cap would be about 40 SOL.
  • At graduation it is about 160 SOL, which is 4× the starting price.
  • The trading fee opens at 80% and falls in even steps to 2% over 600 seconds. The fee does not add a volatility bump.
  • Trading fees this config assigns go to the launchpad fee-claimer, not the coin creator.
  • After graduation, 100% of the LP is permanently locked to the launchpad fee-claimer. It cannot be pulled. The launchpad wallet can update the token name and image.
  • Mint authority is not left open. Graduation uses Meteora's 1% migration-fee preset.
  • That slice comes out of the quote before it is paired into DAMM v2.
  • Launching a pool on this config does not charge an extra creation fee.

Numbers

Quote
SOL
Token
SPL · 1,000,000,000 supply · 6 decimals
Starting market cap
40 SOL
Graduation market cap
160 SOL
Price by graduation
4× the first trade
Trading fee
Fee 80% → 2%
Volatility fee
Off
Creator trading fee
None
LP after graduation
100% locked · 0% withdrawable
Team vest
None
Migration fee preset
1%
Metadata
Launchpad can update

A recipe is numbers you deploy as your own PoolConfig. It is not another pad's address.

Deploy this recipe

create-config.ts· Dutch open
import { NATIVE_MINT } from "@solana/spl-token";
import { Keypair, PublicKey } from "@solana/web3.js";
import {
  ActivationType,
  BaseFeeMode,
  buildCurveWithLiquidityWeights,
  CollectFeeMode,
  DynamicBondingCurveClient,
  MigrationFeeOption,
  MigrationOption,
  TokenDecimal,
  TokenType,
  TokenAuthorityOption,
} from "@meteora-ag/dynamic-bonding-curve-sdk";

// Dutch open — deploy a new PoolConfig. Fee claimer is your wallet.
// This does not point launches at another pad's config address.
const curveConfig = buildCurveWithLiquidityWeights({
  token: {
    tokenType: TokenType.SPLToken,
    tokenBaseDecimal: TokenDecimal.SIX,
    tokenQuoteDecimal: TokenDecimal.NINE,
    tokenAuthorityOption: TokenAuthorityOption.PartnerUpdateAuthority,
    totalTokenSupply: 1_000_000_000,
    leftover: 0,
  },
  fee: {
    baseFeeParams: {
      baseFeeMode: BaseFeeMode.FeeSchedulerLinear,
      feeSchedulerParam: {
        startingFeeBps: 8000,
        endingFeeBps: 200,
        numberOfPeriod: 60,
        totalDuration: 600,
      },
    },
    dynamicFeeEnabled: false,
    collectFeeMode: CollectFeeMode.QuoteToken,
    creatorTradingFeePercentage: 0,
    poolCreationFee: 0,
    enableFirstSwapWithMinFee: false,
  },
  migration: {
    migrationOption: MigrationOption.MET_DAMM_V2,
    migrationFeeOption: MigrationFeeOption.FixedBps100,
    migrationFee: { feePercentage: 0, creatorFeePercentage: 0 },
  },
  liquidityDistribution: {
    partnerLiquidityPercentage: 0,
    partnerPermanentLockedLiquidityPercentage: 100,
    creatorLiquidityPercentage: 0,
    creatorPermanentLockedLiquidityPercentage: 0,
  },
  lockedVesting: {
    totalLockedVestingAmount: 0,
    numberOfVestingPeriod: 0,
    cliffUnlockAmount: 0,
    totalVestingDuration: 0,
    cliffDurationFromMigrationTime: 0,
  },
  activationType: ActivationType.Timestamp,
  initialMarketCap: 40,
  migrationMarketCap: 160,
  liquidityWeights: [1, 1, 1, 1],
});

const config = Keypair.generate();
const partner = /* your launchpad wallet */ new PublicKey("YOUR_FEE_CLAIMER");

const createConfigTx = await client.partner.createConfig({
  config: config.publicKey,
  feeClaimer: partner,
  leftoverReceiver: partner,
  payer: partner,
  quoteMint: NATIVE_MINT,
  ...curveConfig,
});