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
| Action | Public on chain | Needs your key to read |
|---|---|---|
| Deposit / shield | Your address, the token, the amount | not applicable |
| Private transfer | That the pool was touched, and when | Sender, receiver, amount |
| Holding a balance | Nothing beyond the deposit that created it | Balance and history |
| Unshield / withdraw | Destination address and amount | not applicable |
| Pool fee | Always visible, paid in public STRK | not 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,
strk1for public andstrkx1for 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.