Tempo Mainnet is now live on Chainstack! Get Tempo RPC endpoint for free!    Learn more
  • Pricing
  • Docs

Solana Token-2022 utility extensions

Created Mar 19, 2026 Updated Mar 19, 2026
Solana Token-2022 utility extensions article cover image

Historically, the SPL token standard was incredibly simple. It did exactly one thing: manage a generic u64 integer. If a protocol needed anything more complex like royalties, KYC whitelists, vesting schedules, or privacy, developers had to write custom wrapper smart contracts. They had to spin up external PDAs, force users to route transactions through proprietary programs, and execute Cross-Program Invocations (CPIs) just to mutate basic state.

This fragmented liquidity, broke composability across DeFi, and multiplied smart contract attack vectors.

Solana Token-2022 flips this architecture on its head. By pushing custom logic directly into the Mint and the Token Account via Type-Length-Value (TLV) extensions, the asset itself becomes smart. The L1 runtime handles the complexity natively, allowing decentralized exchanges, lending markets, and automated market makers to interact with heavily customized tokens without needing to trust or audit a third-party wrapper contract.

But Token-2022 is not just about massive, complex upgrades like Zero-Knowledge proofs. The standard also ships with a suite of lightweight, “utility” primitives designed to solve everyday enterprise, compliance, and UX issues.

In this final installment of our Solana Token-2022 series, we are going to close out the toolkit. We will break down the smaller, highly effective extensions that every Solana developer needs in their arsenal: Permanent Delegates, Non-Transferable tokensDefault Account States, and Required Memos.

Token-2022 Permanent Delegate Extension

In the legacy SPL standard, there is a strict cryptographic boundary: Only the Token Account Owner can transfer or burn the tokens inside their wallet. The Mint Authority only has the power to create new tokens. Once those tokens land in a user’s wallet, the protocol loses all control over them. If you are building a stablecoin and need to comply with OFAC sanctions by clawing back funds from a hacked wallet, you are out of luck. If you are building an automated subscription service and need to deduct tokens every month, you have to force the user to sign a pre-approved delegation transaction which is a massive UX friction point.

Token-2022 solves this by introducing the Permanent Delegate extension.

This extension allows the token creator to designate a specific public key at the Mint level that has unrestricted, permanent transfer and burn rights over every single token account holding that asset.

Hands-on: Permanent Delegate in practice

To truly understand how powerful this is, let’s test it live on Devnet. We are going to create a token with a Permanent Delegate, mint it to a user, and then watch the delegate reach in and burn the user’s tokens without their signature.

Create Token

You enable this extension and specify the delegate address during the initial Mint creation. Once set, the permanent delegate has “God Mode” over the token supply.

spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-permanent-delegate
Explorer view of a Token-2022 mint with the Permanent Delegate extension enabled
https://solscan.io/token/33iQokS7SC7XQ8NgoayfVo3KqU19mYjpW8dHJbgHUfj2?cluster=devnet#extensions

We can see the created PermanentDelegate extension for our token.

Mint Token To Someone

Create token account for someone’s wallet and mint 100 tokens to him.

# create token account for someone
spl-token create-account <MINT_ADDRESS> --owner <SOME_WALLET> --fee-payer ~/.config/solana/id.json
# mint 100 tokens to someone's Token Account
spl-token mint <MINT_ADDRESS> 100 <SOME_WALLET_TOKEN_ACCOUNT> 

Explorer view of minting Token-2022 tokens to another wallet
https://solscan.io/tx/QNNz9XJk1ccKNTtS96mJsxtbo8766tLsPnX1GWYa5mfx6iXbn2ffBsumcXWVwoztfrWAKjZrSWCMTgSSq9WnMSw?cluster=devnet

Burning Tokens With the delegate address

Right now, someone holds 100 tokens. In legacy SPL, only this address could touch them. But because we established a Permanent Delegate on our address, we can reach directly into this wallet’s account and burn 50 tokens.

spl-token burn <SOMEONE_TOKEN_ACCOUNT> 50
Explorer view of burning tokens with the Permanent Delegate address
https://solscan.io/tx/6r2iYDVTGdbMGNnCm3jNexeN22nkSUxRXY6vMnRfPC1re7NX11X7KUxM3mhRX18kZRrc8ChLrJ6cdhXtGNrYue8?cluster=devnet

The transaction succeeds. The Token-2022 program checks the Mint, sees that We are the Permanent Delegate, bypasses Someone’s wallet ownership authority entirely, and burns the tokens.

This primitive is incredibly powerful on its own, but it unlocks a massive architectural design pattern when paired with next extension.

Token-2022 Non-Transferable Tokens Extension

Sometimes, you need a guarantee that a user cannot sell, trade, or transfer an asset once it lands in their wallet.

Historically, developers achieved this using a standard NFT mint to a user and immediately issue a Freeze instruction to lock the token account. This worked, but it was fragile. It required the issuer to maintain freeze authority, pay external protocol fees, and if they ever accidentally unfroze the account, the user could immediately dump the “identity” token on a secondary marketplace.

Solana Token-2022 completely replaces this legacy NFT use-case with the Non-Transferable extension. It makes immobility a fundamental law of the Mint itself. The L1 base layer will permanently reject any Transfer instruction involving this token.

Hands-on: Non-Transferable tokens in practice

To create a Non-Transferable token, you must apply the flag during the initial Mint creation. Once the Mint is initialized, this extension is permanently baked into the asset and cannot be disabled.

spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-non-transferable

Note: You can mint this token to your users exactly like a normal SPL token. The restriction only applies when they try to send it somewhere else

Let’s say some address holds 100 of these tokens and tries to transfer it to another wallet.

spl-token transfer 7b7FYYVpa5xgTS3PCHAU6ZBDjD1NbwZcKCqYcMmArj4n 50 L6h2ugreR3oNmKtBCpcsMPSLg3BwLR31fSPB1iU76mp

Output

CLI output showing a failed transfer for a non-transferable Token-2022 token

The Result: Hard Fail. The transaction will instantly revert at the protocol level with a Transfer is disabled for this mint custom program error.

Architecture 1: Native L1 Soulbound Badges

When developers hear “Non-Transferable,” they almost exclusively think of 1-of-1 NFTs. For example, issuing an on-chain graduation certificate for a developer bootcamp or a KYC verification badge.

By combining the Metadata extension (which we covered here) with 0 Decimals and the Non-Transferable extension, you can mint native, beautifully rendered L1 “Soulbound Badges” without ever touching a third-party standard.

Architecture 2: On-Chain Consumables

But the real magic happens when you apply the Non-Transferable extension to a Fungible token (for example with 9 decimals) and combine it with the Permanent Delegate we just built previously.

This creates the perfect architecture for On-Chain Consumables or Prepaid Credits. Imagine an RPC node provider, a decentralized AI compute network, or an in-game economy. A user buys 1,000 API credits.

  1. Because the tokens are Non-Transferable, you guarantee the user cannot create an AMM liquidity pool to dump their unused credits and crash your internal economy. They can only hold them.
  2. Because your protocol backend holds the Permanent Delegate key, your server can automatically execute a Burn instruction to destroy tokens directly from the user’s wallet every time they make an API call.

The user gets transparent, on-chain accounting of their prepaid credits, and the protocol gets absolute economic security without sacrificing UX.

Example

spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --enable-permanent-delegate --enable-non-transferable
Explorer view of a Token-2022 mint with permanent delegate and non-transferable extensions
https://solscan.io/token/6k4XgpoJx4WuvPTpfpn4VrHrmtHMdqYSsDY2WZA3QZrf?cluster=devnet#extensions

What about manual burning?

A common developer assumption is that “non-transferable” means the token is permanently stuck in the user’s wallet forever. This is a massive UX risk what if a user receives a malicious or spam soulbound token and wants to clean up their wallet?

Non-transferable does not mean non-burnable. Even though the base layer blocks the Transfer instruction, the Solana Token-2022 program still allows the account owner to execute a standard Burn instruction. Users always retain the ultimate authority to destroy assets in their own wallets to prevent permanent spam.

Token-2022 Default Account State Extension

If you are building a regulated protocol like an enterprise stablecoin, a real estate RWA (Real World Asset), or a strict KYC ecosystem, you need absolute control over who can hold and move your token.

By configuring this extension at the Mint level, you can force the L1 runtime to automatically initialize every single new Token Account in a Frozen state. Users can create their accounts to receive the asset, but they cannot send or receive tokens until your backend server verifies their KYC status and explicitly unfreezes their specific account.

Hands-on: Default account state in practice

To use this, you must apply the --default-account-state frozen flag during Mint creation. Because you will eventually need to unfreeze compliant accounts, you must also stack the --enable-freeze flag so your protocol retains the Freeze Authority.

# Create a compliance-gated Mint
spl-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb create-token --default-account-state frozen --enable-freeze

Output

Explorer view of a Token-2022 mint with frozen default account state
https://solscan.io/token/CgAAhZTKoeaAPBtXpJ5cfe3XnmgGGVH78Lq8JhFV627F?cluster=devnet#extensions

If someone creates an account for this token, it is frozen the millisecond it is initialized. Any incoming or outgoing transfers will revert until your protocol explicitly thaws their account.

Lets say that now someone creates his own token account and did not submit all the required data to our backend server, and our automated system accidentally tries to mint to this token account

spl-token mint <MINT_ADDRESS> 100 <SOME_TOKEN_ACCOUNT>

Output

CLI output showing a failed mint to a frozen Token-2022 account

It will fail with “account is frozen“ error. The transaction reverts perfectly at the runtime level. The Token-2022 program recognizes that this account is completely locked. It cannot receive incoming mints or transfers, and it cannot send tokens out.

Now lets say that this user submitted all the required data. Our backend verifies the identity and executes a Thaw instruction to unlock her specific Token Account.

spl-token thaw <SOME_TOKEN_ACCOUNT>

Output

https://solscan.io/tx/WpW47gmduBEUkHK78To57NLds7vMzmtCHZqRAFU1KuUYzKAN4SZXkH9bBcqqeXWPU4vYh5w8b2oHjQypRjnWGkN?cluster=devnet

Now that this user is legally verified and the account is thawed, Our backend tries the exact same mint command again.

spl-token mint <MINT_ADDRESS> 100 <SOME_TOKEN_ACCOUNT>

Output

Explorer view of a thaw transaction for a previously frozen Token-2022 account

The Result: Success. This user receives the 100 tokens, fully compliant with the protocol’s L1 rules.

Token-2022 Memo Transfer Extension

If you have ever deposited tokens into a centralized exchange (CEX – centralized exchange), you know the panic of forgetting the “Deposit Memo.”

Because exchanges use massive, shared omnibus wallets to collect user deposits, they rely on attached text memos to map an incoming L1 transfer to a specific user’s database ID. The Required Memo on Transfer extension solves this at the protocol level.

Unlike the previous extensions we discussed, this is an Account Extension, not a Mint extension. It is applied by the owner of the Token Account, not the creator of the token.

Hands-on: Memo transfer in practice

Let’s say your protocol’s treasury wallet (Alice) wants to ensure that no one can blindly dump tokens into her account without explaining what the transfer is for. Alice simply enables the extension on her specific Token Account.

# Alice enforces memos on her own Token Account
spl-token enable-required-transfer-memos <ALICE_TOKEN_ACCOUNT_ADDRESS>

Output On Explorer

Explorer view of a Token-2022 account with required transfer memos enabled
https://solscan.io/account/EpBnH3MaJsSRVi7WBGHw9mXCtYTvwWY1NL789fBQXaKK?cluster=devnet

Now we see that the Memo is Required, if someone tries to run a standard transfer command to Alice’s account:

spl-token transfer <MINT_ADDRESS> 50 <ALICE_TOKEN_ACCOUNT_ADDRESS>

Output

CLI output showing a failed transfer without a required memo

The Result: Hard Fail. The transaction reverts at the runtime level because the destination account requires a memo, and none was provided.

To successfully send tokens to Alice, the sender is now mathematically forced to attach a memo string to the transaction instruction:

# The sender must explicitly attach the memo for the transaction to succeed
spl-token transfer <MINT_ADDRESS> 50 <ALICE_TOKEN_ACCOUNT_ADDRESS> --with-memo "Invoice payment for Q3 RPC node hosting"

Output

Explorer view of a successful Token-2022 transfer with a required memo
https://solscan.io/tx/3VGqCo88izrsDm1mYQFTbvi4c5V5CSgSgAhQ5YnDD4RysVBF3yXiFp1qm7kax8Fs46hKhL6LbrMMRAZtyLmbXNP8?cluster=devnet

Summary

Over the course of this series, we have covered Metadata, Transfer Hooks, Interest-Bearing Mints, Confidential Transfers, and finally, the core Utility Primitives.

If there is one major takeaway for developers, it is that the this blog’s architecture is no longer just a theory it is the standard. Solana Token-2022 shifts complex, vulnerable logic out of custom smart contracts and pushes it natively into the L1 asset itself.

By stacking these extensions, you can build a stablecoin that natively yields interest, shields transfer amounts with Zero-Knowledge proofs, automatically freezes non-compliant accounts, and blocks unknown deposits, all without writing or deploying a single line of Rust.

The standard is here. It is time to start building.

Reliable Solana RPC infrastructure

Getting started with Solana on Chainstack is fast and straightforward. Developers can deploy a reliable Solana node within seconds through an intuitive Console — no complex setup or hardware management required. 

Chainstack provides low-latency Solana RPC access and real-time gRPC data streaming via Yellowstone Geyser Plugin, ensuring seamless connectivity for building, testing, and scaling DeFi, analytics, and trading applications. With Solana low-latency endpoints powered by global infrastructure, you can achieve lightning-fast response times and consistent performance across regions. 

Start for free, connect your app to a reliable Solana RPC endpoint, and experience how easy it is to build and scale on Solana with Chainstack – one of the best RPC providers.

FAQ

What are Solana Token-2022 utility extensions?

Token-2022 utility extensions are built-in token primitives that add practical controls to SPL tokens, such as permanent delegation, non-transferability, default frozen accounts, and required transfer memos.

What is the Permanent Delegate extension in Token-2022?

The Permanent Delegate extension lets a designated address permanently transfer or burn tokens from any account holding that mint. It is useful for compliance workflows, clawbacks, and protocol-controlled burn mechanics.

What does the Default Account State extension do?

The Default Account State extension lets a mint create new token accounts in a predefined state, such as frozen. This is useful for compliance-gated assets where accounts must be approved before they can receive or send tokens.

How does the Memo Transfer extension work?

The Memo Transfer extension requires incoming transfers to include a memo. It is applied at the token account level and helps protocols or treasury accounts enforce transfer metadata at the runtime level.

When should developers use Token-2022 utility extensions?

Developers should use them when they need built-in compliance, account controls, or operational safeguards without building custom wrapper contracts. They are especially useful for enterprise assets, gated access, treasury controls, and regulated token flows.

Why do Token-2022 utility extensions matter for Solana developers?

They move common token logic into the base token standard, which improves composability, reduces custom smart contract risk, and makes advanced token behavior easier to integrate across wallets, DeFi apps, and infrastructure.

Learn more about Solana architecture from our articles

SHARE THIS ARTICLE

Andrey Obruchkov

Senior Software Engineer and blockchain specialist with hands-on experience building across EVM, Solana, Bitcoin, Cosmos, Aptos, and Sui ecosystems from smart contracts and DeFi infrastructure to cross-chain integrations and developer tooling.

Customer Stories

LinkPool

Maintaining unparalleled performance and up time under heavy network strain in securing the Chainlink oracle network.

Blank

Achieving operational excellence with infrastructure made for full privacy functionality.

Kenshi Oracle Network

Contributing towards a swifter Web3 for all with secure, efficient, and robust oracle infrastructure.