Account Model
Transfer-hook launches use separate account discriminators while keeping the same core config and pool fields.
The TypeScript SDK’s state service fetches both account families.
client.state.getPoolConfig, getPoolConfigs, getPool, and pool list helpers return normalized config and pool shapes for both standard and transfer-hook accounts.
Launch Rules
Trading
Transfer-hook pools must use the transfer-hook swap path.swap2_with_transfer_hook supports the same swap modes as swap2: exact in, partial fill, and exact out. It also accepts TransferHookAccountsInfo, which describes how the remaining accounts are sliced for the transfer-hook CPI.
If a transfer-hook pool is sent through a standard swap instruction, the program returns
PoolTypeMismatch. If transfer-hook remaining accounts are missing, malformed, duplicated, or use the wrong slice type, the transfer fails before token movement.
Fee Claims
Transfer-hook pools also use transfer-hook-aware trading fee claim paths.
For standard pools, use
claim_trading_fee / claim_creator_trading_fee, or the SDK’s claimPartnerTradingFee, claimPartnerTradingFeeToReceiver, claimCreatorTradingFee, and claimCreatorTradingFeeToReceiver methods.
Completion And Migration
Transfer hooks are active only while the pool is trading on the bonding curve. When a transfer-hook pool reaches the configured migration quote threshold, DBC:- Marks the curve complete.
- Moves the pool to
PostBondingCurvewhen locked vesting is configured, orLockedVestingotherwise. - Revokes the transfer-hook program id and transfer-hook authority from the base mint.
- Emits
EvtCurveCompleteWithTransferHook.
Events
Indexers should handle the transfer-hook-specific event variants.
See DBC Program Events for the full event table.

