Confidential Transfer

What are Confidential Transfers?

Confidential transfers enable you to transfer tokens between token accounts without revealing the transfer amount. This is useful for privacy-preserving transactions. Only the transfer amounts and token balances are private. The token account addresses remain public.

How does it work?

The Confidential Transfer extension adds instructions to the Token Extension program that allows you to transfer tokens between accounts without revealing the transfer amount.

Confidential Transfer Basic Overview

The basic flow of confidential token transfers is as follows:

  1. Create a mint account with the confidential transfer extension.
  2. Create token accounts with confidential transfer extension for the sender and recipient.
  3. Mint tokens to the sender account.
  4. Deposit sender's public balance to confidential pending balance.
  5. Apply sender's pending balance to confidential available balance.
  6. Confidentially transfer tokens from sender token account to recipient token account.
  7. Apply recipient's pending balance to confidential available balance.
  8. Withdraw recipient's confidential available balance to public balance.

For more details on the steps in the confidential transfer flow, see the corresponding pages:

The diagram below shows a detailed sequence of the basic flow for confidential token transfers:

Confidential Transfer Detailed Overview

Confidential Transfer Instructions

The full list of Confidential Transfer extension instructions are as follows:

InstructionDescription
InitializeMintSets up mint account for confidential transfers. This instruction must be included in the same transaction as TokenInstruction::InitializeMint instruction.
UpdateMintUpdates confidential transfer settings for a mint.
ConfigureAccountSets up a token account for confidential transfers.
ApproveAccountApproves a token account for confidential transfers if the mint requires approval for new token accounts.
EmptyAccountEmpties the pending and available confidential balances to allow closing a token account.
DepositConverts public token balance into pending confidential balance.
WithdrawConverts available confidential balance back to public balance.
TransferTransfers tokens between token accounts confidentially.
ApplyPendingBalanceConverts pending balance into available balance after deposits or transfers.
EnableConfidentialCreditsAllows a token account to receive confidential token transfers.
DisableConfidentialCreditsBlocks incoming confidential transfers while still allowing public transfers.
EnableNonConfidentialCreditsAllows a token account to receive public token transfers.
DisableNonConfidentialCreditsBlocks regular transfers to make account receive only confidential transfers.
TransferWithFeeTransfers tokens between token accounts confidentially with a fee.
ConfigureAccountWithRegistryAlternative way to configure token accounts for confidential transfers using an ElGamalRegistry account instead of VerifyPubkeyValidity proof.

Is this page helpful?

Table of Contents

Edit Page
© 2026 Solana Foundation. All rights reserved.