All articles
Solana·June 9, 2026·6 min read

Token-2022 vs SPL Token: Which Standard Fits Your Project

Token-2022 vs SPL Token: when transfer hooks, confidential transfers, and fee extensions are worth the compatibility tax, and when they aren't.

Every Solana token you traded through Raydium or Jupiter before late 2022 was minted by the same program: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA. Token-2022 (TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) is a separate, parallel program, not an upgrade to the old one. That distinction trips up more teams than anything else in this comparison: the two programs are not interchangeable, and picking one is closer to picking a database engine than picking a compiler flag.

What SPL Token still does well

The original SPL Token program has run unmodified in production since 2020. Every wallet (Phantom, Solflare, Backpack), every DEX router, every indexer, and every block explorer parses its account layout natively. If your project is a straightforward fungible token, an LP token, or a governance token with no exotic requirements, SPL Token gets you:

  • A fixed 165-byte account layout every downstream tool already understands
  • Three years of adversarial testing and zero surprises for auditors
  • Lower compute unit cost per transfer, which matters when you're batching hundreds of transfers per block for a market maker or an airdrop
  • No dependency on extension-aware clients on the receiving end

For most memecoins and most simple utility tokens, SPL Token is still the correct default. Not because Token-2022 is unproven, but because complexity you don't need is a liability, not a feature.

What Token-2022 actually adds

Token-2022 (Token Extensions) reimplements the base program and layers optional extensions on top, configured at mint creation and baked into the account size. A few of these change actual product decisions.

Transfer hooks. A mint can point at an external program that runs on every transfer, letting you enforce allowlists, royalties, or compliance logic at the protocol level instead of trusting a frontend. This is the extension that breaks the most existing tooling, because any bot or contract that calls a raw transfer instruction without also resolving and invoking the hook program will have its transaction fail. If you're running a sniper bot against Token-2022 pairs, you need to pull the hook program ID from the mint's TransferHook extension and append it to the instruction's account list before you fire, or you'll eat silent failures during the exact block you needed to land in.

Confidential transfers. Built on ElGamal encryption and zero-knowledge proofs, this hides transfer amounts (not identities) on-chain. It's the closest thing Solana has to a privacy-preserving token, but proof generation adds real client-side latency and the tooling around it is still thinner than something like Zcash. Useful for payroll or B2B settlement rails where amount privacy matters; overkill for a public trading token.

Transfer fees, permanent delegate, non-transferable accounts, interest-bearing balances, metadata pointer, default account state. These are the extensions that actually see production use: transfer fees for automatic royalty capture, permanent delegate for compliance clawback, non-transferable for credentials and loyalty points, metadata pointer to skip a separate Metaplex account entirely.

The compatibility tax

Here's the part that actually costs teams money. A meaningful chunk of Solana infrastructure — some indexers, some older AMM integrations, older SDK versions — assumes the classic 165-byte layout or doesn't parse the TLV (type-length-value) extension data appended after it. Mint with a transfer-fee extension and a market maker that doesn't account for the fee being deducted at the protocol level will have its inventory math drift silently until someone notices the books don't balance. Wallet trackers have the same failure mode: a bot reading raw lamport deltas instead of parsing post-fee token balances will misreport every transfer on a fee-on-transfer mint.

It's also a real-time data problem, not just an SDK problem. If you're consuming account updates through Yellowstone gRPC your deserializer needs to branch on the account owner (Tokenkeg... versus Tokenz...) and, for Token-2022, walk the TLV extension list before you can trust the balance or authority fields you're streaming. Skip that branch and you'll parse garbage for every Token-2022 account and not know it.

A quick worked example

Creating a mint with a 1% transfer fee looks almost identical to a classic mint, except you compute space for the extension before allocating the account:

import {
  ExtensionType,
  createInitializeMintInstruction,
  createInitializeTransferFeeConfigInstruction,
  getMintLen,
  TOKEN_2022_PROGRAM_ID,
} from "@solana/spl-token";

const extensions = [ExtensionType.TransferFeeConfig];
const mintLen = getMintLen(extensions); // bigger than the classic 82 bytes

const tx = new Transaction().add(
  SystemProgram.createAccount({
    fromPubkey: payer.publicKey,
    newAccountPubkey: mint,
    space: mintLen,
    lamports: await connection.getMinimumBalanceForRentExemption(mintLen),
    programId: TOKEN_2022_PROGRAM_ID,
  }),
  createInitializeTransferFeeConfigInstruction(
    mint,
    payer.publicKey,   // transfer fee authority
    payer.publicKey,   // withdraw withheld authority
    100,                // 1.00% in basis points
    BigInt(5_000_000),  // max fee cap, in base units
    TOKEN_2022_PROGRAM_ID
  ),
  createInitializeMintInstruction(mint, 6, mintAuthority, freezeAuthority, TOKEN_2022_PROGRAM_ID)
);

Miss the getMintLen call and allocate 82 bytes like the old program expects, and initialization fails immediately — an honest failure. The dangerous version is a bot downstream that keeps assuming amount_sent == amount_received and quietly mispricing every fill. It's the same class of assumption that breaks naive MEV and arbitrage logic when compute costs and account layouts shift under a strategy that was tuned against classic SPL pairs; if your fill accounting doesn't validate against realistic compute budgets the way you'd check Jito bundle economics against plain priority fees, a fee-on-transfer mint will eat your margin before you notice.

Comparison table

Dimension SPL Token Token-2022
Program ID TokenkegQ... TokenzQdB...
Account layout Fixed 165 bytes Base account + variable TLV extensions
Transfer hooks No Yes
Confidential transfers No Yes (ZK proofs)
Transfer fees / royalties No, frontend-enforced only Native, protocol-enforced
Non-transferable tokens No Yes
Wallet / DEX support Universal Partial, improving
Compute cost per transfer Lower Higher, scales with extension count
Auditor familiarity Very high Growing, still newer attack surface
Bot / indexer integration risk Low Requires hook- and extension-aware code

Validator-level cost matters here too: extension-heavy Token-2022 accounts push more bytes through every block, which is part of why client implementations like Firedancer handle account processing differently than Agave under load. It's a second-order concern for most launches, but not a zero one if you're minting at scale.

Which to pick, and when

Ship SPL Token if you're launching a standard fungible asset, a memecoin, an LP token, or anything where "every wallet and every DEX already works, day one" outweighs any single extension. That's still the majority of tokens launched on Solana, and it's the lower-risk audit surface if you're time-constrained.

Reach for Token-2022 only when a specific extension is load-bearing for your product, not because it's the newer program. Royalty-dependent tokens want transfer fees. Compliance-heavy RWA or payroll tokens want permanent delegate and confidential transfers. Access-gated or credentialed tokens want transfer hooks and non-transferable accounts. If you can't name the extension you need in one sentence, you don't need Token-2022 yet, and you'll pay for the compatibility gaps regardless of how the audit turns out.

One thing that isn't optional either way: whatever standard you pick, the bots and infrastructure reading your mint need to be built for it from day one, not patched in after a transfer hook silently breaks a production flow. We build custom Solana trading infrastructure that handles both programs correctly from the start, so a token standard decision doesn't turn into an incident report three weeks after launch.

Need a bot like this built?

We design, build and run trading bots on Solana, Hyperliquid and Polymarket.

Start a project
#Solana#Token-2022#SPL Token#Smart Contracts#Solana Development