How a signed gold document becomes a token on Hedera
Deployed on Hedera testnet, and the Gate was open at block 40466590 (2026-09-13) with backing reserved against it. No token had been minted: the Groth16 proof has not returned, and that proof is the one thing the Gate still needs. This page makes no chain call. Trust reads live state. The source document is synthetic, from no real bank.
Each check has a separate role in issuance.
- Does the signed allocation match? zkPDF, inside SP1
- Where is the issuer’s record? ERC-8004 registry
- May this mint happen? the Gate, on Hedera
- Signed document, 196-byte capsule
- zkPDF inside the SP1 guest
- 224 bytes of public values
- Backing reserved, issued 0
- Issuer permit, expires in minutes
- 11 ordered checks, one transaction
- Token: not minted yet
- 20 contracts deployed, 20/20 running and 17/20 creation code matches, 3 ERC-8004 records, read 2026-09-13
you
Prove
The program checks the signed allocation and produces 224 bytes of public values, plus a proof.
WhyThe Gate verifies the exact request. Its amount and recipient are public; the full document is not required on chain.
This profile checks a synthetic PDF with a structured signed allocation inside SP1. The document service prepares the request for the prover network. Running the program and receiving its completed Groth16 proof are separate steps.
Wallet bound Your address sits inside the signed bytes.
WhyCopying the document does not let someone redirect the mint: the Gate also requires the designated holder’s signature.
EvidenceWhat stays hidden The chain verifies seven public values without needing the PDF.
WhyThose values are the profile version, request digest, signer fingerprint, source id, claim usage id, claim commitment and expiry. The request also publishes the issuer, amount and recipient. The document service and prover process the PDF; a public-input demo also publishes its synthetic witness.
EvidenceOne digest Fifteen fields, one hash.
WhyFifteen request fields hash into one digest, and the EIP-712 domain binds it to this chain and this contract on top. That domain binding is why the same proof cannot be replayed anywhere else.
EvidenceThree languages TypeScript, Rust and Solidity must agree.
WhySo a bug in one implementation cannot quietly change what gets minted.
Evidence