Payments on Stacks that do not show up on the chain
A shielded pool for sBTC. Deposits go in, and a transfer publishes a commitment and a nullifier, with the amount, the sender and the recipient proved correct without any of them being revealed. The proof is a ZK-STARK and it is verified on chain, in Clarity, inside one block.
What is hidden
The chain sees that a transfer happened and that some commitment was spent. It does not see the amount, who sent it, or who received it. A deposit and a withdrawal are public at the edges, because that is where value crosses in and out.
Where the keys are
Proving a spend consumes the spending key, so it happens in your browser tab and nowhere else. There is no hosted prover, because whoever ran one could spend the notes that passed through it.
What it costs
A 306 KB proof, verified on chain for about half a block's execution budget. The whole flow for a user is one block.
Try it with a test account
These are throwaway testnet accounts, already funded with testnet STX for gas and mock sBTC to deposit. Import one into Leather or Xverse, switch the wallet to testnet, then open the wallet.
Anyone reading this page has them. Your zkStacks private address is derived from your wallet signature, so everyone using the same phrase derives the same private address and can read the same notes. That is a property of sharing a wallet, not of the pool: an account you generate yourself is private in the way the protocol intends. Never put anything you care about behind one of these, on any network.
- In Leather or Xverse, choose to import or restore a wallet.
- Paste one of the phrases below.
- Switch the wallet's network to testnet.
- Open the wallet and connect.
Pick a different account from anyone else trying this at the same time. Two people sending from one account at once will collide on the wallet's transaction nonce, and both will see a failure that has nothing to do with the pool.
-
Account 1
ST2PHFPF1M5Z9MVPC5C5QMAQBQZKFFADPTB63SRF1buffalo feature direct regret couch future humble assault brown ecology return dragon -
Account 2
ST12ZK5SB7X3WHNXS77EFEBQEDEKG4R9DRZ9THJB8chalk gas own guard ankle toddler horse speak envelope rich arctic economy -
Account 3
ST2GQAQMM3EM0PCYWJJAM47H17VSZ9P06JKTT7AYKlesson jealous wild behind person oak brand immune pond connect arch harvest -
Account 4
ST1GE039W49K7ZYB2775V2EC25H7B6F7MFDWZVS9Qchicken evidence slush program brick excite sight safe emerge pioneer major sand -
Account 5
ST1MHHB34MN22NH7P3B742K73KW3S1C1KPD2A15Y0trouble pilot loan jealous have rotate health goat drill question genius bone -
Account 6
ST1RD34HFHZTCSA5CTRDE68HZZPZ8A7DB3CBZAHDFscript fabric decrease beauty absorb cannon expand defense address fancy arm horse
Out of test sBTC? The mock token's mint is deliberately
ungated on testnet, so call it yourself from
the token contract:
amount in satoshis, recipient your address.
Each account above starts with 5 sBTC, which is enough for several runs.
What is not finished
This is a testnet demonstration of a protocol, not a product, and the honest list matters more than the demo:
- The sBTC here is a mock token. Minting real sBTC is protocol-gated, so the withdraw path has never run against the genuine asset.
- Automated tests do not cover the wallet extensions. Leather and Xverse have both signed against this pool on testnet, by hand. Nothing in the test suite drives a real extension, so their confirmation dialogs, account switching and network handling are checked by using them and not by anything that runs on its own.
- Testnet keys only. Nothing here has been near mainnet, and the accounts above must never be used on it.