> ## Documentation Index
> Fetch the complete documentation index at: https://docs.meteora.ag/llms.txt
> Use this file to discover all available pages before exploring further.

# DBC Changelog

> Track DBC release notes, breaking changes, and upgrade guidance for the program, IDL, TypeScript SDK, Rust quote helpers, and migration flows.

<Tip>
  Track DBC releases here.
</Tip>

<Update label="dynamic-bonding-curve 0.2.2" description="Token-2022 Transfer Fees and SDK 2.0.0" rss="DBC dynamic-bonding-curve 0.2.2 adds base-mint transfer fees and non-zero quote-mint transfer fees through create_config2, emits EvtSwap3 with transfer-fee amounts, and ships TypeScript SDK 2.0.0.">
  <Info>
    Mainnet deployment for Release 0.2.2 is planned for October 16, 2026, at 11:00 AM UTC+8 (Friday).
  </Info>

  ## Release summary

  | Component | Version | PR |
  | - | - | - |
  | Program | `0.2.2` | [dynamic-bonding-curve #211](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/211) |
  | TypeScript SDK | `2.0.0` | [dynamic-bonding-curve-sdk #123](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/123) |

  ## 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

  <div style={{overflowX: 'auto', marginBottom: '1.5rem'}}>
    <table>
      <thead>
        <tr>
          <th>Integrators</th>
          <th>What Changed</th>
          <th>What To Do</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><strong>Partners</strong></td>

          <td>
            <ul>
              <li>New config endpoint <code>create\_config2</code>, with optional <code>transfer\_fee\_parameters</code> for a base-mint transfer fee</li>
              <li>Quote mints with a non-zero transfer fee or a live transfer fee config authority are accepted only by <code>create\_config2</code></li>
              <li>Configs created by program 0.2.2 have <code>PoolConfig.version</code> 1</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Bump to <code>@meteora-ag/dynamic-bonding-curve-sdk\@2.0.0</code>. Early testing: <code>@meteora-ag/dynamic-bonding-curve-sdk\@1.5.13-rc.0</code>.</li>
              <li>Create configs with <code>client.partner.createConfig2</code>. Pass <code>transferFeeParameters</code> for a base-mint transfer fee, which requires a Token-2022 base mint and is at most 10%. Pass <code>null</code> when there is none.</li>
              <li>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, <code>MigrationFeeOption.Customizable</code>, and <code>MigratedCollectFeeMode.Compounding</code>.</li>
              <li>Set a non-default <code>feeClaimer</code> when the config uses a partner transfer-fee authority or a Token-2022 partner token-update authority.</li>
              <li><code>withdrawLeftover</code> requires <code>leftoverReceiver</code> as a signer when the leftover charges a transfer fee.</li>
              <li>Import curve, fee, and swap math from <code>@meteora-ag/dynamic-bonding-curve-sdk/math</code>. Construct services through <code>DynamicBondingCurveClient</code>.</li>
            </ul>
          </td>
        </tr>

        <tr>
          <td><strong>Swap Routers</strong></td>

          <td>
            <ul>
              <li>Swaps account for the transfer fee on either mint</li>
              <li>Quote helpers return the transfer-fee-inclusive input and the transfer-fee-exclusive output</li>
              <li><code>swap</code> and <code>swap2</code> reject transfer-hook pools</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Read <code>includedTransferFeeAmountIn</code> and <code>excludedTransferFeeAmountOut</code> from swap quotes. For a Token-2022 quote mint, pass <code>quoteMint</code> and <code>currentEpoch</code>.</li>
              <li>Check <code>minimum\_amount\_out</code> against the amount the user receives after the fee, and <code>maximum\_amount\_in</code> against the amount the user pays before the fee.</li>
              <li>Rust <code>quote\_exact\_in</code>, <code>quote\_exact\_out</code>, and <code>quote\_partial\_fill</code> take <code>current\_epoch</code> plus the base and quote <code>TransferFeeConfig</code>, and return <code>SwapResultWithTransferFee</code>.</li>
              <li>Use <code>swap2WithTransferHook</code>, <code>claimPartnerTradingFee2</code>, and <code>claimCreatorTradingFee2</code> for transfer-hook pools.</li>
            </ul>
          </td>
        </tr>

        <tr>
          <td><strong>Indexers</strong></td>

          <td>
            <ul>
              <li><code>EvtCreateConfig</code> is removed</li>
              <li><code>EvtCreateConfigV2</code> is deprecated in favour of <code>EvtCreateConfig3</code></li>
              <li>Swap endpoints emit <code>EvtSwap3</code> and <code>EvtSwap3WithTransferHook</code></li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Consume <code>EvtCreateConfig3</code> for configs from <code>create\_config</code> and <code>create\_config2</code>. <code>create\_config\_with\_transfer\_hook</code> still emits only <code>EvtCreateConfigV2WithTransferHook</code>.</li>
              <li>Read <code>included\_transfer\_fee\_amount\_in</code> and <code>excluded\_transfer\_fee\_amount\_out</code> from <code>EvtSwap3</code> and <code>EvtSwap3WithTransferHook</code>. Legacy <code>EvtSwap.params.amount\_in</code> includes the transfer fee.</li>
              <li>Treat <code>PoolConfig.version</code> 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.</li>
            </ul>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  ## Program: `dynamic-bonding-curve` `0.2.2`

  Program ID (mainnet and devnet): `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN`

  [Program PR #211](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/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](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/123)

  <Tip>
    Early testing: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.13-rc.0`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.13-rc.0).<br /> Production: [`@meteora-ag/dynamic-bonding-curve-sdk@2.0.0`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/2.0.0).
  </Tip>

  ### 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 `PublicKey`s.
  * `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`.
</Update>

<Update label="dynamic-bonding-curve 0.2.1" description="Support for Stock Tokens in DBC + Deprecation of Rate Limiter and DAMM v1" rss="DBC dynamic-bonding-curve 0.2.1 adds Token Badge support for Stock Tokens, deprecates RateLimiter and DAMM v1 migration for new configs and pools, and rejects those options in createConfig, createPool, and buildCurve helpers. SDK 1.5.12.">
  <Info>
    Mainnet deployment for Release 0.2.1 is planned for September 9, 2026, at 11:00 AM UTC+8 (Wednesday).
  </Info>

  ## Release summary

  | Component | Version | PR |
  | - | - | - |
  | Program | `0.2.1` | [dynamic-bonding-curve #202](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/202) |
  | TypeScript SDK | `1.5.12` | [dynamic-bonding-curve-sdk #112](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/112) |

  ## 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

  <div style={{overflowX: 'auto', marginBottom: '1.5rem'}}>
    <table>
      <thead>
        <tr>
          <th>Integrators</th>
          <th>What Changed</th>
          <th>What To Do</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><strong>Partners</strong></td>

          <td>
            <ul>
              <li>Support for Stock Tokens in DBC via Token Badges</li>
              <li>Deprecation of Rate Limiter and DAMM v1</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>As the Rate Limiter is deprecated, you need to migrate to change your BaseFeeMode to other modes.</li>
              <li>As the DAMM v1 is deprecated, you need to migrate to change your MigrationOption to other modes.</li>
              <li>Bump your SDK version to <code>@meteora-ag/dynamic-bonding-curve-sdk\@1.5.11-rc.0</code> to start testing.</li>
            </ul>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  ## Program: `dynamic-bonding-curve` `0.2.1`

  Program ID (mainnet and devnet): `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN`

  [Program PR #202](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/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](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/112)

  <Tip>
    Early testing: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.11-rc.0`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.11-rc.0).<br /> Production: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.12`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.12).
  </Tip>

  ### 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.
</Update>

<Update label="dynamic-bonding-curve 0.2.0" description="Transfer Hook Support and Restricted Mint Authority" rss="DBC dynamic-bonding-curve 0.2.0 adds Token-2022 transfer-hook support and restricted mint authority, with transfer-hook config, pool, swap, fee-claim, event parsing, and nested poolState layout updates. SDK 1.5.8.">
  <Info>
    Mainnet deployment for Release 0.2.0 is planned for June 3, 2026, at 11:00 AM UTC+8 (Wednesday).
  </Info>

  ## Release summary

  | Component | Version | PR |
  | - | - | - |
  | Program | `0.2.0` | [dynamic-bonding-curve #193](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/193) |
  | TypeScript SDK | `1.5.8` | [dynamic-bonding-curve-sdk #103](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/103) |

  ## What We Shipped

  * Transfer Hook Support
  * Restricted Mint Authority

  ## What To Do

  <div style={{overflowX: 'auto', marginBottom: '1.5rem'}}>
    <table>
      <thead>
        <tr>
          <th>Integrators</th>
          <th>What Changed</th>
          <th>What To Do</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><strong>Swap Routers</strong></td>

          <td>
            <ul>
              <li>Token-2022 transfer-hook pool support</li>
              <li>New transfer-hook swap endpoint: <code>swap2\_with\_transfer\_hook</code></li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Use <code>swap2\_with\_transfer\_hook</code> for transfer-hook pools and pass the required <code>transfer\_hook\_accounts\_info: TransferHookAccountsInfo</code> remaining-account metadata.</li>
              <li>Keep using the original swap endpoints for non-transfer-hook pools.</li>
              <li>Update any direct pool account readers to handle the transfer-hook pool account and nested pool-state layout.</li>
            </ul>
          </td>
        </tr>

        <tr>
          <td><strong>Trading Terminals</strong></td>

          <td>
            <ul>
              <li>New transfer-hook event variants</li>
              <li>Restricted mint-authority behavior for non-transfer-hook pools</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Update event parsing for <code>EvtInitializePoolWithTransferHook</code>, <code>EvtSwap2WithTransferHook</code>, <code>EvtCurveCompleteWithTransferHook</code>, and <code>EvtCreateConfigV2WithTransferHook</code>.</li>
              <li>Display transfer-hook pools separately from non-transfer-hook pools where users need to understand additional token-transfer requirements.</li>
              <li>Do not assume creator or partner mint authority is available for non-transfer-hook pools. For those pools, <code>base\_mint</code> mint authority is always revoked at initialization.</li>
            </ul>
          </td>
        </tr>

        <tr>
          <td><strong>Partners</strong></td>

          <td>
            <ul>
              <li>New transfer-hook config and pool-creation flow</li>
              <li>Protocol-fee claim endpoint update</li>
              <li>Restricted mint-authority config options</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Bump your SDK version to at least <code>@meteora-ag/dynamic-bonding-curve-sdk\@1.5.8</code>. Use <code>1.5.9+</code> for the transfer-hook state-fetch fix.</li>
              <li>For Token-2022 transfer-hook launches, create configs with <code>create\_config\_with\_transfer\_hook</code> and initialize pools with <code>initialize\_virtual\_pool\_with\_token2022\_transfer\_hook</code>.</li>
              <li>Only use <code>CreatorUpdateAndMintAuthority</code> or <code>PartnerUpdateAndMintAuthority</code> with transfer-hook configs. <code>create\_config</code>, <code>initialize\_virtual\_pool\_with\_spl\_token</code>, and <code>initialize\_virtual\_pool\_with\_token2022</code> now reject those options.</li>
            </ul>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  ## Program: `dynamic-bonding-curve` `0.2.0`

  Program ID (mainnet and devnet): `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN`

  [Program PR #193](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/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](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/103)

  <Tip>
    Early testing: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.7-rc.0`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.7-rc.0).<br /> Production: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.8`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.8).
  </Tip>

  ### 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.
</Update>

<Update label="dynamic-bonding-curve 0.1.10" description="Migrate to DAMM v2 Inner Positions + DAMM v2 Compounding Fee" rss="DBC dynamic-bonding-curve 0.1.10 migrates DAMM v2 vesting to inner positions and adds DAMM v2 compounding fee pool support, with event parsing and bonding curve configuration updates. SDK 1.5.6.">
  <Info>
    Mainnet deployment for Release 0.1.10 is planned for March 16, 2026, at 11:00 AM UTC+8 (Monday).
  </Info>

  ## Release summary

  | Component | Version | PR |
  | - | - | - |
  | Program | `0.1.10` | [dynamic-bonding-curve #174](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/174) |
  | TypeScript SDK | `1.5.7` | [dynamic-bonding-curve-sdk #101](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/101) |

  ## What We Shipped

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

  ## What To Do

  <div style={{overflowX: 'auto', marginBottom: '1.5rem'}}>
    <table>
      <thead>
        <tr>
          <th>Integrators</th>
          <th>What Changed</th>
          <th>What To Do</th>
        </tr>
      </thead>

      <tbody>
        <tr>
          <td><strong>Trading Terminals</strong></td>

          <td>
            <ul>
              <li><code>EvtPartnerClaimPoolCreationFee</code> event parsing</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>The <code>EvtPartnerClaimPoolCreationFee</code> event now includes a fee\_receiver field. Partners parsing/indexing this event must update their deserialization.</li>
            </ul>
          </td>
        </tr>

        <tr>
          <td><strong>Partners</strong></td>

          <td>
            <ul>
              <li>Bonding Curve Configuration Updates</li>
            </ul>
          </td>

          <td>
            <ul>
              <li>Bump your SDK version to <code>@meteora-ag/dynamic-bonding-curve-sdk\@1.5.5-rc.0</code> to start testing.</li>
              <li>Optionally update your bonding curve configuration to enable compounding fee mode by passing <code>migrated\_pool\_fee.collect\_fee\_mode: 2</code> and <code>compounding\_fee\_bps: 1-10\_000</code> field in <code>ConfigParameters</code></li>
            </ul>
          </td>
        </tr>
      </tbody>
    </table>
  </div>

  ## Program: `dynamic-bonding-curve` `0.1.10`

  Program ID (mainnet and devnet): `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN`

  [Program PR #174](https://github.com/MeteoraAg/dynamic-bonding-curve/pull/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](https://github.com/MeteoraAg/dynamic-bonding-curve-sdk/pull/98)

  <Tip>
    Early testing: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.5-rc.0`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.5-rc.0).<br /> Production: [`@meteora-ag/dynamic-bonding-curve-sdk@1.5.6`](https://www.npmjs.com/package/@meteora-ag/dynamic-bonding-curve-sdk/v/1.5.6).
  </Tip>

  ### 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.
</Update>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.