ZETO updateA Monero wallet in the browser, a security audit, and a better historySince the last update, most of the work went into what happens
after a swap: where the Monero lands, and what you can do with it without leaving the site. There was also an external audit of the refund path. Both are live.
New: a Monero wallet, in your browser, from the same seedUntil now a swap needed a Monero address from somewhere else. ZETO now derives a Monero wallet from the same 12 words as your Bitcoin wallet, in the browser, and nothing leaves it:
- Receive. Tick "Receive in my ZETO Monero wallet" on the swap form and the payout goes to your own address. Payments from swaps are detected on their own; any other payment can be added by pasting its transaction id. Amounts are decoded locally with your view key; the node only learns which transaction you looked at.
- Send. Building and signing happen in the browser, with the same Monero library as the eigenwallet engine (monero-oxide, compiled to WebAssembly). Ring selection, decoys, fee and change are standard, so the transaction is not fingerprintable as "made by ZETO". Before broadcast the browser re-checks the signed transaction against what you confirmed: destination, amount, fee, change. Your spend key never reaches the node or our server. Marked experimental: it works, we have used it on mainnet, but treat it as young software and start small.
- Scan. The wallet can scan the chain for payments you did not paste, for the last 30 days. Our coordinator keeps a compact copy of that window (a few MB per day); your browser downloads it and matches it with your view key in a background worker. The server learns that a browser asked for block ranges, not which wallet, not what matched. Older payments stay reachable by txid, or by restoring the 25 words in a full wallet.
- Portable. Settings shows the 25-word Monero seed and the restore height, so the same wallet opens in Feather, the official GUI, or anything else. Nothing here locks you in.
- Your node. Settings lets you pick which Monero node the wallet talks to: our default pool, one known node, or your own URL. Same for the Bitcoin data source, which was already there.
The audit, and what we fixedAn independent review of the refund path found two real problems. Both are fixed and deployed:
- The refund kit was never kept locally. The kit (signed cancel + refund transactions, the thing that gets your Bitcoin back without us) could only be downloaded while the engine that built it was alive. If that engine was gone, so was the kit. The browser now keeps a verified copy of the kit from the moment the Bitcoin is locked, and offers it directly when the engine cannot be reached.
- The refund address was taken on trust. The kit was checked for structure but not against the address your browser chose when the swap started. It is now: a kit paying anywhere else is refused and reported, before you ever depend on it.
Smaller things- Activity. Both wallets now have an Activity section: every deposit and every send, dated, with a link to the explorer, in a short paged list.
Being honest about what this isThe Monero wallet is a convenience on top of the swap, not a replacement for a full wallet. It sees 30 days of chain history, one account, one address. Sending is experimental. If you hold a meaningful balance, restore the 25 words somewhere that scans the whole chain and keep ZETO for the swap itself.
What the browser verifies, and what it still trusts. The refund path (kit, address, transactions) is checked in your browser and kept there. The swap engine is still hosted by us, and it holds the swap-side key while a swap runs; that is the part an audit cannot make trustless without moving the engine into the browser, which is the next big piece of work.
Your Bitcoin only ever moves after you confirm the lock in your browser, and aborting before that is always free.
The maker side is still open to anyone:
zeto.cash/run-a-maker.
Keep the reports coming. The audit came from one of you, and the wallet exists because several of you asked where the Monero was supposed to go.