Share this with senders. It never changes, and is never written on-chain.
Label indices ≥ 1 produce distinct sp1… addresses that still resolve to the same spend key, so you can tag senders. Index 0 is reserved by spec for change.
Silent-payment receivers can't tell which taproot outputs are theirs without reading every transaction's inputs. A Blindbit-compatible indexer exposes per-block tweak data so a light client can do this work locally.
Blindbit-oracle does not send Access-Control-Allow-Origin headers, so browsers block Silent Amulet from reading its responses. Put a tiny proxy in front:
Option A — Caddy (save as Caddyfile, run caddy run):
:8000 {
reverse_proxy 127.0.0.1:7000
header {
Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, OPTIONS"
Access-Control-Allow-Headers *
}
@options method OPTIONS
respond @options 204
}
Option B — Python 3 (no dependencies, save as blindbit-cors.py, run python3 blindbit-cors.py):
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.request import urlopen
from urllib.error import HTTPError, URLError
UPSTREAM = 'http://127.0.0.1:7000'
class H(BaseHTTPRequestHandler):
def _c(self, s=200, b=b''):
self.send_response(s)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS')
self.send_header('Access-Control-Allow-Headers', '*')
self.send_header('Content-Type', 'application/json')
self.end_headers()
if b: self.wfile.write(b)
def do_OPTIONS(self): self._c(204)
def do_GET(self):
try:
with urlopen(UPSTREAM + self.path, timeout=30) as r: self._c(r.status, r.read())
except HTTPError as e: self._c(e.code, e.read() if e.fp else b'')
except URLError as e: self._c(502, str(e).encode())
HTTPServer(('127.0.0.1', 8000), H).serve_forever()
Both listen on 127.0.0.1:8000 (Silent Amulet's Localhost preset) and forward to Blindbit on :7000 (Blindbit's example default). If your Blindbit runs on 8000 directly, change UPSTREAM / reverse_proxy to a different port and keep the proxy on 8000.
Use Sync wallet (above) for the normal flow. This pane is for rescanning a specific window, e.g. after importing a wallet with an older birthday.
The quick way: paste the address, type an amount, fetch your funds, send. The numbered cards below do the very same thing step by step if you want to watch every detail.
Broadcasting from this browser shows your IP address and the transaction to the indexer you connect to. For maximum privacy, use the numbered cards below and push the signed transaction through your own node or Tor.
Add each UTXO you want to spend. For silent payments, only these types are eligible: P2TR-keypath (bc1p…), P2WPKH (bc1q…), P2SH-P2WPKH (3…), P2PKH (1…). Keys are used locally only.
This checks the wallet you set up on the Setup tab for ordinary Bitcoin funds that are not silent payments yet, so you can send them onward to a silent-payment address. It looks at the wallet's native SegWit, Taproot and wrapped-SegWit addresses. It uses the seed already loaded on the Setup tab, so nothing is re-entered and nothing leaves this page.
Privacy note: a public indexer sees every address of this wallet as one cluster. Point this at your own node for the best privacy. Also, spending UTXOs from several of these addresses in one payment links them together on-chain.
| txid | vout | amount (sats) | scriptPubKey (hex) | privkey (hex) | elig. |
|---|
BIP-352 reserves label index 0 on your own SP address for self-pay (change). When you pick the sp1… option, Silent Amulet will run a dual-recipient sender derivation — same inputs, same tweak, two distinct P2TR outputs. The bc1p… option uses x-only(B_spend) directly as a raw P2TR output, spendable by signing with your spend key.
Build a fully signed raw transaction in the browser using the private keys already loaded in your UTXO editor. Covers all four input types — P2TR (Schnorr, BIP-341), P2WPKH / P2SH-P2WPKH (ECDSA, BIP-143), and P2PKH (legacy ECDSA). Requires the fast-crypto backend (@noble/secp256k1) to be loaded — check the crypto pill on the Receive tab. If it's not loaded, use the PSBT above with an external signer.
Runs the official BIP-352 test vector (Simple send: two inputs) end-to-end: input-hash, shared-secret, output pubkey, and address encoding.