Skip to content

Token programs and extensions

Compatibility is a policy for both mints, not a consequence of being an SPL token.

Design. Validate both mint accounts and their owning token programs. A token launched by the same platform is not automatically compatible or liquid. Check the current implementation before enabling Token-2022 extensions.

SOL is represented by a token account

The architecture uses WSOL in the core. Wrapping and unwrapping native SOL belong to a client or router flow. No native-lamport swap entry point is implied. See Solana's Sync Native guide.

Separate reward tokens from pool assets

Pool settlement currently accepts classic SPL Token accounts. An external hook may separately declare Token-2022 state and program access for a reward mint it controls. The RewardCredits example uses that distinct CPI boundary; its mint is not an additional AMM reserve or evidence that Token-2022 swaps, LP deposits, or fee claims are supported. The core's protected settlement accounts cannot be supplied as reward extras.

Issuer freeze authority

Classic SPL mints may retain an issuer freeze authority. Pool creation does not require the issuer to revoke it and does not alter the mint. The SDK and Metis adapter use the same eligibility policy. A freeze authority on the mint is separate from a frozen token account: SPL Token still rejects transfers involving frozen source or destination accounts. A failed instruction rolls back the transaction's token movements and grapl accounting; network fees remain payable.

An issuer can freeze a pool vault as well as a user's token account. grapl cannot bypass that decision. Metis rejects a refreshed snapshot containing a frozen vault; a freeze after quotation can still cause execution to fail.

USDC, USDG and WSOL

A read-only mainnet snapshot at slot 456394876 recorded these profiles:

AssetMint programCurrent core status
USDCClassic SPL Token, six decimals, issuer freeze authorityUnchanged official mint profile tested locally through pool creation, liquidity, swap and fees with WSOL
WSOLClassic SPL native mint, nine decimalsReal local wrapping, backing lamports and token conservation verified; wrapping remains explicit
USDGToken-2022, six decimals, issuer-controlled extensionsUnsupported by the classic CLMM/SDK; the separate experimental settlement passed local replay with its observed extension profile

USDG's observed mint includes a permanent delegate, mint close authority, zero transfer fees, a disabled transfer hook, confidential transfer configuration and metadata. Removing the freeze-authority check alone does not support this profile. Extensions must be validated at execution, since their authorities may change them. This does not enable confidential settlement or modify the original tokens.

Sources: Circle USDC, Paxos USDG, and Solana payment mint addresses.

Extension checklist

CapabilityRequired integration work
Transfer feesDistinguish gross debit, received input, net output, and withheld balances
Transfer hooksResolve extra accounts for both directions and evaluate CPI composition
Frozen or default-frozen accountsDefine operational eligibility and explicit failure behavior
Confidential balancesDefine a supported accounting path before acceptance
Other or unknown extensionsReject unless a validated policy allows them

This is a requirements table, not a supported-extension list. Extension support must be tested for swaps, liquidity, fee collection, claims, and graduation, not only pool creation.

Transfer hooks are mint policy

Token-2022 calls the mint's hook through its transfer interface. That callback observes a transfer context, not a grapl swap lifecycle context. The token program restricts the privileges of transfer accounts passed into the hook; do not expect the user's signer to propagate unchanged. Transfer Hook guide.

Pool and token hooks may coexist only when their required accounts, invocation graph, and budgets are supported. Neither hook may silently bypass the other's policy.

Balances must be spendable

Do not count withheld transfer fees as usable reserves. A quote must account for supported transfer costs at both ends. The amount credited to a beneficiary and the amount arriving in their wallet can differ when a mint charges transfer fees; document that distinction explicitly.