Price holds flat on a tier, then jumps to the next one.1% fee6× · 50 → 300 SOL mcap
Already raised Your buyLeft is the first trade. Right is graduation.
The raise is 35% full. You take the next 10%, leaving it 45% of the way to graduation. The price before you is 3× the first trade, and 3.33× after you. Across that slice you pay about 3.17× on average. If the whole supply were priced along this curve, market cap moves from about 150 SOL to 167 SOL. A flat 1% trading fee sits on the swap and does not change the shape.
Two fast price jumps with deep flats around them — one wave discovers, the next wave pays it.
The curve alternates: a deep flat section, a thin steep jump, another flat, another jump, and a final shelf. The jumps are where price gets discovered on deliberately thin supply; the flats are where the crowd actually fills up. It suits a two-phase launch — an allowlist wave that sets the price, then a public wave that buys the shelf, with a last scarcity step into graduation.
A recipe is numbers you deploy as your own PoolConfig. It is not another pad's address.
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";
// Twin hump — 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: 100,
endingFeeBps: 100,
numberOfPeriod: 0,
totalDuration: 0,
},
},
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: 50,
migrationMarketCap: 300,
liquidityWeights: [6, 1, 6, 1, 6],
});
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,
});