OpenCSV

A non-production demonstration of private dollar payments inside Signal, anchored to public Bitcoin signet.

A real 1 Test USD payment inside Signal

Consumer demonstration, not a production Signal or OpenCSV interface. The Signal fork and temporary Swift bridge exist to show this experience to Signal's team. They are not a shipped feature, supported ABI, upstream commitment, or formal-verification layer.

The film follows Bob sending 1 Test USD to Carol on public Bitcoin signet. Every Signal screen is captured simulator footage; explanations appear beside the interface, never over it.

36.288 seconds · actual Signal simulator footage. Dead pauses are cut; all retained action plays at normal speed. The moving dot is an added illustration of the encrypted consignment path, not Signal UI. Test USD is signet-only test value with no monetary or redemption claim. Cut details and source-recording hashes: message-flow page and the journal.

1 Test USDCarol → Bob · tx 445c43cb…400fd · height 316765
1 Test USDBob → Carol · tx 6d85895f…f49aa · height 316766
36.288 s cutone-screen context · two synchronized views · retained action at 1×

Later live gates used the same Bob and Carol wallets: 5 + 5 Test USD shared one Bitcoin transaction, and a separate 1 Test USD payment was fee-bumped without becoming a second payment (replacement confirmed at height 316803). A later zero-confirmation round trip moved 45 Test USD and a 10 Test USD return while both anchors were still unconfirmed (parent, child); both follow-up fixes from that run are merged (Signal #8 at 1e3472b9, opencsv-rs #16 at 908bbb53). Both anchors later settled at height 316824. Detailed receipts are in the status cards and the journal.

Status

Each item links to its receipt. Nothing on this page is a production release.

On the reference main line

Proof lineage v3 + co-funded batching

Issuer authorization and predecessor keys are bound in-circuit. The 94-bit-floor proof profile, C1 co-funded transactions, and C2 two-round peer gossip have reproducible Rust receipts. The separate translated-Rust kernel refinement has 15 audited declarations on formal-aeneas/main.

On opencsv-rs/main · physical receipt

V4 one-input forwarding

The production FRI profile is unchanged. A new authenticated circuit spends one predecessor into recipient plus change with no fake padding coin. On the physical iPhone 16e it proved in 6.435 seconds, verified in 19.75 ms, and produced a 788,047-byte proof. The shape is on the reference main line through 46a3e48.

Now on opencsv-rs/main

Verified kernel, accept boundary, readiness, wallet

A4/A5 adoption, dated signet/readiness evidence, C2 adversarial fixes, and the Rust-owned account-wallet foundation are merged. The independent adversarial re-review was deferred by the owner, not represented as completed.

Merged prototype · fix-forward gates remain

Signal-iOS demonstration + one Test USD wallet

  • Two registered simulator wallets completed the film's round trip; both anchors confirmed at signet heights 316765 and 316766.
  • Earlier acceptance runs exercised provisional receipt, unconfirmed-parent forwarding, shared batching, safe RBF, and relaunch recovery. Receipts: payment story · journal.
  • Fresh 45/10 zero-confirmation repeat: 6.149s/6.171s local proving, 24ms/22ms signing and persistence, with both exact transactions still unconfirmed when the child was accepted.
  • Rust owns custody, Bitcoin fees, change, signed persistence, relay, and recovery. Signal has no mint or general Bitcoin-send surface.
  • Signal PR #6 is merged at db818658; PR #7 closed the hosted CI gate at 4804e094 with green default-branch CI (1,552 tests passed, 0 failed).
  • Signal PR #8 is merged at 1e3472b9 with all hosted gates green. It fixes canonical outgoing-presentation lookup.
  • Rust PR #16 retries selection after a verified confirmed spend and is merged at 908bbb53 with green Rust CI.
  • Signal PR #9 pins that Rust SHA at 9b72d86d. Its PR-tip jobs passed; the post-merge default Xcode job failed while recovery passed.
  • Still open: a green default-branch Signal rerun/fix, the crash matrix, clean-install recovery, remaining batch/RBF acceptance, and physical rollout.

The demonstration wallet cannot spend Bitcoin outside the protocol. It exposes fee reserve, UTXOs, confirmations, and evidence, but Bitcoin can be spent only by an OpenCSV transfer or protocol-safe fee bump. There is no general BTC send, mint interface, or issuer secret in Signal; issuance is a separate headless operator workflow outside the app. There is no OpenCSV anchor server. The exact gates are in issue #1 and the Signal architecture in issue #3. The OpenCSV test issuer's canonical disclosure is in the test USD issuer terms.

Evidence

Formal verification, performance, and delivery status each have their own page, linking to the underlying source, CI, and machine-readable data.

How it works

Bitcoin provides ordering and availability. Everything else — amounts, coins, validity proofs — moves directly between sender and recipient, and the recipient verifies it client-side.

01 — Mint

Issuer creates supply

A v3 mint proves knowledge of the issuer seed committed by genesis and binds the exact statement in-circuit. MINT ∥ asset_id ∥ V remains public for supply audit; new coin openings remain private.

02 — Send

Sender pays over Signal

The Rust wallet reserves Bitcoin fees, fixes input zero, and anchors a 64-byte context-bound record. Raw nullifiers, coin openings, and the recursive proof travel only in the consignment, e.g. over Signal.

03 — Verify

Recipient verifies locally

The recipient verifies one history-independent proof and one Bitcoin anchor, then evaluates first occurrence from its own header/filter/block view. Explorer data may accelerate discovery; it cannot decide acceptance.

Properties

OpenCSV extends Shielded CSV's client-side validation with issuer-gated issuance, auditable supply, and light verification.

Authenticated production-profile measurements. V3 and the v4 one-input forwarding shape are on the reference main line. The August 1 ~0.55 s phone result used the retired test profile.
ProofM4 prove (warm)VerifySizeiPhone 16e prove (cold)
Genesis mint102 ms14.8 ms535,705 B181 ms
V4 one-input / mint predecessor4.80 s20.4 ms788,068 B6.44 s
Transfer / mint predecessors7.77 s22.2 ms854,105 B11.25 s
Transfer / node predecessors9.76 s21.4 ms841,464 B14.47 s
Redeem4.71 s19.9 ms778,466 B7.28 s

Comparison

Where OpenCSV sits among RWA and client-side-validation designs.

Client-side validationShielded transfersAuditable supplyIssuer-gated issuanceTrustless light verificationFork-free on Bitcoin
ERC-20 (Ethereum)nonoyesyestrusted RPCn/a
RGByespartialper-contractyesfull history rescanyes
Taproot Assetsyespartialissuer proofsyesissuer proofsyes
Zcashno (own chain)yesnonolightwalletd (trusted)no
Shielded CSVyesyesnonofull scan or trusted indexeryes
OpenCSVyesyesyesyescompact filters + PoW, on-deviceyes

Issuer-gated issuance and auditable supply make OpenCSV an RWA scheme rather than a bearer asset. On light verification: in plain Shielded CSV, checking a double-spend means scanning every nullifier the chain has ever carried, or trusting an indexer that did. OpenCSV's marker output makes anchor blocks discoverable through the same compact block filters light wallets already sync, so a phone checks first occurrence locally from proof-of-work and a few kilobytes per block. The scan-soundness argument is machine-checked; see the formal page.