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_config2and a token badge - Permissionless support for quote mints with a zero transfer fee and a revoked transfer fee config authority
MigratedCollectFeeMode.Compoundingaccepts acompounding_fee_bpsof 0- TypeScript SDK
2.0.0, with swap quotes that account for Token-2022 transfer fees
What To Do
| Integrators | What Changed | What To Do |
|---|---|---|
| Partners |
|
|
| Swap Routers |
|
|
| Trading Terminals |
|
|
Program: dynamic-bonding-curve 0.2.2
Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #211Added
- Added support for creating base mints with a transfer fee. The fee is configured per config through the optional
transfer_fee_parametersargument increate_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_v2uses 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
TransferFeeConfigwhose fee is zero and whose transfer fee config authority is revoked. - Added support for a zero
compounding_fee_bpswithMigratedCollectFeeMode::Compoundingwhen migrating to DAMMv2. - Added endpoint
create_config2that takes the new optionalTransferFeeParametersargument. 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 newEvtCreateConfig3event and theEvtCreateConfigV2event. 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 andpre_migration_token_supplyequalspost_migration_token_supply), no locked vesting,MigrationFeeOption::Customizable, andMigratedCollectFeeMode::Compounding. - Emit new events
EvtSwap3andEvtSwap3WithTransferHookin swap endpoints. They reportincluded_transfer_fee_amount_inandexcluded_transfer_fee_amount_out.
Changed
- Config creation now sets
PoolConfig.versionto 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 inmigration_damm_v2which migrates through the original path, which does not account for transfer fees. Somigration_damm_v2still rejects a non-zero quote transfer fee for a legacy config. - Legacy
EvtSwap.paramsreports the amounts including the transfer fee.EvtSwap.params.amount_inequalsEvtSwap3.included_transfer_fee_amount_inin every swap mode.EvtSwap.params.minimum_amount_outequalsEvtSwap3.excluded_transfer_fee_amount_outforExactOutandPartialFill, and is the user’sminimum_amount_outforExactIn. - Swap endpoints account for the transfer fee on either mint: the curve uses the amount received after the fee,
minimum_amount_outis checked against the amount the user receives after the fee, andmaximum_amount_inis 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_v2deposits 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 toprotocol_migration_base_fee_amountorprotocol_migration_quote_fee_amount, claimable throughclaim_protocol_fee2. This transfer fee path is used forPoolConfig.version1 only. - When a transfer fee is involved, the endpoint
migration_damm_v2makes a single transfer per mint. The whole migrated liquidity is deposited into the first position, and the second position is carved out of it withsplit_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_v2deposits. - Endpoint
withdraw_leftoverrequires the signature ofleftover_receiverwhen the transfer fee on the leftover is non-zero. The endpoint stays permissionless when the transfer fee is zero. - Endpoint
create_configemits the newEvtCreateConfig3event in addition toEvtCreateConfigV2. Endpointcreate_config2emits the same pair, so an indexer that follows only one of the two events sees every config from these two endpoints. Endpointcreate_config_with_transfer_hookstill emits onlyEvtCreateConfigV2WithTransferHook.
Deprecated
- Deprecated
create_configendpoint in favour ofcreate_config2. - Deprecated
EvtCreateConfigV2event in favour ofEvtCreateConfig3.
Removed
- Removed the deprecated
EvtCreateConfigevent. Thecreate_configendpoint no longer emits the event. Indexers must consumeEvtCreateConfigV2orEvtCreateConfig3.
Breaking Changes
- Endpoints
create_configandcreate_config_with_transfer_hookreject a quote mint with a non-zero transfer fee or a live transfer fee config authority with the errorInvalidQuoteMint, even with a token badge. A badged quote mint with aTransferFeeConfigextension and a zero fee was previously accepted by these endpoints. Such a quote mint is now only accepted bycreate_config2. - Endpoints
create_config,create_config2,create_config_with_transfer_hook,initialize_virtual_pool_with_spl_token,initialize_virtual_pool_with_token2022andinitialize_virtual_pool_with_token2022_transfer_hookreject a quote mint that is not permissionless-supported and has no token badge with the errorInvalidQuoteMint. Previously these endpoints returnedInvalidTokenBadge, which is now returned only when the supplied token badge does not match the quote mint. - Endpoints
create_config,create_config2andcreate_config_with_transfer_hookreject aPubkey::default()fee claimer with the errorInvalidFeeClaimerwhen the token type is Token-2022 andtoken_update_authorityisPartnerUpdateAuthorityorPartnerUpdateAndMintAuthority. Previously such a config was created successfully with thecreate_configandcreate_config_with_transfer_hookendpoints, but every pool initialization from it failed, because Token-2022 rejects thePubkey::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_hookrejects such a quote mint, andcreate_config2accepts it but does not take a transfer hook program. - Endpoints
initialize_virtual_pool_with_spl_token,initialize_virtual_pool_with_token2022andinitialize_virtual_pool_with_token2022_transfer_hookreject a legacy config whose quote mint has a non-zero transfer fee or a live transfer fee config authority, with the errorInvalidQuoteMint. 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_hookrejects 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
EvtCreateConfigevent. An indexer that consumes it must switch toEvtCreateConfigV2orEvtCreateConfig3. - Rust SDK:
quote_exact_in,quote_exact_out, andquote_partial_filltake newcurrent_epoch: u64,base_mint_transfer_fee_config: Option<&TransferFeeConfig>andquote_mint_transfer_fee_config: Option<&TransferFeeConfig>parameters. - Rust SDK:
quote_exact_in,quote_exact_out, andquote_partial_fillreturnSwapResultWithTransferFeeinstead ofSwapResult2.SwapResultWithTransferFeecontainsswap_result: SwapResult2,included_transfer_fee_amount_inandexcluded_transfer_fee_amount_out.
TypeScript SDK: @meteora-ag/dynamic-bonding-curve-sdk 2.0.0
SDK PR #123Added
client.partner.createConfig2. PasstransferFeeParametersfor a base-mint transfer fee, ornullwhen there is none.0basis points still creates aTransferFeeConfigand is rejected withMigratedTransferFeeAuthorityOption.ImmutableorRevokeZeroFee.TransferFeeWithheldAuthorityandMigratedTransferFeeAuthorityOption.- Swap quotes account for Token-2022 transfer fees and return
includedTransferFeeAmountInandexcludedTransferFeeAmountOut.getSwapQuoteTransferFees(connection, config, { commitment?, baseMint? })fetches the quote mint, the base mint whenbaseMintis passed, and the current epoch. getQuoteFromInputAmountandgetQuoteFromOutputAmountquote abuildCurveresult as its pool would be right afterinitialize_pool.client.pool.swapQuote2quotes an existing pool and requirescurrentPoint.@meteora-ag/dynamic-bonding-curve-sdk/math: the ports of the program’s curve, fee, transfer fee and swap math, plusProgramError, the program’s error strings the SDK throws.QuotePoolConfig,QuoteVirtualPool,QuotePoolFees,QuoteDynamicFeeandQuoteVolatilityTracker: the fields the quote math reads. APoolConfigand aVirtualPoolsatisfy them.client.state.getPoolWithKindandclient.state.getPoolConfigWithKindfetch an account once and say whether it is the transfer-hook variant.getMigrationQuoteAmountFromThreshold,getTransferFeeMigrationPositionSplit,EpochTransferFee,TransferFeeMigrationPositionSplitandPoolFeeSummaryat the package root.rateLimiterAppliedat the package root, for callers who build the swap instruction themselves and need to know whether to pass the instructions sysvar.MAX_DYNAMIC_FEE_PERCENTandPARTNER_AND_CREATOR_SURPLUS_SHARE.getSurplusBreakdownandclient.state.getPoolSurplus: the surplus split the program pays onpartnerWithdrawSurplusandcreatorWithdrawSurplus, and whether each side has withdrawn.liveCurveon./math: a storedPoolConfig.curveup to its first zero point.
Changed
createConfigAndPoolandcreateConfigAndPoolWithFirstBuyalways usecreateConfig2. OmittingtransferFeeParametersis the same asnull.- 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.CustomizableandMigratedCollectFeeMode.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-defaultfeeClaimer. MigratedCollectFeeMode.CompoundingallowscompoundingFeeBpsof0.- Configs created by program 0.2.2 have
PoolConfig.version1 andtransferFeeFlag. Swap quotes read the base transfer fee from that flag unlessbaseMintorbaseTransferFeeBasisPointsis passed. A transfer fee is zero when its basis points are 0 or its maximum fee is 0. - A legacy config (
version0) cannot initialize a pool on a quote mint with a non-zero transfer fee or a live transfer fee config authority, andmigrateToDammV2rejects 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.
getTransferFeeMigrationPositionSplituses the numerator(1_000_000_000 / 100) * percentageand rounds the liquidity down. - Partial-fill quotes throw
Required input amount exceeds the provided amount inwhen the reconstructed input is larger thanamountIn. withdrawLeftovermakesleftoverReceivera signer when the leftover charges a transfer fee.- Curve builders reserve the program migration base,
ceil(migrationQuoteThreshold * (100 - migrationFee.feePercentage) / 100).buildCurveWithLiquidityWeightsandbuildCurveWithCustomSqrtPricesuse constant product forCompoundingand concentrated liquidity otherwise, and the last segment ofbuildCurveWithLiquidityWeightsnow ends exactly at the migration sqrt price.buildCurveWithTwoSegmentsandbuildCurveWithMidPricekeep a fractionalpercentageSupplyOnMigration. - 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
MigrationFeeOptionis combined with a custom migrated pool base fee mode or market cap scheduler.getMigratedPoolFeeParamstakes three arguments and requires a market cap scheduler base fee mode exactly whenmarketCapFeeSchedulerParamsis set. getFeeSchedulerParamschecks both fees against the program bounds, also when the fee is constant. Exponential schedulers, including the migrated market-cap scheduler, choosereductionFactorwith the program’s Q64 decay so the last period stays at or above the ending fee.calculateFeeSchedulerEndingBaseFeeBpsuses the program’s integer conversion.getLockedVestingParamsandgetLiquidityVestingInfoParamsfloor their frequency and reject a duration shorter than the number of periods.validateConfigParameterstakes an options object, checks the curve shape before any curve math runs on it, and only applies the fee-claimer rule whenfeeClaimeris passed.- Rate-limiter validation checks the fee at
u64::MAX. Swap quotes reject amounts outside the program’su64andu128bounds andslippageBpsoutside[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.ProgramErrorin./mathlists them. client.state.getPoolConfigsByOwnerfilters on the config’s fee claimer. It filtered on the leftover receiver since 1.0.getCurveBreakdownconsumes only the remaining threshold on each segment and stops at exact cumulative completion (PR #120, snuff12).getBaseTokenForSwap,getMigrationThresholdPrice,getSwapAmountWithBuffer,getCurveBreakdownandgetQuoteReserveFromNextSqrtPricestop at the first zero point of a stored curve, like the program.client.state.getPoolBaseTokenCurveProgressthrewMath operation overflowonce the price reached the last curve point, and at any time for a config whose last point is the migration price.getBaseTokenForSwapandgetMigrationThresholdPriceaccumulate without a per-segmentu64bound, 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.getDammV1MigrationMetadatareturnsnullinstead of throwing when the account does not exist.client.state.getPoolMetadata(pool)andclient.state.getPartnerMetadata(feeClaimer)fetch the metadata PDA and return the account, ornullwhen none was created, instead of an array.getTokenTypeandgetTokenDecimalstake an optional commitment.- Synced the DAMM v2 IDL and
cp_amm.sofixture to cp_amm 0.2.5. docs.mdandCHANGELOG.mdship in the package.
Deprecated
client.partner.createConfigin favour ofcreateConfig2.createConfigandcreateConfigWithTransferHookreject a quote mint with a non-zero transfer fee or a live transfer fee config authority.getRateLimiterParams. The program rejectsBaseFeeMode.RateLimiterfor new configs.
Removed
- Helpers nothing referenced:
getAccountData,getAccountCreationTimestamp,getAccountCreationTimestamps,prepareTokenAccountTx,cleanUpTokenAccountTx,checkRateLimiterApplied,validateBalance,validateBaseTokenType,validateQuoteMintBasic,deriveDammV1EventAuthority,deriveDammV1PoolAuthority,deriveDammV2LockEscrowAddress,findAssociatedTokenAddress,deriveVaultAddress,deriveTokenVaultKey,deriveVaultLpMintAddress,requirePublicKey,convertDecimalToBN(usefromDecimalToBN),mulShr,SafeMath.mod,getFeeSchedulerMaxBaseFeeNumerator,getRateLimiterMinBaseFeeNumerator,getDeltaAmountBaseUnsignedUncheckedandgetDeltaAmountQuoteUnsignedUnchecked(the256variants are the unbounded ones),BaseFeeHandler.validate,getProgram()on the services (useprogram), andDynamicBondingCurveClient.create(the constructor defaultscommitmenttoconfirmed). - Types nothing used:
SwapQuoteConfig,DynamicCurveProgram,CreateConfigAccounts,InitializeSplPoolAccounts,InitializeToken2022PoolAccounts,InitializePoolParameters,LockEscrow,FeeResult,ClaimCreatorTradingFeeWithQuoteMintNotSolParamsandClaimCreatorTradingFeeWithQuoteMintSolParams. - The
jito-tsdev dependency.
Breaking Changes
- Import from
@meteora-ag/dynamic-bonding-curve-sdkor@meteora-ag/dynamic-bonding-curve-sdk/math. The package root is an explicit export list and theexportsmap exposes only those two entries. The curve, fee, transfer fee and swap math moved to./math(57 functions, among themcalculateBaseToQuoteFromAmountIn,getFeeMode,getIncludedFeeAmount,getFeeNumeratorFromIncludedAmount,getSwapResult, thegetDeltaAmount*andgetNextSqrtPrice*functions,SafeMath,mulDivandpow).swapQuoteExactIn,swapQuoteExactOut,swapQuotePartialFillandDynamicBondingCurveProgramare not exported;swapQuotestays on the root. Internal helpers such asgetOrCreateATAInstruction,unwrapSOLInstruction,wrapSOLInstruction,deriveMintMetadata,derivePositionAddress,createDammV1Program,getFirstCurve,getTwoCurve,isDefaultLockedVestingand thevalidate*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,CreateConfig2ParamsandCreateConfigWithTransferHookParamsdeclareconfig,feeClaimer,leftoverReceiver,quoteMintandpayeras requiredPublicKeys.getSwapQuoteTransferFeestakes an options object instead of a commitment string. Swap quotes for a Token-2022 quote mint requirequoteMintandcurrentEpoch.getFeeOnAmountandsplitFeesno longer takepoolFees.calculateBaseToQuoteFromAmountOutandcalculateQuoteToBaseFromAmountOutreturn{ amountIn, nextSqrtPrice }.getOrCreateATAInstruction(connection, mint, owner, payer, tokenProgram, commitment?): theallowOwnerOffCurveargument is gone and always on.unwrapSOLInstructionalways returns an instruction.createDbcProgramreturns thePrograminstead of{ program }.deriveEscrowisderiveLockerEscrowAddress.getMigratedPoolFeeParamsthrows forMigrationFeeOption.CustomizablewhenmigratedPoolFee.poolFeeBpsis not set.swap,swap2,claimPartnerTradingFee,claimPartnerTradingFeeToReceiver,claimCreatorTradingFeeandclaimCreatorTradingFeeToReceiverreject transfer-hook pools. Useswap2WithTransferHook,claimPartnerTradingFee2andclaimCreatorTradingFee2. Standard pool creation rejects a transfer-hook config, and transfer-hook pool creation rejects a standard config.transferPoolCreatorrejects anewCreatorequal tocreator.tempWSolAccis gone fromclaimPartnerTradingFeeandclaimCreatorTradingFee. With a native SOL quote the fee is wrapped into the fee claimer’s or creator’s token account and unwrapped toreceiver, so only the claimer signs.validateSwapAmountreturns nothing and throwsAmount 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.RateLimiterfor 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
| Integrators | What Changed | What To Do |
|---|---|---|
| Partners |
|
|
Program: dynamic-bonding-curve 0.2.1
Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #202Added
- Added endpoints
create_token_badgeandclose_token_badgefor operators to whitelist quote mints with otherwise-unsupported token2022 extensions guarded by newOperatorPermission::CreateTokenBadgeandOperatorPermission::CloseTokenBadge. - Note that a token badge does not allow a non-zero transfer fee: the current and any scheduled
transfer_fee_basis_pointsmust be 0. Expired historicalolder_transfer_feetransfer fees are ignored. This is enforced withQuoteMintHasNonZeroTransferFeeat 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
CreatePoolWithoutMintValidationpermission, 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_token2022andinitialize_virtual_pool_with_token2022_transfer_hooknow take thetoken_badgeaccount 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 withBaseFeeMode::RateLimiter. Existing configs withBaseFeeMode::RateLimitercan no longer be used to create new pools. Existing pools withBaseFeeMode::RateLimiterare unaffected. - Deprecated
MigrationOption::MeteoraDamm. New configs and new pools can no longer be created withMigrationOption::MeteoraDamm. Existing configs withMigrationOption::MeteoraDammcan no longer be used to create new pools. Existing pools withMigrationOption::MeteoraDammare unaffected and can still migrate to DAMM v1.
Removed
- Removed deprecated endpoints
claim_protocol_feeandzap_protocol_fee.
TypeScript SDK: @meteora-ag/dynamic-bonding-curve-sdk 1.5.12
SDK PR #112Added
- Added optional
tokenBadgeremaining account support on config and pool creation. Required when the quote mint is not permissionless-supported. - Added
deriveTokenBadgeAddressandgetTokenBadgeRemainingAccountshelpers. - Added
TokenBadgeaccount type andclient.state.getTokenBadge.
Changed
- Updated the DBC IDL to program version 0.2.1.
getOrCreateATAInstructionandprepareTokenAccountTxnow accept an optionalcommitment(defaults toconfirmed) and pass it through to the token account fetch.- Synced the DAMM v2 IDL and test-validator
cp_amm.sofixture to cp_amm 0.2.4. DAMM v2 configs now include apermissionbitmask. Migration tests create a private DAMM v2 config withCreatePoolWithoutMintValidationso Token-2022 quote mints that need a DBC token badge can still migrate. Token-2022 wrapped SOL is still rejected.
Deprecated
- Deprecated
BaseFeeMode.RateLimiterfor 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, andbuildCurve*now rejectBaseFeeMode.RateLimiterandMigrationOption.MET_DAMM.getMigratedPoolFeeParamsnow rejectsMigrationOption.MET_DAMM.getBaseFeeParamsno longer takestokenQuoteDecimaloractivationType. 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
| Integrators | What Changed | What To Do |
|---|---|---|
| Swap Routers |
|
|
| Trading Terminals |
|
|
| Partners |
|
|
Program: dynamic-bonding-curve 0.2.0
Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #193Added
- Added an endpoint
claim_protocol_fee2that requiresprotocol_fee_authorityas the signer instead of an operator. Only one of the pool tokens can be claimed per instruction call. - Added endpoint
create_config_with_transfer_hookthat creates aConfigWithTransferHookaccount storing the transfer hook program alongside the pool config. Only valid fortoken_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_hookfor creating virtual pools with token-2022 base mints that have transfer hooks. The transfer hook program is sourced from theConfigWithTransferHookaccount and the transfer hook authority is set to thepool_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_fee2andclaim_creator_trading_fee2. These accept atransfer_hook_accounts_info: TransferHookAccountsInfoparameter for passing transfer hook extra accounts via remaining accounts. The original endpoints are unchanged for backwards compatibility with non-transfer-hook pools. - Added
WithTransferHookevent 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::CreatorUpdateAndMintAuthorityandTokenAuthorityOption::PartnerUpdateAndMintAuthorityfor 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_feeandzap_protocol_feeendpoints in favour of usingclaim_protocol_fee2through theprotocol_feewrapper program. - Deprecated
TokenAuthorityOption::CreatorUpdateAndMintAuthorityandTokenAuthorityOption::PartnerUpdateAndMintAuthorityfor non-transfer-hook configs.
Removed
- Removed unused events:
EvtPartnerWithdrawMigrationFeeandEvtClaimProtocolLiquidityMigrationFee
Breaking Changes
create_configendpoint now rejects the configs with the followingtoken_update_authority:CreatorUpdateAndMintAuthorityandPartnerUpdateAndMintAuthorityinitialize_virtual_pool_with_spl_tokenandinitialize_virtual_pool_with_token2022endpoints now reject configs whosetoken_update_authorityisCreatorUpdateAndMintAuthorityorPartnerUpdateAndMintAuthority. Existing configs on-chain that used these variants can no longer initialize new pools.- For non-transfer-hook pools,
base_mintmint 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 #103Added
- Added Token-2022 transfer-hook support for DBC pool configs and pools:
client.partner.createConfigWithTransferHookclient.partner.createConfigAndPoolWithTransferHookclient.partner.createConfigAndPoolWithFirstBuyWithTransferHookclient.creator.createPoolWithTransferHookclient.creator.createPoolWithFirstBuyWithTransferHookclient.creator.createPoolWithPartnerAndCreatorFirstBuyWithTransferHook
- Added transfer-hook swap and fee claim endpoints:
client.pool.swap2WithTransferHookclient.partner.claimPartnerTradingFee2client.creator.claimCreatorTradingFee2
- Added transfer-hook account helper types:
TransferHookAccountsInfoTransferHookRemainingAccountsFirstBuyWithTransferHookParamsPartnerFirstBuyWithTransferHookParamsCreatorFirstBuyWithTransferHookParamsAccountsType
- Added account types for transfer-hook program accounts:
ConfigWithTransferHookTransferHookPool
- Added
CreateVirtualPoolMetadataParametersas an exported IDL-derived type. - Added
client.partner.createConfigAndPoolandclient.partner.createConfigAndPoolWithFirstBuyso partner-owned config-and-pool flows live under the partner service. - Added
client.creator.createPool,client.creator.createPoolWithFirstBuy, andclient.creator.createPoolWithPartnerAndCreatorFirstBuyso creator-owned pool initialization flows live under the creator service. - Added
client.partner.claimPartnerTradingFeeToReceiverandclient.creator.claimCreatorTradingFeeToReceiverfor the non-transfer-hook fee claim flows that do not requiretempWSolAcc. - Added test coverage for transfer-hook config creation, pool creation, swaps, first buys, and fee claims using the new
transfer_hook_countertest 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
DynamicBondingCurveClientso all services share oneStateServiceinstance. - Updated
StateService.getPoolConfigto fetch both regularpoolConfigaccounts and transfer-hook config accounts. - Updated
StateService.getPoolto fetch both regularvirtualPoolaccounts and transfer-hook pool accounts. - Updated swap quote math and state helpers to read virtual pool fields from the new nested
poolStatelayout. - Updated
buildCurve*helpers to accepttoken.tokenAuthorityOptionand map it to the on-chaintokenUpdateAuthorityfield. - Renamed
createVaultProgramtocreateDynamicVaultProgramto match the Dynamic Vault IDL naming. - Renamed internal/public DAMM V1 and Dynamic Vault generated IDL program types from
DammV1andDynamicVaulttoAmmandVault. - Updated validator and CI setup to use the
mercurial_vault.sofixture and include thetransfer_hook_counter.sofixture. - Reworked
docs.mdwith the current SDK service layout and transfer-hook function documentation. - Updated
getMigratedPoolMarketCapFeeSchedulerParamsandMigratedPoolMarketCapFeeSchedulerParamsto usepriceMultipledirectly.
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
virtualPooltopoolacross SDK request types. Update call sites for:CreateLockerParamsWithdrawLeftoverParamsMigrateToDammV1ParamsMigrateToDammV2ParamsDammLpTokenParamsPartnerWithdrawSurplusParamsCreatorWithdrawSurplusParamsTransferPoolCreatorParamsWithdrawMigrationFeeParamsClaimPartnerPoolCreationFeeParams
- Virtual pool account data now uses the nested
poolStatelayout. Code that directly readsVirtualPoolfields must migrate from flat fields likepool.config,pool.baseMint,pool.quoteReserve,pool.sqrtPrice, andpool.metricstopool.poolState.config,pool.poolState.baseMint,pool.poolState.quoteReserve,pool.poolState.sqrtPrice, andpool.poolState.metrics. TokenType.SPLwas renamed toTokenType.SPLToken. The enum value remains0, but TypeScript callers must update the enum member name.TokenUpdateAuthorityOptionwas renamed toTokenAuthorityOption. Update imports and references.TokenConfig.tokenUpdateAuthoritywas renamed totokenAuthorityOptionfor allbuildCurve*helpers. The helper still maps this value to the on-chaintokenUpdateAuthorityconfig field.PreCreatePoolParamswas renamed toCreatePoolBaseParams. Update imports and any explicit type annotations.- The old no-
tempWSolAcctrading fee claim types were renamed.ClaimTradingFeeParams->ClaimPartnerTradingFeeParamsClaimTradingFee2Params->ClaimPartnerTradingFeeToReceiverParamsClaimCreatorTradingFee2Params->ClaimCreatorTradingFeeToReceiverParams
- The old
claimPartnerTradingFee2andclaimCreatorTradingFee2non-transfer-hook behavior moved toclaimPartnerTradingFeeToReceiverandclaimCreatorTradingFeeToReceiver. In1.5.8,claimPartnerTradingFee2andclaimCreatorTradingFee2build transfer-hook fee claim instructions and should be used only for transfer-hook pools. createVaultProgramwas renamed tocreateDynamicVaultProgram. Update helper imports.StateService.getDammV1LockEscrowwas removed. Consumers that need lock escrow data must fetch it through the relevant generated program client.LockEscrownow 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. ReplacemarketCapFeeSchedulerParams.startingMarketCapandmarketCapFeeSchedulerParams.endingMarketCapwithmarketCapFeeSchedulerParams.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
| Integrators | What Changed | What To Do |
|---|---|---|
| Trading Terminals |
|
|
| Partners |
|
|
Program: dynamic-bonding-curve 0.1.10
Program ID (mainnet and devnet): dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqNProgram PR #174Added
- Add new endpoint
create_operator_accountandclose_operator_accountthat allows admin to manage different operator accounts. - Add new account
Operator, that would storeswhitelisted_addressas well as their operational permissions - Add new endpoint
zap_protocol_feethat 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 thecreate_configendpoint by passingmigrated_pool_fee.collect_fee_mode: 2andcompounding_fee_bps: 1-10_000field inConfigParameters
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_operatorendpoint in favor ofcreate_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 #98Added
- Added
MigratedCollectFeeModeenum withCompounding(2) support for migrated DAMM v2 pool configuration. - Added
compoundingFeeBpssupport inMigratedPoolFeeConfigand propagated it through allbuildCurve*helpers.
Changed
- Updated migrated pool fee validation to require
compoundingFeeBps > 0only whencollectFeeMode = MigratedCollectFeeMode.Compounding, and0otherwise. - Updated migration flow for DAMM v2 to remove position vesting accounts from
migrateDammV2remaining accounts. - Removed
deriveDammV2PositionVestingAccountPDA helper.

