Skip to main content
Track DBC releases here.
Token-2022 Transfer Fees and SDK 2.0.0
Mainnet deployment for Release 0.2.2 is planned for October 16, 2026, at 11:00 AM UTC+8 (Friday).

Release summary

What We Shipped

  • Support for a transfer fee on the base mint through create_config2
  • Support for quote mints with a non-zero transfer fee through create_config2 and a token badge
  • Permissionless support for quote mints with a zero transfer fee and a revoked transfer fee config authority
  • MigratedCollectFeeMode.Compounding accepts a compounding_fee_bps of 0
  • TypeScript SDK 2.0.0, with swap quotes that account for Token-2022 transfer fees

What To Do

IntegratorsWhat ChangedWhat To Do
Partners
  • New config endpoint create_config2, with optional transfer_fee_parameters for a base-mint transfer fee
  • Quote mints with a non-zero transfer fee or a live transfer fee config authority are accepted only by create_config2
  • Configs created by program 0.2.2 have PoolConfig.version 1
  • Bump to @meteora-ag/dynamic-bonding-curve-sdk@2.0.0. Early testing: @meteora-ag/dynamic-bonding-curve-sdk@1.5.13-rc.0.
  • Create configs with client.partner.createConfig2. Pass transferFeeParameters for a base-mint transfer fee, which requires a Token-2022 base mint and is at most 10%. Pass null when there is none.
  • A base transfer fee, or a quote mint with a non-zero transfer fee or a live transfer fee config authority, requires a constant token supply, no locked vesting, MigrationFeeOption.Customizable, and MigratedCollectFeeMode.Compounding.
  • Set a non-default feeClaimer when the config uses a partner transfer-fee authority or a Token-2022 partner token-update authority.
  • withdrawLeftover requires leftoverReceiver as a signer when the leftover charges a transfer fee.
  • Import curve, fee, and swap math from @meteora-ag/dynamic-bonding-curve-sdk/math. Construct services through DynamicBondingCurveClient.
Swap Routers
  • Swaps account for the transfer fee on either mint
  • Quote helpers return the transfer-fee-inclusive input and the transfer-fee-exclusive output
  • swap and swap2 reject transfer-hook pools
  • Read includedTransferFeeAmountIn and excludedTransferFeeAmountOut from swap quotes. For a Token-2022 quote mint, pass quoteMint and currentEpoch.
  • Check minimum_amount_out against the amount the user receives after the fee, and maximum_amount_in against the amount the user pays before the fee.
  • Rust quote_exact_in, quote_exact_out, and quote_partial_fill take current_epoch plus the base and quote TransferFeeConfig, and return SwapResultWithTransferFee.
  • Use swap2WithTransferHook, claimPartnerTradingFee2, and claimCreatorTradingFee2 for transfer-hook pools.
Trading Terminals
  • EvtCreateConfig is removed
  • EvtCreateConfigV2 is deprecated in favour of EvtCreateConfig3
  • Swap endpoints emit EvtSwap3 and EvtSwap3WithTransferHook
  • Consume EvtCreateConfig3 for configs from create_config and create_config2. create_config_with_transfer_hook still emits only EvtCreateConfigV2WithTransferHook.
  • Read included_transfer_fee_amount_in and excluded_transfer_fee_amount_out from EvtSwap3 and EvtSwap3WithTransferHook. Legacy EvtSwap.params.amount_in includes the transfer fee.
  • Treat PoolConfig.version 0 as a legacy config. Version 1 configs can have a base mint with a transfer fee, or a quote mint with a non-zero transfer fee or a live transfer fee config authority, and those configs migrate through the transfer-fee path.

Program: dynamic-bonding-curve 0.2.2

Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #211

Added

  • Added support for creating base mints with a transfer fee. The fee is configured per config through the optional transfer_fee_parameters argument in create_config2.
  • Added support for quote mints with a non-zero transfer fee using a token badge through create_config2. Previously a token badge only allowed a zero transfer fee.
  • Note that a token badge for a quote mint relies on trust in the management of that mint. As a limitation of this design, the badge does not restrict transfer fee changes. migration_damm_v2 uses the fee of the current epoch and does not repeat the 1% price check, so a higher fee can reduce the migrated liquidity, add the undeposited base to the protocol migration fee, change the price, or block the migration.
  • Added permissionless support for quote mints with a TransferFeeConfig whose fee is zero and whose transfer fee config authority is revoked.
  • Added support for a zero compounding_fee_bps with MigratedCollectFeeMode::Compounding when migrating to DAMMv2.
  • Added endpoint create_config2 that takes the new optional TransferFeeParameters argument. Passing None creates a config with no base transfer fee. Passing Some always gives the base mint a TransferFeeConfig extension, so it requires the Token-2022 token type and is otherwise rejected with InvalidTokenType, including when the basis points are zero. It emits the new EvtCreateConfig3 event and the EvtCreateConfigV2 event. When there is a base transfer fee or the quote mint has a non-zero transfer fee or a live transfer fee config authority, the config is restricted to a constant token supply (fixed token supply and pre_migration_token_supply equals post_migration_token_supply), no locked vesting, MigrationFeeOption::Customizable, and MigratedCollectFeeMode::Compounding.
  • Emit new events EvtSwap3 and EvtSwap3WithTransferHook in swap endpoints. They report included_transfer_fee_amount_in and excluded_transfer_fee_amount_out.

Changed

  • Config creation now sets PoolConfig.version to 1. Configs with version 0 are legacy configs.
  • Endpoints that transfer quote tokens (claim_trading_fee, claim_trading_fee2, claim_creator_trading_fee, claim_creator_trading_fee2, claim_protocol_fee2, partner_withdraw_surplus, creator_withdraw_surplus, withdraw_migration_fee, migration_damm_v2) no longer reject a non-zero transfer fee. Except a legacy config in migration_damm_v2 which migrates through the original path, which does not account for transfer fees. So migration_damm_v2 still rejects a non-zero quote transfer fee for a legacy config.
  • Legacy EvtSwap.params reports the amounts including the transfer fee. EvtSwap.params.amount_in equals EvtSwap3.included_transfer_fee_amount_in in every swap mode. EvtSwap.params.minimum_amount_out equals EvtSwap3.excluded_transfer_fee_amount_out for ExactOut and PartialFill, and is the user’s minimum_amount_out for ExactIn.
  • Swap endpoints account for the transfer fee on either mint: the curve uses the amount received after the fee, minimum_amount_out is checked against the amount the user receives after the fee, and maximum_amount_in is checked against the amount the user pays before the fee.
  • When there is a base transfer fee, or the quote mint has a non-zero transfer fee or a live transfer fee config authority, the endpoint migration_damm_v2 deposits the transfer-fee-excluded amounts of both mints. Such a config always migrates in compounding mode, where the side with the smaller transfer fee is scaled down by the same ratio to keep the migration price. The initial liquidity of the migrated pool is reduced by the larger of the two transfer fees. The budget of the scaled-down side that is not deposited stays in the vault and is added to protocol_migration_base_fee_amount or protocol_migration_quote_fee_amount, claimable through claim_protocol_fee2. This transfer fee path is used for PoolConfig.version 1 only.
  • When a transfer fee is involved, the endpoint migration_damm_v2 makes a single transfer per mint. The whole migrated liquidity is deposited into the first position, and the second position is carved out of it with split_position2, which moves liquidity between positions without transferring tokens. Each mint therefore pays its transfer fee once instead of once per position so more of the budget reaches the migrated pool.
  • For the compounding migrated fee mode, config creation validates the initial liquidity with the base transfer fee and the quote mint transfer fee of the current epoch applied. This approximates the amounts migration_damm_v2 deposits.
  • Endpoint withdraw_leftover requires the signature of leftover_receiver when the transfer fee on the leftover is non-zero. The endpoint stays permissionless when the transfer fee is zero.
  • Endpoint create_config emits the new EvtCreateConfig3 event in addition to EvtCreateConfigV2. Endpoint create_config2 emits the same pair, so an indexer that follows only one of the two events sees every config from these two endpoints. Endpoint create_config_with_transfer_hook still emits only EvtCreateConfigV2WithTransferHook.

Deprecated

  • Deprecated create_config endpoint in favour of create_config2.
  • Deprecated EvtCreateConfigV2 event in favour of EvtCreateConfig3.

Removed

  • Removed the deprecated EvtCreateConfig event. The create_config endpoint no longer emits the event. Indexers must consume EvtCreateConfigV2 or EvtCreateConfig3.

Breaking Changes

  • Endpoints create_config and create_config_with_transfer_hook reject a quote mint with a non-zero transfer fee or a live transfer fee config authority with the error InvalidQuoteMint, even with a token badge. A badged quote mint with a TransferFeeConfig extension and a zero fee was previously accepted by these endpoints. Such a quote mint is now only accepted by create_config2.
  • Endpoints create_config, create_config2, create_config_with_transfer_hook, initialize_virtual_pool_with_spl_token, initialize_virtual_pool_with_token2022 and initialize_virtual_pool_with_token2022_transfer_hook reject a quote mint that is not permissionless-supported and has no token badge with the error InvalidQuoteMint. Previously these endpoints returned InvalidTokenBadge, which is now returned only when the supplied token badge does not match the quote mint.
  • Endpoints create_config, create_config2 and create_config_with_transfer_hook reject a Pubkey::default() fee claimer with the error InvalidFeeClaimer when the token type is Token-2022 and token_update_authority is PartnerUpdateAuthority or PartnerUpdateAndMintAuthority. Previously such a config was created successfully with the create_config and create_config_with_transfer_hook endpoints, but every pool initialization from it failed, because Token-2022 rejects the Pubkey::default() as an authority.
  • A base token transfer hook cannot be combined with a quote mint that has a non-zero transfer fee or a live transfer fee config authority. The endpoint create_config_with_transfer_hook rejects such a quote mint, and create_config2 accepts it but does not take a transfer hook program.
  • Endpoints initialize_virtual_pool_with_spl_token, initialize_virtual_pool_with_token2022 and initialize_virtual_pool_with_token2022_transfer_hook reject a legacy config whose quote mint has a non-zero transfer fee or a live transfer fee config authority, with the error InvalidQuoteMint. A badged quote mint is still accepted for a legacy config as long as it carries neither: the restriction exists only to keep a legacy config, which was never validated against the transfer fee restrictions, off the transfer fee path.
  • Endpoint initialize_virtual_pool_with_token2022_transfer_hook rejects a quote mint with a live transfer fee config authority, which was previously accepted with a token badge. A quote mint with a non-zero transfer fee was already rejected on this endpoint.
  • Removed the deprecated EvtCreateConfig event. An indexer that consumes it must switch to EvtCreateConfigV2 or EvtCreateConfig3.
  • Rust SDK: quote_exact_in, quote_exact_out, and quote_partial_fill take new current_epoch: u64, base_mint_transfer_fee_config: Option<&TransferFeeConfig> and quote_mint_transfer_fee_config: Option<&TransferFeeConfig> parameters.
  • Rust SDK: quote_exact_in, quote_exact_out, and quote_partial_fill return SwapResultWithTransferFee instead of SwapResult2. SwapResultWithTransferFee contains swap_result: SwapResult2, included_transfer_fee_amount_in and excluded_transfer_fee_amount_out.

TypeScript SDK: @meteora-ag/dynamic-bonding-curve-sdk 2.0.0

SDK PR #123

Added

  • client.partner.createConfig2. Pass transferFeeParameters for a base-mint transfer fee, or null when there is none. 0 basis points still creates a TransferFeeConfig and is rejected with MigratedTransferFeeAuthorityOption.Immutable or RevokeZeroFee.
  • TransferFeeWithheldAuthority and MigratedTransferFeeAuthorityOption.
  • Swap quotes account for Token-2022 transfer fees and return includedTransferFeeAmountIn and excludedTransferFeeAmountOut. getSwapQuoteTransferFees(connection, config, { commitment?, baseMint? }) fetches the quote mint, the base mint when baseMint is passed, and the current epoch.
  • getQuoteFromInputAmount and getQuoteFromOutputAmount quote a buildCurve result as its pool would be right after initialize_pool. client.pool.swapQuote2 quotes an existing pool and requires currentPoint.
  • @meteora-ag/dynamic-bonding-curve-sdk/math: the ports of the program’s curve, fee, transfer fee and swap math, plus ProgramError, the program’s error strings the SDK throws.
  • QuotePoolConfig, QuoteVirtualPool, QuotePoolFees, QuoteDynamicFee and QuoteVolatilityTracker: the fields the quote math reads. A PoolConfig and a VirtualPool satisfy them.
  • client.state.getPoolWithKind and client.state.getPoolConfigWithKind fetch an account once and say whether it is the transfer-hook variant.
  • getMigrationQuoteAmountFromThreshold, getTransferFeeMigrationPositionSplit, EpochTransferFee, TransferFeeMigrationPositionSplit and PoolFeeSummary at the package root.
  • rateLimiterApplied at the package root, for callers who build the swap instruction themselves and need to know whether to pass the instructions sysvar.
  • MAX_DYNAMIC_FEE_PERCENT and PARTNER_AND_CREATOR_SURPLUS_SHARE.
  • getSurplusBreakdown and client.state.getPoolSurplus: the surplus split the program pays on partnerWithdrawSurplus and creatorWithdrawSurplus, and whether each side has withdrawn.
  • liveCurve on ./math: a stored PoolConfig.curve up to its first zero point.

Changed

  • createConfigAndPool and createConfigAndPoolWithFirstBuy always use createConfig2. Omitting transferFeeParameters is the same as null.
  • A base transfer fee, or a quote mint with a non-zero transfer fee or a live transfer fee config authority, requires a constant token supply, no locked vesting, MigrationFeeOption.Customizable and MigratedCollectFeeMode.Compounding. The base fee is Token-2022 only and at most 10%. A partner transfer-fee authority, and a Token-2022 partner token-update authority, require a non-default feeClaimer.
  • MigratedCollectFeeMode.Compounding allows compoundingFeeBps of 0.
  • Configs created by program 0.2.2 have PoolConfig.version 1 and transferFeeFlag. Swap quotes read the base transfer fee from that flag unless baseMint or baseTransferFeeBasisPoints is passed. A transfer fee is zero when its basis points are 0 or its maximum fee is 0.
  • A legacy config (version 0) cannot initialize a pool on a quote mint with a non-zero transfer fee or a live transfer fee config authority, and migrateToDammV2 rejects it when the quote mint’s current transfer fee is non-zero. Transfer-hook pool initialization rejects those quote mints at any version.
  • Compounding migration deposits round the scaled base up and the quote down. getTransferFeeMigrationPositionSplit uses the numerator (1_000_000_000 / 100) * percentage and rounds the liquidity down.
  • Partial-fill quotes throw Required input amount exceeds the provided amount in when the reconstructed input is larger than amountIn.
  • withdrawLeftover makes leftoverReceiver a signer when the leftover charges a transfer fee.
  • Curve builders reserve the program migration base, ceil(migrationQuoteThreshold * (100 - migrationFee.feePercentage) / 100). buildCurveWithLiquidityWeights and buildCurveWithCustomSqrtPrices use constant product for Compounding and concentrated liquidity otherwise, and the last segment of buildCurveWithLiquidityWeights now ends exactly at the migration sqrt price. buildCurveWithTwoSegments and buildCurveWithMidPrice keep a fractional percentageSupplyOnMigration.
  • Builders throw instead of returning an unusable config: when the migration base, locked vesting and leftover exceed the supply, when no mid price gives positive liquidity, when a fee schedule cannot reach its ending fee, when a period frequency floors to zero, and when a fixed MigrationFeeOption is combined with a custom migrated pool base fee mode or market cap scheduler. getMigratedPoolFeeParams takes three arguments and requires a market cap scheduler base fee mode exactly when marketCapFeeSchedulerParams is set.
  • getFeeSchedulerParams checks both fees against the program bounds, also when the fee is constant. Exponential schedulers, including the migrated market-cap scheduler, choose reductionFactor with the program’s Q64 decay so the last period stays at or above the ending fee. calculateFeeSchedulerEndingBaseFeeBps uses the program’s integer conversion.
  • getLockedVestingParams and getLiquidityVestingInfoParams floor their frequency and reject a duration shorter than the number of periods.
  • validateConfigParameters takes an options object, checks the curve shape before any curve math runs on it, and only applies the fee-claimer rule when feeClaimer is passed.
  • Rate-limiter validation checks the fee at u64::MAX. Swap quotes reject amounts outside the program’s u64 and u128 bounds and slippageBps outside [0, 10_000].
  • Errors that mirror a program error use the program’s message: Math operation overflow, Type cast error, Pool is completed, Amount left is not zero, Liquidity in bonding curve is insufficient, Invalid collect fee mode, and so on. ProgramError in ./math lists them.
  • client.state.getPoolConfigsByOwner filters on the config’s fee claimer. It filtered on the leftover receiver since 1.0.
  • getCurveBreakdown consumes only the remaining threshold on each segment and stops at exact cumulative completion (PR #120, snuff12).
  • getBaseTokenForSwap, getMigrationThresholdPrice, getSwapAmountWithBuffer, getCurveBreakdown and getQuoteReserveFromNextSqrtPrice stop at the first zero point of a stored curve, like the program. client.state.getPoolBaseTokenCurveProgress threw Math operation overflow once the price reached the last curve point, and at any time for a config whose last point is the migration price.
  • getBaseTokenForSwap and getMigrationThresholdPrice accumulate without a per-segment u64 bound, like the program.
  • The first-buy builders pass the instructions sysvar only when the config enables the first swap with the minimum fee.
  • client.state.getDammV1MigrationMetadata returns null instead of throwing when the account does not exist.
  • client.state.getPoolMetadata(pool) and client.state.getPartnerMetadata(feeClaimer) fetch the metadata PDA and return the account, or null when none was created, instead of an array.
  • getTokenType and getTokenDecimals take an optional commitment.
  • Synced the DAMM v2 IDL and cp_amm.so fixture to cp_amm 0.2.5.
  • docs.md and CHANGELOG.md ship in the package.

Deprecated

  • client.partner.createConfig in favour of createConfig2. createConfig and createConfigWithTransferHook reject a quote mint with a non-zero transfer fee or a live transfer fee config authority.
  • getRateLimiterParams. The program rejects BaseFeeMode.RateLimiter for new configs.

Removed

  • Helpers nothing referenced: getAccountData, getAccountCreationTimestamp, getAccountCreationTimestamps, prepareTokenAccountTx, cleanUpTokenAccountTx, checkRateLimiterApplied, validateBalance, validateBaseTokenType, validateQuoteMintBasic, deriveDammV1EventAuthority, deriveDammV1PoolAuthority, deriveDammV2LockEscrowAddress, findAssociatedTokenAddress, deriveVaultAddress, deriveTokenVaultKey, deriveVaultLpMintAddress, requirePublicKey, convertDecimalToBN (use fromDecimalToBN), mulShr, SafeMath.mod, getFeeSchedulerMaxBaseFeeNumerator, getRateLimiterMinBaseFeeNumerator, getDeltaAmountBaseUnsignedUnchecked and getDeltaAmountQuoteUnsignedUnchecked (the 256 variants are the unbounded ones), BaseFeeHandler.validate, getProgram() on the services (use program), and DynamicBondingCurveClient.create (the constructor defaults commitment to confirmed).
  • Types nothing used: SwapQuoteConfig, DynamicCurveProgram, CreateConfigAccounts, InitializeSplPoolAccounts, InitializeToken2022PoolAccounts, InitializePoolParameters, LockEscrow, FeeResult, ClaimCreatorTradingFeeWithQuoteMintNotSolParams and ClaimCreatorTradingFeeWithQuoteMintSolParams.
  • The jito-ts dev dependency.

Breaking Changes

  • Import from @meteora-ag/dynamic-bonding-curve-sdk or @meteora-ag/dynamic-bonding-curve-sdk/math. The package root is an explicit export list and the exports map exposes only those two entries. The curve, fee, transfer fee and swap math moved to ./math (57 functions, among them calculateBaseToQuoteFromAmountIn, getFeeMode, getIncludedFeeAmount, getFeeNumeratorFromIncludedAmount, getSwapResult, the getDeltaAmount* and getNextSqrtPrice* functions, SafeMath, mulDiv and pow). swapQuoteExactIn, swapQuoteExactOut, swapQuotePartialFill and DynamicBondingCurveProgram are not exported; swapQuote stays on the root. Internal helpers such as getOrCreateATAInstruction, unwrapSOLInstruction, wrapSOLInstruction, deriveMintMetadata, derivePositionAddress, createDammV1Program, getFirstCurve, getTwoCurve, isDefaultLockedVesting and the validate* building blocks are no longer exported.
  • Construct the services through DynamicBondingCurveClient. new PoolService(connection, commitment) and the same constructor on the other services are no longer supported.
  • CreateConfigParams, CreateConfig2Params and CreateConfigWithTransferHookParams declare config, feeClaimer, leftoverReceiver, quoteMint and payer as required PublicKeys.
  • getSwapQuoteTransferFees takes an options object instead of a commitment string. Swap quotes for a Token-2022 quote mint require quoteMint and currentEpoch.
  • getFeeOnAmount and splitFees no longer take poolFees. calculateBaseToQuoteFromAmountOut and calculateQuoteToBaseFromAmountOut return { amountIn, nextSqrtPrice }.
  • getOrCreateATAInstruction(connection, mint, owner, payer, tokenProgram, commitment?): the allowOwnerOffCurve argument is gone and always on. unwrapSOLInstruction always returns an instruction.
  • createDbcProgram returns the Program instead of { program }. deriveEscrow is deriveLockerEscrowAddress.
  • getMigratedPoolFeeParams throws for MigrationFeeOption.Customizable when migratedPoolFee.poolFeeBps is not set.
  • swap, swap2, claimPartnerTradingFee, claimPartnerTradingFeeToReceiver, claimCreatorTradingFee and claimCreatorTradingFeeToReceiver reject transfer-hook pools. Use swap2WithTransferHook, claimPartnerTradingFee2 and claimCreatorTradingFee2. Standard pool creation rejects a transfer-hook config, and transfer-hook pool creation rejects a standard config.
  • transferPoolCreator rejects a newCreator equal to creator.
  • tempWSolAcc is gone from claimPartnerTradingFee and claimCreatorTradingFee. With a native SOL quote the fee is wrapped into the fee claimer’s or creator’s token account and unwrapped to receiver, so only the claimer signs.
  • validateSwapAmount returns nothing and throws Amount is zero.
Support for Stock Tokens in DBC + Deprecation of Rate Limiter and DAMM v1
Mainnet deployment for Release 0.2.1 is planned for September 9, 2026, at 11:00 AM UTC+8 (Wednesday).

Release summary

What We Shipped

  • Support for Stock Tokens in DBC via Token Badges
  • Deprecated BaseFeeMode.RateLimiter for new configs and new pools. Existing rate-limiter pools can still be quoted and swapped.
  • Deprecated MigrationOption.MET_DAMM (DAMM v1) for new configs and new pools. Existing DAMM v1 pools can still migrate.

What To Do

IntegratorsWhat ChangedWhat To Do
Partners
  • Support for Stock Tokens in DBC via Token Badges
  • Deprecation of Rate Limiter and DAMM v1
  • As the Rate Limiter is deprecated, you need to migrate to change your BaseFeeMode to other modes.
  • As the DAMM v1 is deprecated, you need to migrate to change your MigrationOption to other modes.
  • Bump your SDK version to @meteora-ag/dynamic-bonding-curve-sdk@1.5.11-rc.0 to start testing.

Program: dynamic-bonding-curve 0.2.1

Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #202

Added

  • Added endpoints create_token_badge and close_token_badge for operators to whitelist quote mints with otherwise-unsupported token2022 extensions guarded by new OperatorPermission::CreateTokenBadge and OperatorPermission::CloseTokenBadge.
  • Note that a token badge does not allow a non-zero transfer fee: the current and any scheduled transfer_fee_basis_points must be 0. Expired historical older_transfer_fee transfer fees are ignored. This is enforced with QuoteMintHasNonZeroTransferFee at token badge creation, at config/pool creation and on every endpoint that transfers quote tokens.
  • Note that all DAMM v2 configs used by DBC have the CreatePoolWithoutMintValidation permission, so a pool with a quote mint that is not permissionless-supported by DAMM v2 can still migrate.

Changed

  • The endpoints create_config, create_config_with_transfer_hook, initialize_virtual_pool_with_spl_token, initialize_virtual_pool_with_token2022 and initialize_virtual_pool_with_token2022_transfer_hook now take the token_badge account as a remaining account at index 0. Required when the quote mint is not permissionless-supported.

Deprecated

  • Deprecated BaseFeeMode::RateLimiter. New configs and new pools can no longer be created with BaseFeeMode::RateLimiter. Existing configs with BaseFeeMode::RateLimiter can no longer be used to create new pools. Existing pools with BaseFeeMode::RateLimiter are unaffected.
  • Deprecated MigrationOption::MeteoraDamm. New configs and new pools can no longer be created with MigrationOption::MeteoraDamm. Existing configs with MigrationOption::MeteoraDamm can no longer be used to create new pools. Existing pools with MigrationOption::MeteoraDamm are unaffected and can still migrate to DAMM v1.

Removed

  • Removed deprecated endpoints claim_protocol_fee and zap_protocol_fee.

TypeScript SDK: @meteora-ag/dynamic-bonding-curve-sdk 1.5.12

SDK PR #112

Added

  • Added optional tokenBadge remaining account support on config and pool creation. Required when the quote mint is not permissionless-supported.
  • Added deriveTokenBadgeAddress and getTokenBadgeRemainingAccounts helpers.
  • Added TokenBadge account type and client.state.getTokenBadge.

Changed

  • Updated the DBC IDL to program version 0.2.1.
  • getOrCreateATAInstruction and prepareTokenAccountTx now accept an optional commitment (defaults to confirmed) and pass it through to the token account fetch.
  • Synced the DAMM v2 IDL and test-validator cp_amm.so fixture to cp_amm 0.2.4. DAMM v2 configs now include a permission bitmask. Migration tests create a private DAMM v2 config with CreatePoolWithoutMintValidation so Token-2022 quote mints that need a DBC token badge can still migrate. Token-2022 wrapped SOL is still rejected.

Deprecated

  • Deprecated BaseFeeMode.RateLimiter for new configs and new pools. Existing rate-limiter pools can still be quoted and swapped.
  • Deprecated MigrationOption.MET_DAMM (DAMM v1) for new configs and new pools. Existing DAMM v1 pools can still migrate.

Breaking Changes

  • createConfig, createPool, and buildCurve* now reject BaseFeeMode.RateLimiter and MigrationOption.MET_DAMM.
  • getMigratedPoolFeeParams now rejects MigrationOption.MET_DAMM.
  • getBaseFeeParams no longer takes tokenQuoteDecimal or activationType. Those arguments were only used to encode RateLimiter params, which this helper now rejects.
Transfer Hook Support and Restricted Mint Authority
Mainnet deployment for Release 0.2.0 is planned for June 3, 2026, at 11:00 AM UTC+8 (Wednesday).

Release summary

What We Shipped

  • Transfer Hook Support
  • Restricted Mint Authority

What To Do

IntegratorsWhat ChangedWhat To Do
Swap Routers
  • Token-2022 transfer-hook pool support
  • New transfer-hook swap endpoint: swap2_with_transfer_hook
  • Use swap2_with_transfer_hook for transfer-hook pools and pass the required transfer_hook_accounts_info: TransferHookAccountsInfo remaining-account metadata.
  • Keep using the original swap endpoints for non-transfer-hook pools.
  • Update any direct pool account readers to handle the transfer-hook pool account and nested pool-state layout.
Trading Terminals
  • New transfer-hook event variants
  • Restricted mint-authority behavior for non-transfer-hook pools
  • Update event parsing for EvtInitializePoolWithTransferHook, EvtSwap2WithTransferHook, EvtCurveCompleteWithTransferHook, and EvtCreateConfigV2WithTransferHook.
  • Display transfer-hook pools separately from non-transfer-hook pools where users need to understand additional token-transfer requirements.
  • Do not assume creator or partner mint authority is available for non-transfer-hook pools. For those pools, base_mint mint authority is always revoked at initialization.
Partners
  • New transfer-hook config and pool-creation flow
  • Protocol-fee claim endpoint update
  • Restricted mint-authority config options
  • Bump your SDK version to at least @meteora-ag/dynamic-bonding-curve-sdk@1.5.8. Use 1.5.9+ for the transfer-hook state-fetch fix.
  • For Token-2022 transfer-hook launches, create configs with create_config_with_transfer_hook and initialize pools with initialize_virtual_pool_with_token2022_transfer_hook.
  • Only use CreatorUpdateAndMintAuthority or PartnerUpdateAndMintAuthority with transfer-hook configs. create_config, initialize_virtual_pool_with_spl_token, and initialize_virtual_pool_with_token2022 now reject those options.

Program: dynamic-bonding-curve 0.2.0

Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #193

Added

  • Added an endpoint claim_protocol_fee2 that requires protocol_fee_authority as the signer instead of an operator. Only one of the pool tokens can be claimed per instruction call.
  • Added endpoint create_config_with_transfer_hook that creates a ConfigWithTransferHook account storing the transfer hook program alongside the pool config. Only valid for token_type: Token2022. The transfer hook program must be executable and cannot be the DBC program, SPL Token program, Token 2022 program, or default pubkey.
  • Added endpoint initialize_virtual_pool_with_token2022_transfer_hook for creating virtual pools with token-2022 base mints that have transfer hooks. The transfer hook program is sourced from the ConfigWithTransferHook account and the transfer hook authority is set to the pool_authority. The transfer hook program and authority is revoked after the last swap when the curve completes.
  • Added endpoints with transfer hook support: swap2_with_transfer_hook, claim_trading_fee2 and claim_creator_trading_fee2. These accept a transfer_hook_accounts_info: TransferHookAccountsInfo parameter for passing transfer hook extra accounts via remaining accounts. The original endpoints are unchanged for backwards compatibility with non-transfer-hook pools.
  • Added WithTransferHook event variants for events consumed by external indexers to differentiate between transfer-hook and non-transfer-hook pool operations: EvtInitializePoolWithTransferHook, EvtSwap2WithTransferHook, EvtCurveCompleteWithTransferHook, EvtCreateConfigV2WithTransferHook.
  • Re-enabled TokenAuthorityOption::CreatorUpdateAndMintAuthority and TokenAuthorityOption::PartnerUpdateAndMintAuthority for transfer-hook configs only. The mint authority is assigned to the creator or partner at pool initialization.

Changed

  • Update anchor to 1.0.2

Deprecated

  • Deprecated claim_protocol_fee and zap_protocol_fee endpoints in favour of using claim_protocol_fee2 through the protocol_fee wrapper program.
  • Deprecated TokenAuthorityOption::CreatorUpdateAndMintAuthority and TokenAuthorityOption::PartnerUpdateAndMintAuthority for non-transfer-hook configs.

Removed

  • Removed unused events: EvtPartnerWithdrawMigrationFee and EvtClaimProtocolLiquidityMigrationFee

Breaking Changes

  • create_config endpoint now rejects the configs with the following token_update_authority: CreatorUpdateAndMintAuthority and PartnerUpdateAndMintAuthority
  • initialize_virtual_pool_with_spl_token and initialize_virtual_pool_with_token2022 endpoints now reject configs whose token_update_authority is CreatorUpdateAndMintAuthority or PartnerUpdateAndMintAuthority. Existing configs on-chain that used these variants can no longer initialize new pools.
  • For non-transfer-hook pools, base_mint mint authority can no longer be assigned to the creator or partner. It is always revoked at pool initialization. Transfer-hook pools may still assign mint authority to creator/partner.

TypeScript SDK: @meteora-ag/dynamic-bonding-curve-sdk 1.5.8

SDK PR #103

Added

  • Added Token-2022 transfer-hook support for DBC pool configs and pools:
    • client.partner.createConfigWithTransferHook
    • client.partner.createConfigAndPoolWithTransferHook
    • client.partner.createConfigAndPoolWithFirstBuyWithTransferHook
    • client.creator.createPoolWithTransferHook
    • client.creator.createPoolWithFirstBuyWithTransferHook
    • client.creator.createPoolWithPartnerAndCreatorFirstBuyWithTransferHook
  • Added transfer-hook swap and fee claim endpoints:
    • client.pool.swap2WithTransferHook
    • client.partner.claimPartnerTradingFee2
    • client.creator.claimCreatorTradingFee2
  • Added transfer-hook account helper types:
    • TransferHookAccountsInfo
    • TransferHookRemainingAccounts
    • FirstBuyWithTransferHookParams
    • PartnerFirstBuyWithTransferHookParams
    • CreatorFirstBuyWithTransferHookParams
    • AccountsType
  • Added account types for transfer-hook program accounts:
    • ConfigWithTransferHook
    • TransferHookPool
  • Added CreateVirtualPoolMetadataParameters as an exported IDL-derived type.
  • Added client.partner.createConfigAndPool and client.partner.createConfigAndPoolWithFirstBuy so partner-owned config-and-pool flows live under the partner service.
  • Added client.creator.createPool, client.creator.createPoolWithFirstBuy, and client.creator.createPoolWithPartnerAndCreatorFirstBuy so creator-owned pool initialization flows live under the creator service.
  • Added client.partner.claimPartnerTradingFeeToReceiver and client.creator.claimCreatorTradingFeeToReceiver for the non-transfer-hook fee claim flows that do not require tempWSolAcc.
  • Added test coverage for transfer-hook config creation, pool creation, swaps, first buys, and fee claims using the new transfer_hook_counter test program.

Changed

  • Updated the DBC IDL and generated types to include transfer-hook instructions and account layouts.
  • Updated DAMM V1, DAMM V2, and Dynamic Vault IDLs and generated types.
  • Updated DynamicBondingCurveClient so all services share one StateService instance.
  • Updated StateService.getPoolConfig to fetch both regular poolConfig accounts and transfer-hook config accounts.
  • Updated StateService.getPool to fetch both regular virtualPool accounts and transfer-hook pool accounts.
  • Updated swap quote math and state helpers to read virtual pool fields from the new nested poolState layout.
  • Updated buildCurve* helpers to accept token.tokenAuthorityOption and map it to the on-chain tokenUpdateAuthority field.
  • Renamed createVaultProgram to createDynamicVaultProgram to match the Dynamic Vault IDL naming.
  • Renamed internal/public DAMM V1 and Dynamic Vault generated IDL program types from DammV1 and DynamicVault to Amm and Vault.
  • Updated validator and CI setup to use the mercurial_vault.so fixture and include the transfer_hook_counter.so fixture.
  • Reworked docs.md with the current SDK service layout and transfer-hook function documentation.
  • Updated getMigratedPoolMarketCapFeeSchedulerParams and MigratedPoolMarketCapFeeSchedulerParams to use priceMultiple directly.

Breaking Changes

  • Pool creation methods moved service namespaces. Existing callers must update:
    • client.pool.createPool(...) -> client.creator.createPool(...)
    • client.pool.createPoolWithFirstBuy(...) -> client.creator.createPoolWithFirstBuy(...)
    • client.pool.createPoolWithPartnerAndCreatorFirstBuy(...) -> client.creator.createPoolWithPartnerAndCreatorFirstBuy(...)
    • client.pool.createConfigAndPool(...) -> client.partner.createConfigAndPool(...)
    • client.pool.createConfigAndPoolWithFirstBuy(...) -> client.partner.createConfigAndPoolWithFirstBuy(...)
  • Pool address params were renamed from virtualPool to pool across SDK request types. Update call sites for:
    • CreateLockerParams
    • WithdrawLeftoverParams
    • MigrateToDammV1Params
    • MigrateToDammV2Params
    • DammLpTokenParams
    • PartnerWithdrawSurplusParams
    • CreatorWithdrawSurplusParams
    • TransferPoolCreatorParams
    • WithdrawMigrationFeeParams
    • ClaimPartnerPoolCreationFeeParams
  • Virtual pool account data now uses the nested poolState layout. Code that directly reads VirtualPool fields must migrate from flat fields like pool.config, pool.baseMint, pool.quoteReserve, pool.sqrtPrice, and pool.metrics to pool.poolState.config, pool.poolState.baseMint, pool.poolState.quoteReserve, pool.poolState.sqrtPrice, and pool.poolState.metrics.
  • TokenType.SPL was renamed to TokenType.SPLToken. The enum value remains 0, but TypeScript callers must update the enum member name.
  • TokenUpdateAuthorityOption was renamed to TokenAuthorityOption. Update imports and references.
  • TokenConfig.tokenUpdateAuthority was renamed to tokenAuthorityOption for all buildCurve* helpers. The helper still maps this value to the on-chain tokenUpdateAuthority config field.
  • PreCreatePoolParams was renamed to CreatePoolBaseParams. Update imports and any explicit type annotations.
  • The old no-tempWSolAcc trading fee claim types were renamed.
    • ClaimTradingFeeParams -> ClaimPartnerTradingFeeParams
    • ClaimTradingFee2Params -> ClaimPartnerTradingFeeToReceiverParams
    • ClaimCreatorTradingFee2Params -> ClaimCreatorTradingFeeToReceiverParams
  • The old claimPartnerTradingFee2 and claimCreatorTradingFee2 non-transfer-hook behavior moved to claimPartnerTradingFeeToReceiver and claimCreatorTradingFeeToReceiver. In 1.5.8, claimPartnerTradingFee2 and claimCreatorTradingFee2 build transfer-hook fee claim instructions and should be used only for transfer-hook pools.
  • createVaultProgram was renamed to createDynamicVaultProgram. Update helper imports.
  • StateService.getDammV1LockEscrow was removed. Consumers that need lock escrow data must fetch it through the relevant generated program client.
  • LockEscrow now comes from IDL types instead of IDL accounts. Update assumptions if you were treating it as an Anchor account object.
  • Raw IDL instruction indexes changed. Code using DynamicBondingCurve['instructions'][index] directly must be updated because transfer-hook instructions shifted the generated instruction order.
  • Market cap fee scheduler config now uses priceMultiple. Replace marketCapFeeSchedulerParams.startingMarketCap and marketCapFeeSchedulerParams.endingMarketCap with marketCapFeeSchedulerParams.priceMultiple.

Fixed

  • Fixed state and quote helpers to work with the new nested virtual pool account layout.
  • Fixed transfer-hook pool state reads so getPoolConfig, getPool, fee metrics, fee breakdowns, and curve progress helpers work with both regular and transfer-hook pools.
  • Fixed SOL quote handling in transfer-hook fee claim flows by preserving the wrapped SOL post-instructions where needed.
Migrate to DAMM v2 Inner Positions + DAMM v2 Compounding Fee
Mainnet deployment for Release 0.1.10 is planned for March 16, 2026, at 11:00 AM UTC+8 (Monday).

Release summary

What We Shipped

  • Migrate to DAMM v2 Inner Positions
  • Migrate to DAMM v2 Compounding Fee Pool

What To Do

IntegratorsWhat ChangedWhat To Do
Trading Terminals
  • EvtPartnerClaimPoolCreationFee event parsing
  • The EvtPartnerClaimPoolCreationFee event now includes a fee_receiver field. Partners parsing/indexing this event must update their deserialization.
Partners
  • Bonding Curve Configuration Updates
  • Bump your SDK version to @meteora-ag/dynamic-bonding-curve-sdk@1.5.5-rc.0 to start testing.
  • Optionally update your bonding curve configuration to enable compounding fee mode by passing migrated_pool_fee.collect_fee_mode: 2 and compounding_fee_bps: 1-10_000 field in ConfigParameters

Program: dynamic-bonding-curve 0.1.10

Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #174

Added

  • Add new endpoint create_operator_account and close_operator_account that allows admin to manage different operator accounts.
  • Add new account Operator, that would stores whitelisted_address as well as their operational permissions
  • Add new endpoint zap_protocol_fee that allow operator to claim protocol fees and zap out to SOL/USDC or other token in pool and send to treasury address
  • Add support for damm-v2 Compounding collect_fee_mode. This can be enabled through the create_config endpoint by passing migrated_pool_fee.collect_fee_mode: 2 and compounding_fee_bps: 1-10_000 field in ConfigParameters

Changed

  • When migrate to damm-v2, instead of using external accounts for vesting, now we will use position itself, that would save 2 accounts for damm-v2 migration instruction.

Removed

  • Removed the create_claim_protocol_fee_operator endpoint in favor of create_operator_account, which can create an operator account configured with permissions, including claiming protocol fees.

TypeScript SDK: @meteora-ag/dynamic-bonding-curve-sdk 1.5.6

SDK PR #98

Added

  • Added MigratedCollectFeeMode enum with Compounding (2) support for migrated DAMM v2 pool configuration.
  • Added compoundingFeeBps support in MigratedPoolFeeConfig and propagated it through all buildCurve* helpers.

Changed

  • Updated migrated pool fee validation to require compoundingFeeBps > 0 only when collectFeeMode = MigratedCollectFeeMode.Compounding, and 0 otherwise.
  • Updated migration flow for DAMM v2 to remove position vesting accounts from migrateDammV2 remaining accounts.
  • Removed deriveDammV2PositionVestingAccount PDA helper.