Skip to content

UMBR is live on testnet. Private payments with test funds on Robinhood Chain and Tempo.

Open the app

How it works

Proofs

Four kinds of proof you can hand to someone: an exact balance, a minimum balance, a payment and a payroll total. Each says one thing and nothing more.

Kinds
4
Made
On your device
On chain
Never
Expiry
1, 7 or 30 days

Four proofs#

A proof is a small file that convinces a reader of one statement about your private money. You build it in the browser (or in your own code with the SDK) from note data that only your keys can open. A proof cannot spend anything and is not published anywhere: you decide who receives it. Make one from Prove in the app, or from a finished run on the Payroll page.

Exact balance#

States the precise amount of one private balance in one asset, for example 1,240.50 USDG. Use it when the figure itself is what the reader needs. It speaks for a single balance at the moment it was made, not for everything you hold, and it does not promise the funds are still there later. If the reader needs that, ask them to accept an at-least proof with a short expiry instead.

At least#

States that you hold no less than an amount you choose, such as 5,000 pathUSD, and nothing about how much more. It is the usual proof of funds for a landlord, a lender or a counterparty. Up to four of your notes in the same asset can back it; the app chooses the smallest set that covers the amount. If your balance is spread across more notes than that, merge them first by sending to yourself, or prove a lower figure.

Payment#

States that a specific private payment happened. You choose whether it reveals the exact amount or only a floor ("at least 300 USDG"). Either party to the payment can produce it, and the proof does not say which side made it. It covers direct sends to an UMBR address, claimed payment links and payroll lines.

Payroll total#

States that one payroll run you sent paid exactly a given total across a given number of payments, such as 48,200 USDG to 12 people, while every individual line stays hidden. It is meant for the books: your accountant, an auditor or a tax authority gets the number they reconcile against, and nobody learns a salary. Open a finished run, or find it under past runs, and choose Prove total.

The checker only accepts lines that are private payments you sent from your own balance inside the pool. Deposits, change notes, trades and incoming payments are rejected, and the same payment cannot be counted twice, so the total cannot be padded.

What each one shows and hides#

ProofThe reader learnsThe reader never learns
Exact balanceThe asset and that single amountYour wallet address, other balances, your history
At leastThe asset and the floor you choseYour actual balance, which notes back it, your wallet
PaymentThe asset, the amount or a floor, and roughly when it settledYour balance, your other payments, which side you were on
Payroll totalThe asset, the run total, the number of payments, the settlement windowAny single amount, recipient names or addresses, your balance

Made for one person#

Every at-least, payment and payroll-total proof carries two values you set when you make it: an audience (free text, like "Northwind Leasing" or an email address) and an expiry of 1, 7 or 30 days. Both are inputs to the proof itself, so editing either one makes it fail. A forwarded copy still verifies, but it tells whoever opens it who it was made for and when it stopped being valid. That makes quiet reuse visible instead of impossible, which is the honest version of this guarantee.

Pick a short expiry

A proof is a snapshot. The shorter its life, the less it can be misused and the closer it stays to the truth.

How checking works#

A proof is a JSON file in the umbr.disclosure/1 format, or the same file as one line of text starting with umbrproof1:. A verifier works through it in order:

What a verifier does
  1. Reads the file

    It must be umbr.disclosure/1, name a network UMBR runs on and point at UMBR's pool on that network.
  2. Checks the statement

    The kind of claim, the asset, the amount (and the count for a payroll total) must be well formed.
  3. Checks audience and expiry

    The audience text is shown to the reader, and an expired proof is marked as expired.
  4. Checks the zero-knowledge proof

    The Groth16 proof is checked against the pool's verifier, including that its Merkle root is one the pool has recorded.

Status on testnet

The verify page runs the first three steps in your browser today, plus a check that the proof is made of valid BN254 numbers. The final pairing check against the on-chain verifier shows as "unknown" until UMBR's pool contracts are configured for that network. Until then a result there means well-formed, not verified.

Limits worth knowing#

  • A proof is true when it is made. Balances can change afterwards; expiry is how you bound that.
  • Audience binding labels a proof; it cannot stop someone from showing it to a third party. Share proofs the way you would share a bank letter.
  • A payment proof shows a payment took place inside the pool. It does not prove what the payment was for.
  • Proofs are only as sound as the circuits and the setup behind them. See the threat model and the production gate.

How to check a proof#

Anyone can check a proof without an account or a wallet. Paste the file or open the link at umbr.trade/verify, or call verifyProof from @umbr/sdk in your own system. The result is the statement, the audience, the expiry and a clear valid or invalid.