One atomic settlement
The source spends, reserve claims, and closure are included together. Before confirmation, funds remain in the source coins. A missing approval prevents the complete batch from being submitted successfully.
Four deposits. Four fresh outputs. A single on-chain batch,
with proofs made and keys kept on your device.
No live batch data is available. Reconnect before creating or changing a batch.
Create a batch or choose an existing one to collect
public registrations, proofs, and approvals.
Four distinct wallets, each keeping its own key.
Fresh destinations, submitted separately from sources.
Generated locally against the frozen transcript.
Four participants and the fee sponsor sign the exact batch.
The browser coordinates public data. Participants create notes, generate proofs, and sign source coins with the local client.
Start the reviewed companion on your device, then use its browser interface to unlock an encrypted vault, create proofs, and approve the batch. Wallet passwords are entered only at the separate loopback address.
Download both archives and the release manifest. Follow the bootstrap archive’s README to check the independently supplied manifest fingerprint, install the pinned runtimes, and open the local wallet. These public files contain no wallet keys or blockchain data.
This build uses the development verification key and accepts testnet11 only. Until HTTPS is enabled, verify the manifest fingerprint using a trusted copy outside this website before running the client.
Run this from the reviewed checkout with its Python dependencies installed. Replace the uppercase paths and pin with your independently checked values. The service binds only to your own device and does not broadcast transactions.
python experiments/client_batch_v1/client_web_v1.py --wallet-root PRIVATE_DIRECTORY --artifacts ARTIFACT_CONFIG_PATH --artifact-pin APPROVED_CONFIG_SHA256Open local wallet ↗Start the command first. The new window opens at http://127.0.0.1:8878. This public site never connects to the local API or asks for your vault password. The local window can create an encrypted vault from your standard coin and its already-synthetic signing key, or import an encrypted backup.
Check testnet11, denomination, total network fee, expiry height, and the pool identifier. Each of the four owners needs a distinct standard source coin and key; the sponsor is a fifth source.
Keep the private note and signing key locally. Export only the funding registration. Submit the anonymous claim request through a separate, unlinkable channel if you need privacy from the coordinator.
Independently verify its hash and terms. Your client locates your claim without exposing which source belongs to it, then generates one Groth16 proof. Import only the public proof packet.
Download the unsigned candidate. The local client must validate all four proofs, your registered source, your exact intended recipient, change, fee limit, and expiry before signing. Upload only the signature fragment.
After all five source approvals, the coordinator finalizes and submits the exact batch. Submission is not confirmation. Keep your note and source records until the receipt reports independently checked on-chain settlement.
Run these from the reviewed source checkout with its Python dependencies installed. Replace uppercase placeholders with your independently checked values and paths. Create the public output directory first. Passwords are requested locally; never enter them into this website.
1. Initialize a participant vault
python experiments/client_batch_v1/client_cli_v1.py init-participant --vault ./private/wallet.vault --source-key ./private/source-key.bin --source-coin ./public/source-coin.json --pool-id POOL_IDThe source key file must contain the raw 32-byte signing key for the selected standard coin, in a private directory with restricted permissions. Each participant uses their own vault and source. No seed phrase is accepted by this command.
2. Export public files separately
python experiments/client_batch_v1/client_cli_v1.py export-funding --vault ./private/wallet.vault --out ./public/funding.json
python experiments/client_batch_v1/client_cli_v1.py export-claim --vault ./private/wallet.vault --out ./public/claim.jsonImport funding.json as a funding registration. A claim request contains a nullifier and fresh recipient puzzle hash; submitting it through the same connection can reveal its association with the source.
3. Back up the encrypted vault locally
python experiments/client_batch_v1/client_cli_v1.py backup --vault ./private/wallet.vault --out ./private/wallet.backupKeep this encrypted backup and its password. Neither belongs in the public file importer.
4. Generate your proof after the transcript freezes
python experiments/client_batch_v1/client_cli_v1.py prove --vault ./private/wallet.vault --transcript ./public/transcript.json --artifacts ARTIFACT_CONFIG_PATH --artifact-pin APPROVED_CONFIG_SHA256 --out ./public/proof.jsonObtain the artifact configuration and its hash through an independently trusted channel. Download the public transcript from the batch record. Only proof.json is uploaded.
5. Approve the complete candidate
python experiments/client_batch_v1/client_cli_v1.py sign --vault ./private/wallet.vault --transcript ./public/transcript.json --candidate ./public/candidate.json --policy ./public/policy.json --artifacts ARTIFACT_CONFIG_PATH --artifact-pin APPROVED_CONFIG_SHA256 --out ./public/signature.jsonYour local policy must contain the independently reviewed expected_transcript_hash, pool_id, denomination_mojos, maximum_total_fee, current chain_height, latest_expiry_height, and minimum_remaining_blocks. Upload signature.json after the local checks pass.
The sponsor uses a separate source and vault. Its public registration has no note commitment, and it does not produce a membership proof.
python experiments/client_batch_v1/client_cli_v1.py init-sponsor --vault ./private/sponsor.vault --source-key ./private/sponsor-key.bin --source-coin ./public/sponsor-coin.json
python experiments/client_batch_v1/client_cli_v1.py export-funding --vault ./private/sponsor.vault --out ./public/sponsor.json
python experiments/client_batch_v1/client_cli_v1.py sign-sponsor --vault ./private/sponsor.vault --transcript ./public/transcript.json --candidate ./public/candidate.json --policy ./public/policy.json --artifacts ARTIFACT_CONFIG_PATH --artifact-pin APPROVED_CONFIG_SHA256 --out ./public/sponsor-signature.jsonRestore into a new local vault path. For an output spend, obtain the actual confirmed coin record and choose your destination, amount, and fee. The client creates a signed public bundle; this command itself makes no network or broadcast calls.
python experiments/client_batch_v1/client_cli_v1.py restore --vault ./private/restored.vault --backup ./private/wallet.backup
python experiments/client_batch_v1/client_cli_v1.py spend-output --vault ./private/restored.vault --coin RECEIVED_COIN_JSON --destination-puzzle-hash DESTINATION_HASH --amount-mojos AMOUNT --fee-mojos FEE --out ./public/output-spend.jsonMulcher combines Groth16 membership proofs with Chia’s coinset model to settle four contributions and four payouts in one atomic transaction.
The source spends, reserve claims, and closure are included together. Before confirmation, funds remain in the source coins. A missing approval prevents the complete batch from being submitted successfully.
The coordinator receives public registrations, claims, proofs, and signatures. The intended client workflow never sends it a note secret or signing key. Each source owner approves the entire candidate.
The proof hides the note membership witness. All four sources and destinations remain publicly visible. IP addresses, session identity, timing, and out-of-band knowledge can still connect them.
There are four claims in this version. Do not treat that as a large anonymity set. Equal amounts avoid an amount-based distinction within the batch; they do not guarantee anonymity.