How Privacy Works
A simple explanation of the zero-knowledge proofs that power Senddy.
What is a zero-knowledge proof?#
A zero-knowledge proof lets you prove something is true without revealing the underlying information. For example:
- Prove you have enough money to make a payment — without revealing your balance
- Prove a transaction is valid — without revealing the amount or participants
- Prove your funds came from legitimate sources — without revealing your transaction history
This is the core technology that makes Senddy private.
Deposit privacy with ephemeral addresses#
Base deposits do not reuse a user's smart-wallet address. For every deposit intent, the client deterministically derives a fresh EOA from the user's local storage key, the Base chain ID, the pool address, and a random derivation nonce.
The deposit lifecycle is:
- The client displays the new EOA as a one-time USDC address.
- The client monitors its USDC balance and the pool's
deposits(depositId)record in one multicall. - The EOA signs a receiver-bound EIP-3009
ReceiveWithAuthorizationmessage. - A relayer calls
depositWithEIP3009on the pool; the authorization cannot be consumed by an unrelated caller. - The same EOA signs
ShieldAuth, allowing the relayer to shield the deposit. - Once
deposits(depositId).consumedis true, the address is retired.
This removes a stable recipient address that could otherwise be used to cluster all deposits belonging to one Senddy account. Private keys for these EOAs are never sent to Senddy or stored by the relayer.
Ephemeral addresses do not hide the public funding transfer itself. The source address, token, amount, and timing remain visible on Base and may permit probabilistic correlation. If the same self-custody source funds several one-time addresses, that source can still link those transfers.
How Senddy uses ZK proofs#
Every transaction on Senddy involves a zero-knowledge proof:
When you deposit (Shield)#
Your public deposit is converted into private "notes." The shield proof proves:
- The private notes are worth exactly the amount deposited (no creation of value)
- The note commitments are correctly formed
- The notes can only be spent by the depositor
After shielding, later private spends reveal no public pointer to the deposit or note being spent. The public deposit and resulting commitment still exist on-chain, but the zero-knowledge spend does not disclose which commitment it consumes.
When you send or withdraw (Spend)#
Spending private notes requires a proof that demonstrates:
- Ownership — You know the secret key for the notes you're spending
- Existence — The notes exist in the Merkle tree (they haven't been fabricated)
- Conservation — The inputs equal the outputs (no value created or destroyed)
- Uniqueness — The nullifiers prevent double-spending
The proof reveals none of the following:
- Which specific notes are being spent
- The value of any note
- The identity of the sender or recipient
What is visible for private spends?#
| Data | Visible on-chain? |
|---|---|
| A transaction occurred | Yes |
| Proof was verified | Yes |
| Nullifiers (prevent double-spend) | Yes |
| New note commitments | Yes |
| Sender identity | No |
| Recipient identity | No |
| Amount transferred | No |
| Sender's balance | No |
| Recipient's balance | No |
| Link between sender and recipient | No |
| Transaction history | No |
Public deposits are different: the funding transfer, ephemeral address, deposited amount, and pool interaction are visible. What is hidden is the account's stable deposit identity and the link from a shielded note to later private activity.
Encrypted memos#
Senddy supports encrypted memos attached to transactions. Memos are encrypted using X25519 ECDH key exchange with XChaCha20-Poly1305 symmetric encryption. Only the sender and recipient can decrypt the memo.
Viewing keys#
Each Senddy account has a pair of keys:
- Spend key — Required to spend your notes. Never leaves your device.
- View key — Used to scan the blockchain and identify which notes belong to you. Can be shared with auditors if you choose to.
This separation allows optional compliance: you can grant read access to your transaction history without giving anyone the ability to move your funds.