How it works

The account

What a balance actually is here - notes, not a number in a database - and the one key that reads and spends them.

There is no account balance stored anywhere in this product. What exists is a set of notes inside the STRK20 pool, each encrypted, each decryptable only by the key that owns it. The number on your screen is the result of decrypting your own notes locally and adding them up.

This is why an explorer can see the pool grow and still not know what you hold. It is also why a note is spent whole: unshielding “MAX” is not a preference, it is what spending a note means.

The viewing key

Ready derives it on your device the first time you shield. Sealed's app code never receives it and never stores it. It decrypts your notes, and on this pool it is also what authorises spending them.

Why it has to be Ready

Private actions need a wallet that implements the Starknet privacy wallet API: deriving the viewing key on-device and producing the proofs behind a private transfer. Ready is the wallet that does this today. Any Starknet wallet can hold your public STRK; only a privacy-API wallet can perform the private half.

This is a real constraint on who can use the product, so it is on this page rather than buried in an error state after you have already connected something else.

The fee, and why no number is printed here

Every private operation costs a pool fee, charged in public STRK from your ordinary balance - never from your shielded notes. A shielded balance with no public STRK behind it cannot move.

The fee is admin-settable on the pool via set_fee_amount. The app therefore reads it at runtime with get_fee_amount and shows the live figure. No number is hardcoded in this documentation, because it would be wrong the first time StarkWare changed it and nothing here would fail to tell you.

What each leg publishes

ActionPublic on chainNeeds your key to read
Deposit / shieldYour address, the token, the amountnot applicable
Private transferThat the pool was touched, and whenSender, receiver, amount
Holding a balanceNothing beyond the deposit that created itBalance and history
Unshield / withdrawDestination address and amountnot applicable
Pool feeAlways visible, paid in public STRKnot applicable

The relayer, not you, is the transaction sender on a private operation, so your address is not the sender_address on those transactions. Who sees what covers what the relayer learns in exchange.

Account lifecycle

  • A brand new account is deployed by its own first shield - the deploy and the deposit are one flow, not two things you have to remember to do in order.
  • Receive strings are Bech32m, strk1 for public and strkx1 for shielded, so a typo fails a checksum instead of sending money into nowhere. This encoding is Sealed's own convention, not an official Starknet standard.