Attestat

Attestat Engineering examples

Built on the same decision.

Engineering examples built on the same on-chain decision. None is a product, none is live, no named company uses one.

Two cards are the product journey shown on the main page. The rest are labelled on the card: a candidate that still needs a Sepolia run, parked work whose code and docs are kept, or a route that is off by default.

System map

One decision in the middle.

Evidence comes in from the left. A proof turns it into predicate bits. The issuer approves. The decision sits on chain, and everything to the right only reads it. Everything below can close it.

1Evidence in

What the person presents. Names reach the issuer's verifier only on the server route; on the browser route they stay in the tab. Never on chain.

  • EUDI wallet

    OpenID4VP request, SD-JWT PID with selective disclosure: given name, family name, over 18. Today the official German test wallet with a sample identity.

    official test wallet, browser proof, local chain: green
  • Passport chip via zkPassport

    The zkPassport app reads the chip over NFC and proves over 18 on the phone, bound to the wallet address. Verified on chain by zkPassport's contract. Not eIDAS evidence.

    off by default; mock passport green on anvil, phone run pending
  • Swiss e-ID (swiyu)

    Attestat consumes OpenID4VP presentations of SD-JWT credentials. Today that is the EU wallet; the Swiss e-ID uses the same formats and protocol, and its test credential carries the same over-18 claim. We expect our verifier to need a Swiss DID and a new issuer key rather than a new circuit, and a Beta-ID test vector is the next step.

    research; same formats as the Beta-ID stack, no vector run yet
  • Other national systems

    Mobile driving licences in Apple and Google Wallet are ISO mdocs; Google's wallet already answers age requests with a Longfellow zero-knowledge proof, which our verifier accepts off chain today. Taiwan's digital identity wallet issues SD-JWT credentials over OpenID4VP. GOV.UK Wallet is moving to mdoc and OpenID4VP; verifying it requires a certified UK digital verification service, which we are not. Singpass, Diia, UAE Pass, gov.br, Aadhaar, Korea's mobile ID and Japan's My Number Card do not hand a third party a credential it can verify against a public anchor; for those citizens the passport route applies.

    research; 17 systems compared on 9 September 2026 from published specifications, no demo used a live national wallet other than the German EUDI test wallet and zkPassport

2Proof

Same circuit, same statement. Only where the proof is made moves. All times measured on the builder's machines.

  • Browser tab (Noir, bb.js)

    The tab decrypts the wallet's answer and proves it. Our server relays the encrypted answer unopened.

    prove 11.0 to 11.3 s, click to attested 42.8 s with the official wallet (M3 Max, Chrome 152)
  • Laptop companion (Noir)

    A small program on the investor's own computer does the same job outside the browser.

    bb prove 3.96 s warm, attested in 8.2 s (M3 Max)
  • Phone provers

    Android and iOS builds of the same circuit. Measured, not yet run against the wallet's presentation on a physical phone.

    Android emulator 6.7 s; Chromebook Android container 47 to 49 s; iPhone 16 Pro Max simulator 5.2 s
  • Server route (SP1, Groth16)

    Our verifier makes the proof. Boundary, stated on screen: the chain does not trust our server, but the server did see the presentation.

    Groth16 in about 270 s native; verified on a Sepolia fork at about 280k gas

3The decision

AttestationRegistry, one record per wallet address and policy. No name, no document, no string.

struct Decision {
  bytes32 policyId;  // the policy
  uint256 bits;      // 1 evidence, 2 over 18
  uint8   tier;      // informational
  uint64  expiry;    // unix seconds
  bytes32 statusRef; // never a name
  bool    revoked;   // by the issuer
}
  • written byattestWithProof (a proof, permissionless) or attestByOperator (the issuer's key)
  • counts only withthe issuer's separate approve; evidence alone opens no door
  • read byisEligible(subject, policyId, requiredBits): approved, not revoked, not expired, bits present
  • closed byexpiry without anyone acting, or one revoke transaction

4Consumers

Anything that can call isEligible. One permission read by several contracts, and one revoke closes them in the same block.

  • Fund token transfer check

    The demo fund token asks the registry before subscribe, transfer and withdraw.

    green on anvil and on a local Sepolia fork
  • Uniswap v4 permissioned pool

    An allowlist checker reads the same registry; PermissionedHooks refuses the swap after a revoke.

    in-app swap door green on Sepolia, 2026-09-10
  • GatedPayout

    A payout contract that pays only attested adult addresses, fed by a quorum-owned treasury wallet.

    payout desk demo green locally; Sepolia pending
  • Privy policies mirrored from the decision

    A signer's policy copies the expiry and gains a deny rule on revoke, so an automation stops when the decision does.

    standing order green locally; hand-clicked Sepolia pending

5Controls

  • Issuer approve and revoke

    The operator key approves in a separate step and withdraws by hand. Manual, captioned manual.

  • Privy signers and policies

    Delegated signers on embedded wallets, bounded by a policy the investor can read and remove.

  • Key quorums

    The registry's operator as a Privy server wallet owned by a 2-of-2 quorum, limited to approve and revoke.

green green locally per the evidence table in progress built or measured in part pending not started or a builder step

Demos

Eight demos, one registry.

Each card carries its state: product journey, candidate, parked, or off by default, and says where it is green and which prize track it addresses. Every green is on a local chain or fork. The demo routes run in the product app; the landing page is its pitch.

The investor portal after a proof made in the browser tab: attested, awaiting the issuer's approval product journey; green on anvil with the official wallet (class W); no-phone operator journey green on Sepolia 2026-09-10, phone leg on Sepolia recorded 2026-09-12

The EUDI investor flow

The investor's wallet binds the session, a state test wallet answers with three fields, the proof is made in the browser tab, the issuer approves in a separate on-chain step, the approval becomes a few bits on chain that a fund token and a Uniswap pool both read, and one revoke closes both.

Best Uniswap Stack Contribution (the pool is the second door)

The Swap tile of the investor portal twice: swap confirmed from the dev-signer wallet, then the identical swap refused by PermissionedHooks.beforeSwap after the revoke; local anvil fork of Sepolia product journey; swap door green on Sepolia, 2026-09-10 (no-phone operator journey)

The Uniswap permissioned pool swap

The same decision opens a Uniswap v4 permissioned pool. The investor buys fund tokens with a test stablecoin (100 mUSD in, about 90 NDF out) without a second presentation; after the revoke the identical swap reverts in the pool's hook.

Best Uniswap Stack Contribution

Local run on an anvil fork of Sepolia, dev signer: the swap tile before and after the revoke (docs/ui in the app repository).

The issuer console's automation section on a local run: the policy in plain words per investor and the tick log with a subscribed tick, the deny-all rule after the revoke and the refused tick candidate, needs a Sepolia run; green locally (class L), Privy path hand-clicked on Sepolia pending

Standing order

The issuer's automation subscribes every month from the investor's embedded wallet through a signer whose Privy policy is a copy of her on-chain decision: until the expiry, denied on revoke.

Best B2B financial product, also Best financial flow

The savings plan board on a local run after the revoke: the decision revoked in the middle, the plan, Issuer B, the pool checker and the transfer all closed parked, code and docs kept; green locally (class L), Privy path on Sepolia pending

Savings plan

A retail investor proves once, and a delegated signer buys into the fund on a schedule; a second issuer's instrument, a transfer to another attested wallet and the pool accept the same decision until one revoke closes the plan, the second issuer and the pool.

Best B2B financial product, also Best financial flow

The compliance desk on a local run: the queue with an approve confirmed by both officers, the revoke, and a 1 wei transfer refused by the simulated policy parked, code and docs kept; green locally (class L), Privy path on Sepolia pending

Back office

The registry's operator is a Privy server wallet owned by a two-key quorum under a policy limited to approve and revoke, so no desk member holds an identity document or a free-signing key.

Best B2B financial product

The fund desk on a local run after the issuer's revoke: eligibility revoked, Subscribe, Claim and Redeem closed, and the refusal in plain words parked, code and docs kept; green locally (class L), Privy path on Sepolia pending

Investor money

An investor who signed in with email subscribes in a test stablecoin, claims distributions and redeems; every movement checks the one decision.

Best financial flow

The contractor payout desk on a local run: run 1 executed and the unattested contractor refused by GatedPayout, run 2 refused after the revoke, run 3 refused over the cap, and a direct transfer refused by the simulated policy parked, code and docs kept; green locally (class L), Privy path on Sepolia pending

Payout desk

A company pays contractors from a quorum-owned treasury wallet whose policy confines it to a payout contract that pays only attested adult addresses.

Best B2B financial product, also Best financial flow

The passport chip card of the investor portal with the mock adapter on anvil: QR code from the zkPassport service, waiting for the zkPassport app; no phone scanned it off by default (flag VITE_ZKPASSPORT); mock passport green on anvil (class L), phone run pending

The zkPassport route

Same decision, two kinds of evidence. Passport chip: anyone with a biometric passport, today, through the zkPassport app; the proof is made on the phone by that app and checked on chain by zkPassport's verifier contract. The issuer still approves.

No prize track. A second evidence route for people outside the EU wallet's reach.

Use cases

Who buys, and what becomes possible.

The buyer is always the party that already owns a gate. Attestat is its tool; the person never pays Attestat and never uploads a document to it.

Who buysWhat becomes possibleDemo
A fund issuer or transfer agent that gates its token behind its own allowlist Accept the investor's state wallet once, approve once, and let the token and the pool read the same decision. Revoke once. EUDI investor flow
The same issuer, for recurring inflow Run a standing order or savings plan from the investor's own wallet, stopped by expiry, by revoke, or by the investor, with no document behind the automation. Standing order, Savings plan
The issuer's compliance desk Approve and withdraw wallets under a four-eyes rule with a quorum-owned operator wallet; no desk member holds a file or a free-signing key. Back office
An issuer whose investors have no crypto wallet An email sign-in gives the investor an embedded wallet; subscriptions, distributions and redemptions in a test stablecoin all check the decision. Investor money
A company paying contractors in stablecoins A treasury wallet confined to a payout contract that pays adults with state identity evidence and nobody else, without holding a passport copy. Payout desk
A second issuer or a pool operator Accept a customer another issuer already approved, on day one, by reading the registry. Its own customer file stays its own duty. Uniswap pool, Savings plan
An issuer with investors outside the EU wallet's reach Accept a passport-chip proof through zkPassport into the same registry, with the different trust model stated on screen. A biometric passport works anywhere: the zkPassport route proves over 18 from the chip on the phone, and the same registry stores the decision. zkPassport route
Beyond the EU: an issuer whose customers hold another state's wallet Switzerland's e-ID is expected to go live on 1 December 2026 on SD-JWT VC and OpenID4VP 1.0; we expect our verifier to need a Swiss DID and a new issuer key rather than a new circuit. Taiwan's wallet issues SD-JWT over OpenID4VP; the same circuit should apply once we have read a sandbox credential. US and UK mobile driving licences are mdocs and need an mdoc path. No demo here used a live national wallet other than the German EUDI test wallet and zkPassport; every other statement is read from the published specifications. Evidence lane

Attestat helps token issuers accept EUDI identity evidence and apply their approval to customers' linked crypto wallets, without putting identity documents on chain.

What is real in these demos

  • Official test walletThe German EUDI sandbox with a sample identity. No state-issued ID in any demo.
  • Where the proof is madeIn the investor's browser tab, which is the demonstrated route; a laptop companion does the same job outside the browser. In the server route our verifier makes the proof and did see the presentation. In the zkPassport route a third-party app on the phone makes it.
  • SimulatedSanctions and similar checks are stubs. Demo subscriptions mint fund tokens without payment. Local runs use a local Privy policy evaluator, captioned as such.
  • Manual revocationThe issuer revokes by hand. Expiry is shown on a local chain, where time can be moved.
  • Sepolia by handGreen means green on a local chain or fork. Every Sepolia run is a builder step and is listed as pending until recorded.
  • On chainNo identity documents and no name on chain; the chain record carries an address, predicate bits and an expiry. Predicate bits and an expiry bound to an address are still personal data.
  • Demos, not productsNothing here is live, and no named company uses it. Sponsors appear where their software is integrated: Privy, Uniswap, zkPassport.