How to deploy a Solana Token-2022 token with transfer fees
June 22, 2026 · 8 min read
Token-2022's TransferFeeConfig extension lets you collect a percentage fee on every token transfer, automatically — without any off-chain infrastructure, webhooks, or centralised fee collection. The fee is enforced by the Solana runtime itself.
This guide explains exactly how transfer fees work under the hood, what the parameters mean, and how to deploy a transfer-fee token using Smeltr in under five minutes.
What is Token-2022?
Token-2022 (program address: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb) is Solana's next-generation token standard. Unlike the original SPL Token program, Token-2022 supports optional extensions that can be configured at mint creation. Transfer fees are one of those extensions.
Extensions are permanent. Once a mint is created with TransferFeeConfig enabled, you can't remove it — though you can update the fee rate and maximum if you hold the transferFeeConfigAuthority.
How transfer fees actually work
This is the part most people get wrong, so read carefully.
When a transfer occurs, the fee is withheld in the recipient's token account — it does not go directly to your wallet. The recipient holds slightly less than what was transferred, and the difference accumulates as a withheld amount in their account data.
To collect fees, you need to do two things:
- Harvest: Call
harvestWithheldTokensToMintto sweep the withheld amounts from all recipient accounts into the mint account's withheld pool. - Withdraw: Call
withdrawWithheldTokensFromMintto move the tokens from the mint's withheld pool to your designated fee collection wallet.
Both steps require the withdrawWithheldAuthority to sign. This two-step pattern is intentional — it allows you to batch-harvest fees from thousands of accounts in a single sweep rather than tracking individual transfers.
The parameters
| Parameter | What it does |
|---|---|
| transferFeeBasisPoints | Fee rate. 100 = 1%. Max 10,000 (100%). Start around 25–100 bps for most use cases. |
| maximumFee | Absolute cap in token base units. Prevents outsized fees on large transfers. Set this thoughtfully — a 10,000 SOL transfer at 1% without a cap is 100 SOL in fees. |
| transferFeeConfigAuthority | Can update the fee rate and maximum. Use your deployer wallet or a multisig. |
| withdrawWithheldAuthority | Can harvest fees. Typically the same as config authority, but can be separate for operational security. |
What you cannot do with transfer fees
A few gotchas worth knowing:
- You cannot combine Transfer Fee with Non-Transferable. A non-transferable token can never be transferred, so the fee can never be collected. Smeltr surfaces this as a warning.
- You cannot remove the TransferFeeConfig extension after deployment — only update the rate and cap.
- The fee is charged in the token's own denomination, not in SOL.
- Fees are not automatically sent to you — you must actively harvest them.
Deploy a transfer-fee token with Smeltr
Smeltr handles the TransferFeeConfig extension as one of its core modules. You don't need to write any transaction code — the platform constructs the correctly ordered instruction set and your wallet signs it.
- Go to smeltr.org/deploy and connect your wallet.
- In the Module Selection section, toggle on Transfer Fee.
- Enter your basis points (e.g.,
50for 0.5%), your maximum fee, and the two authority addresses (default: your connected wallet). - Optionally fill in the Metadata section with a name, symbol, and image.
- Review the deployment plan — Smeltr shows you the estimated rent and any compatibility warnings.
- Sign Transaction 1 (mint creation) and Transaction 2 (metadata attachment).
Your token is live on Solana. The transfer fee is enforced by the runtime — no ongoing action required until you want to harvest.