Skip to main content
DLMM Pro pools accept SPL Token mints and Token 2022 mints. Most Token 2022 mints work without review; mints with extensions that change how transfers behave need a token badge first.

Mints That Work Without Review

Pool mints can keep a freeze authority. Reward mints set up by a pool creator cannot, unless they have a badge (see Liquidity Mining). Creating a pool or a reward slot with a mint that needs a badge fails with UnsupportedMint if no badge is passed.

How Each Extension Is Treated

When you pass a badge, the program checks only that it is for that mint, and then accepts the mint without looking at its extensions or its freeze authority. Passing a badge for a mint that did not need one is fine. SOL (So11111111111111111111111111111111111111112) and USDC (EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v) skip the extension and freeze authority checks.

Badge Rules by Path

An OnlyY pool adds one rule to every path: token Y must be SOL, USDC or have a badge for that exact mint, or creation fails with InvalidTokenBadge.

Token Badges

A token badge is an account in Meteora’s access registry program (regUFehW9oycnaV2auYyfqyYjKG1W1uLNT7rtUeemQr), derived from the seeds "token_badge" and the mint. Meteora creates badges after reviewing a token. Pass the badge account when creating a pool or reward slot with that mint; a badge for a different mint fails with InvalidTokenBadge. To request a badge, complete the Token 2022 Whitelist Request Form with the mint address, the extensions you need and that the pool is on DLMM Pro, then open a ticket in the Meteora Discord.
Do not include your launch date or time in the form or the ticket. Launch timing is not part of the review.

Fee Token Rule

A pool with the OnlyY collect fee mode earns every fee in token Y, so token Y must be SOL, USDC, or a mint with a token badge. This applies even to dynamic configs that skip the other mint checks.

Transfer Fees

When a mint charges a transfer fee, the amount that leaves a wallet and the amount that arrives differ. DLMM Pro instructions are consistent about which side each amount is on:
  • Caps on what you pay (deposit maximums, the limit order max_amount, the reward funding max_amount) include the transfer fee. Per-tick order amounts are what the pool receives.
  • Minimums on what you receive (swap output, withdrawals, claims) are measured after the transfer fee.
Swap quotes from the SDK and the Rust crate account for the transfer fee on both the input and the output. The program reads the mint’s fee for the current epoch. Token 2022 mints record an older and a newer fee, and the newer one applies from the epoch it names. A fee is rounded up and capped at the mint’s maximum fee. To work out what a sender must send for the pool to receive an amount, the program inverts the fee, and the SDK’s calculateTransferFeeIncludedAmount and calculateTransferFeeExcludedAmount do the same. Examples with a mint that charges 1% (100 bps): The pool pays the full amount out of its reserve in every payout, so fees on swap output, host fees, partner fee claims, maker payouts and reward claims all come off the receiver’s side. LP liquidity and fee accounting always use the amount the pool received, never the amount sent.

Transfer Hooks

For a mint with a badged transfer hook, every transfer runs the hook program, which needs extra accounts. These go first in the instruction’s remaining accounts, ahead of any tick arrays, as one slice per token role (token X, token Y, referral, reward). Pass a slice only for a mint that has a hook program. See Remaining Accounts. The TypeScript SDK resolves them for you when you leave them out. It resolves them as if the transfer amount were zero, so a hook whose accounts depend on the amount needs them passed explicitly. The remaining accounts start with the hook account slices, in the order given by remaining_accounts_info, followed by tick arrays. Each slice has an account type and a length of up to 255. The types are token X, token Y, referral and reward, and each can appear once. The type names the token, not the direction, so in a swap that sells X the input hook is the token X slice. The referral slice is for the token the host fee is paid in. Which types an instruction accepts: A slice type the instruction does not accept fails with InvalidRemainingAccountSlice. Fewer accounts than the slice lengths add up to fails with InsufficientRemainingAccounts. A repeated type fails with DuplicatedRemainingAccountTypes. A mint with a hook program and no slice fails with MissingRemainingAccountForTransferHook, and a slice for a mint without a hook program fails with NoTransferHookProgram. Each slice holds everything a Token 2022 transfer of that mint needs after its source, mint, destination and authority: the extra accounts listed in the hook’s validation account, the hook program and the validation account. The SDK’s getExtraAccountMetasForTransferHook returns that list. The program adds the source, mint, destination and authority of the transfer itself. A swap with a referral that has a hook on the fee token fails if the referral slice is wrong, and you can leave the referral out to avoid it.

Memos

When the program sends tokens to an account that requires memos on incoming transfers, it adds the memo itself. Swaps, withdrawals, fee and reward claims, limit order cancels and partner fee claims all do this. The memo is added only when the destination token account is a Token 2022 account with required incoming memos switched on. It is added before the transfer and comes from the memo program, which payout instructions take as an account. Every payout to a user, referral or partner can carry one: the swap output, the host fee, withdrawals, fee claims, reward claims, ineligible reward withdrawals, cancels and partner fee claims. The protocol fee claim adds none. Deposits and funding come from you and carry none.

Position and Order NFTs

Positions and limit orders are Token 2022 NFTs regardless of the pool’s mints. The NFT lives in its owner’s associated token account under the Token 2022 program. The NFT mint has 0 decimals and a supply of 1. It carries the MetadataPointer, TokenMetadata and MintCloseAuthority extensions. The token metadata name is Meteora Pool: followed by the pool address, and the symbol is MP for positions and ML for limit orders. The pool authority holds the mint authority and the close authority, so the program can close the mint when the position or order closes. The pool account is the freeze authority, which makes every NFT of a pool easy to find. The NFT can be transferred or delegated like any token, and wallets need Token 2022 support to show it. The payer covers the mint and token account rent, and closing the position or order refunds it to the rent receiver.

Pool Creation and Activation

Where badges are passed when creating a pool.

TypeScript SDK Reference

Transfer fee helpers and transfer hook resolution.