Umbra Privacy LogoUmbra Privacy
Transaction Lifecycle

Burning UTXOs to Public Balance

Learn how to withdraw funds from Umbra's Unified Mixer Pool to a public Associated Token Account (ATA) after the mixing delay period completes.

Burning a UTXO to a public balance withdraws anonymous funds from the Unified Mixer Pool into a standard Associated Token Account (ATA). The withdrawal amount becomes visible on-chain, but the source of the funds remains anonymous.


Overview

When you burn a UTXO to an ATA, you're exiting the anonymous mixer pool into the public domain. The critical privacy property is that no observer can link this withdrawal to any specific deposit.

Privacy Characteristics

AspectVisibility
Withdrawal AmountVisible (public ATA)
Recipient AddressVisible (destination address)
Source of FundsAnonymous (could be any UTXO in pool)
Link to DepositImpossible to determine

Prerequisites

Before you can burn a UTXO, several conditions must be met:

RequirementDescription
Unlocking AuthorityYou must know the preimages of the UTXO's unlocking address
Mixing Delay PassedSufficient time since deposit
UTXO Not SpentNullifier not already in the nullifier set
Destination MatchBurning to the destination address set at deposit time

Destination Address Constraint

Important: The destination address is fixed at deposit time and cannot be changed. When burning, funds go to the destination address that was specified when the UTXO was created.


The Burn Process

Step 1: Construct the Zero-Knowledge Proof

To burn a UTXO, you must generate a ZK proof demonstrating:

ClaimWhat You Prove
MembershipThe UTXO commitment exists in the Merkle tree
OwnershipYou know all preimages of the unlocking address (User Commitment)
Nullifier CorrectnessThe nullifier is correctly derived from UTXO and Spending Key
Destination MatchThe burn outputs to the correct destination address

Step 2: Submit Burn Transaction

Step 3: On-Chain Verification

The Umbra program verifies:

  1. Proof validity - The ZK proof is mathematically correct
  2. Merkle root - The claimed root matches a valid on-chain root
  3. Nullifier uniqueness - The nullifier hasn't been used before
  4. Destination correctness - The destination matches what's in the UTXO

Step 4: Fund Release

Upon successful verification:

  1. Nullifier is added to the nullifier set (preventing double-spend)
  2. Tokens are transferred from the pool to the destination ATA
  3. The UTXO is effectively "spent" (though the commitment remains in the tree)

What the Proof Reveals vs. Hides

Revealed (Public)

InformationWhy Revealed
Withdrawal AmountRequired to credit the ATA
Destination AddressRequired to route funds
NullifierRequired for double-spend prevention
Merkle RootRequired to verify membership

Hidden (Private)

InformationWhy Hidden
Which UTXOCore anonymity guarantee
When DepositedBreaks timing correlation
Who DepositedBreaks sender-receiver link
Your KeysSecurity requirement

Anonymity Analysis

The Anonymity Set

When you burn a UTXO, the anonymity set is all UTXOs in the pool. An observer sees:

  • Funds arrived at destination ATA
  • The amount
  • The transaction time

But they cannot determine which of potentially millions of UTXOs was burned.

Factors Affecting Anonymity

FactorImpact on Privacy
Pool SizeLarger pool = more anonymity
Time in PoolLonger wait = more deposits accumulated
Amount UniquenessCommon amounts = harder to correlate
TimingRandom withdrawal times = harder to correlate

Burning on Behalf of Others

If you used ephemeral keys when creating a UTXO for a non-registered user, you (the sender) will burn the UTXO on their behalf:

AspectDetails
Who BurnsYou (the sender)
Who ReceivesRecipient (at destination address)
Recipient's ActionNone required-funds appear in their ATA
Privacy for RecipientThey receive anonymous funds

Technical Details

Instruction: BurnToATA

ParameterDescription
proofZero-knowledge proof of UTXO ownership
nullifierDerived nullifier for double-spend prevention
merkle_rootThe Merkle root being proven against
amountWithdrawal amount
destinationDestination ATA address

On-Chain Effects

ChangeDescription
Nullifier SetNullifier added (prevents re-spend)
Pool BalanceDecremented by withdrawal amount
Destination ATACredited with withdrawal amount

Nullifier Derivation

The nullifier is derived deterministically from UTXO data and your Shielded Spending Key:

The nullifier is computed using the Poseidon PRF with the Shielded Spending Key, UTXO commitment, and randomness as inputs.

This ensures:

  • Same UTXO always produces the same nullifier
  • Cannot compute nullifier without the Spending Key
  • Reveals nothing about the UTXO or keys

Error Conditions

ErrorCauseResolution
Invalid ProofProof verification failedCheck proof generation inputs
Nullifier Already UsedUTXO was already spentUTXO is gone-cannot spend again
Invalid Merkle RootRoot doesn't match on-chain stateUse current root
Mixing Delay Not MetBurned too soon after depositWait longer
Destination MismatchTrying to burn to wrong addressMust use original destination

Privacy Best Practices

Withdrawal Timing

PracticeRationale
Wait beyond minimumLarger anonymity set
Random delaysAvoid timing patterns
Avoid immediate withdraw after depositEven after delay, avoid predictability

Amount Considerations

PracticeRationale
Use common amountsHarder to correlate with specific deposits
Split large withdrawalsMultiple smaller withdrawals over time
Avoid exact deposit amountsDon't withdraw exactly what you deposited

Destination Selection

PracticeRationale
Fresh addressesNo prior transaction history to correlate
Intermediate walletsAdd another layer before final destination

Summary

AspectDetails
SourceUnified Mixer Pool (UTXO)
DestinationAssociated Token Account (ATA)
Amount VisibilityVisible on-chain
Source AnonymityHidden-cannot link to any deposit
Proof RequiredZK proof of UTXO ownership
NullifierAdded to set, prevents double-spend
Destination ConstraintFixed at deposit time
Best ForWithdrawing to public accounts with anonymity