ATA vs. ETA
Solana uses AssociatedTokenAccounts (ATAs) to hold SPL and Token-2022 tokens. These are fully public; anyone can query your balance. Umbra introduces EncryptedTokenAccounts (ETAs) — on-chain PDA accounts that hold your token balance in encrypted form. ATA (standard public account)- Balance visible on-chain.
- Supports standard SPL transfers.
- No registration required.
- Works with any SPL or Token-2022 token.
- Balance hidden on-chain.
- Use Umbra deposit / withdraw / convert / burn instead of standard SPL transfers.
- One-time user registration required.
- Works with any supported mint.
Depositing: ATA → ETA
When you call the depositorgetATAIntoETADirectDepositorFunction,
your tokens move from your ATA into the on-chain pool custody account. The
program records the encrypted balance in the ETA PDA for your (wallet, mint) pair.
Withdrawing: ETA → ATA
getETAIntoATAWithdrawerFunction reverses the deposit. Arcium MPC verifies that your encrypted balance is sufficient and authorises the transfer from the pool custody account back to your ATA.
The Two Encryption Modes
MXE-Only
In MXE-only mode, your balance is encrypted under the Arcium MXE (Multi-party Exchange) public key. Only the Arcium network can decrypt it.- Withdrawals require Arcium to perform the decryption computation.
- You cannot query your own balance client-side without Arcium.
- This is the default mode for users who have not registered an X25519 key.
Shared Mode
In Shared mode, your balance is encrypted under two keys simultaneously: the Arcium MXE key and your personal X25519 public key.- You can decrypt and read your own balance locally, without a network call.
- Withdrawals still use Arcium’s MPC for the on-chain operation.
- Available after completing the X25519 key registration sub-step (part of the standard
register({ confidential: true })flow).
If you register with
confidential: true (the default), your deposits will automatically use Shared mode. This is strongly recommended — it lets you call the encrypted-balance querier locally instead of round-tripping through Arcium.Account Lifecycle
An ETA is created on first deposit and exists for the lifetime of the(wallet, mint) pair. Subsequent deposits update the encrypted balance in place.
Nonces and Replay Protection
Each ETA has a nonce — a monotonically increasing counter used to prevent replay attacks. The nonce is derived from the account’sgenerationIndex field combined with on-chain entropy. You don’t manage nonces directly; the SDK handles them.
Viewing Your Balance
If you are registered in Shared mode, you can query your current encrypted balance:Protocol Fees
Deposits and withdrawals subtract a small protocol fee from your balance. The fee has two components:- Base fee — a fixed amount in the token’s native units.
- Commission — a percentage of the amount in basis points (current rate: 35 bps with a 16,384 divisor — see Pricing).
Umbra Confidential SPL Token
The Umbra Confidential SPL token adds a loyalty/lottery-point tracking layer to everyEncryptedTokenAccount. It is live on-chain and in active SDK integration.
What changes in the ETA state
EachEncryptedTokenAccount now carries two additional Rescue-cipher ciphertext fields alongside the encrypted balance:
points_short_epoch— encrypted point accumulator for the current short epochpoints_long_epoch— encrypted point accumulator for the current long epoch
is_points_initialised indicates whether these fields contain valid encrypted-zero ciphertexts (true) or just zero-byte placeholders (false — pre-migration accounts).
How points accumulate
Every time a Stealth Pool Note is burned into an ETA, the Arcium MPC computes a lottery-ticket delta and adds it to the ETA’s running totals. The relayer includes this delta in the burn-batch API response as arescue_encrypted_lottery_ticket_delta field on each batch. The BurnBatchResult SDK type does not yet expose this field — it is currently accessible only at the raw relayer API layer.
Account migration
ETAs deployed before the Umbra Confidential SPL token feature have zero-byte placeholders for the two new fields. To enable points accrual, each such account must go through a two-step migration:migrate_for_points— a pure on-chain account realloc (no MPC). Expands the account from the old layout to the new size and shifts existing data forward.initialise_points_for_network_balance_v15orinitialise_points_for_shared_balance_v15— an Arcium MPC instruction that overwrites the placeholder bytes with valid encrypted-zero ciphertexts and setsis_points_initialised = true.
SDK support status
| Feature | Status |
|---|---|
| On-chain ETA points fields | Live |
| On-chain migration + initialisation instructions | Live |
rescue_encrypted_lottery_ticket_delta in relayer API response | Live |
BurnBatchResult.lotteryTicketDelta SDK field | Planned |
| SDK migration helper factories | Planned |
| SDK points-balance query | Planned |