Zero knowledge. Real-world assets.

Private books.
Verifiable
claims.

Prove that a private loan book meets a solvency threshold and its KYC flags are set, without revealing individual loans.

Groth16 / BN254 · MIT licensed · Research prototype

01 / Evidence

Measured. Reproducible.
Open to inspection.

Every result has a source.
Evidence recorded 17 September 2026.
Printable evidence sheet

Where it actually runs

Full deployment record
ENVIRONMENTSTATUSWHAT THE EVIDENCE SHOWSSOURCE
SolanaLocal test validator
Confirmed locally

83,354 CU in the finalized receipt and SBF harness. This is a local cluster, not a public deployment.

SolanaPublic devnet
Pending funding

Not deployed. Public faucet requests were rate-limited; no devnet verification transaction is claimed.

EthereumPublic Sepolia testnet
Public example

197,605 verifier-only gas; 224,234 total transaction gas. A baked-in example proof.

The earlier local Solana measurement was 83,352 CU. Separate example proofs demonstrate the same proof system across chains.

02 / The mechanism

Prove a property.
Keep the records private.

The proof attests to the supplied data.
It cannot establish that the off-chain
data is true.

01

Commit to one book

A blinded Poseidon commitment binds the private loan data. The servicer signs that commitment in the native model.

02

Prove the statement

The circuit checks performing collateral against a public threshold, all KYC flags, and the book commitment.

03

Verify the proof

Solana’s alt_bn128 interface checks the pairing equation. The pilot gate uses a stored approved key and requires the configured servicer signer.

Explore the binding checkNATIVE MODEL

What happens if someone swaps the book but reuses the original signature?

Proof verification
Pass
Servicer signature matches
Pass
MODEL DECISIONMint allowed

The proof and signature bind the decision to the same attested book.

Illustration of the tested native demo. No proof is generated here, no transaction is sent, and no token is minted.

Inspect the native model
03 / Verification

Code you can question.
Results you can reproduce.

The repository records an empirical audit
and two independent code reviews.
These are not a formal security audit.

01

Adversarial checks

Insolvent, failed-KYC and wrong-commitment books fail the constraint checks. Altered proofs and public inputs are rejected.

Inspect the checks
02

First code review

The audit record describes working cryptography and four findings, including setup randomness, commitment hiding and collateral bounds.

Read the findings
03

Follow-up review

A second review checked the fixes. The newer pilot adds key pinning and signer policy. Setup, token integration and external security review remain open.

Read the audit trail
Start with the code

One command.
Six demo stages.

Unit tests, loan-tape decisions, proof checks,
the native gate, scale and SBF verification.

Setup instructions
rwa-credit-proof / terminal
# From the repository root
$ ./demo.sh

# Separate adversarial audit
$ cargo run --release --bin audit

# Separate 10,000-loan benchmark
$ cargo run --release --bin bench -- 10000

Rust required. Stage six also needs the Solana toolchain.
Public network receipts are checked separately.

04 / Honest boundaries

A research prototype.
An explicit trust model.

Not production-safe
Read before integrating

A successful pairing check is not authorization to mint. The local pilot gate records an approval after key, signer, threshold and freshness checks. Consumers still need their own action policy and token integration.

NATIVE / HOST SIDE

Proof + signature.

The combined mint-decision model.

Modeled in the native demo
SOLANA / ON CHAIN

Pilot approval gate.

Stored key, authorized signer and policy.

Local receipt; no token mint

What remains open

Single-party setup remains a soundness risk. The delta-only ceremony experiment is incomplete. Off-chain data still needs an authenticated, trusted source.

The pilot validates its instruction format; the legacy verifier retains its demo parser. Collateral bounds rely on the signed-feed model. Production integration still needs hardening and external security review.

Read all known limitations

Run the product pilot ↗

Trusted setup

Fixed (partial): prove_solvency now runs the Groth16 setup with secure randomness (OsRng) instead of a fixed public seed, so the "toxic waste" is discarded, not published. This removes the trivial forgery (no one can reconstruct the waste from a known seed).

Still open (production): a Groth16 setup done by a single party still requires trusting that party not to have retained the toxic waste. For a real deployment the setup must be generated by the relying party (the verifier / LP, who has no incentive to help a fund forge), or by a multi-party ceremony, or the system must move to a transparent proof (no trusted setup). Until one of those, soundness holds against an honest prover and against an outsider, but not against a prover who also controlled the setup. A complete ceremony must cover the relevant phase-1/phase-2 parameters and verify contributions; the delta-only src/ceremony.rs experiment does not do that. The pinned iden3/snarkjs compatibility rehearsal covers the exact arkworks circuit and rejects invalid artifacts, but all rehearsal contributions are local and controlled by one operator, so it is not a production ceremony. Secret destruction cannot be proven by this demo. Setup is one of several remaining requirements, alongside the integration gaps below.

Collateral bounds

Collateral witnesses are not bounded < 2^128 in-circuit, and enforce_cmp is only sound for operands < (p-1)/2. Under an honest bounded servicer feed and an authenticated circuit/key, the intended combined model relies on the signed commitment: a prover cannot substitute an out-of-range value without changing the commitment the servicer signed. An explicit in-circuit bit-range check is deferred on purpose, it adds ~254 constraints per loan (prohibitive at 10k+ scale) for a case the intended signed-feed model covers. The legacy SBF verifier alone does not enforce that model. The pilot gate enforces the configured signer and key, while the servicer SDK recomputes the commitment from a bounded book before signing. This still trusts the servicer's actual validation and parameter provenance; the on-chain circuit has not gained explicit ranges. Revisit if the threat model excludes the signed feed.

On-chain enforcement

The legacy solana-verifier/ program accepts the verifying key, proof and public inputs from the caller. A successful pairing check therefore does not establish that an approved solvency circuit was used. A production consumer must pin or authenticate the circuit/key and enforce the intended public-input policy. The client in its legacy mode generates fresh single-party parameters on each run.

The legacy SBF program does not verify a servicer signature, enforce freshness or supply/threshold policy, or invoke an SPL token mint. src/onchain.rs checks the proof and ed25519 signature in a native host-side model. A successful local or devnet verifier transaction must not be described as a deployed fund, authenticated loan feed, KYC service or production mint gate.

The new solana-gate/ program stores an immutable approved key, configured servicer, minimum threshold and maximum validity window. It requires Solana-authenticated signer privileges, exact next sequence and fresh timestamps before verifying the proof and updating the receipt. The pilot SDK reuses persisted parameters and independently checks the private book commitment before signing. The local demo operates both signer roles itself; a real external servicer integration remains open.

Consumers must pin both program and configuration address, check ownership and current expiry, and enforce their own action policy. The gate does not use live token supply, mint SPL tokens, or prevent a consumer from repeatedly acting on one receipt. A one-time action needs a consumer-side consumed-sequence check. Policy rotation requires a new approved configuration. A public deployment also needs reviewed upgrade authority and key custody. No public deployment of this gate is claimed.

Instruction validation

Legacy verifier instruction parsing uses fixed slices and the caller's public-input count without explicit length validation. Malformed input can abort the instruction. The 128-byte size refers to the arkworks compressed proof, not the transaction: with two public inputs the current Solana instruction carries 961 bytes including uncompressed proof points, verifying-key points and scalars.

The pilot gate instead validates exact lengths, version/reserved bytes and canonical commitment scalars before using the pairing helper with a fixed two-input layout and the stored key. Its approval instruction is 332 bytes, initialization is 700 bytes and account state is 816 bytes. The two-signature demo approval transaction is 672 bytes, including a compute-budget instruction; these sizes are distinct from the compressed proof. Malformed pilot requests are covered by SBF regression tests. The standalone legacy parser remains a demonstration interface.

05 / Build with us

One real loan tape.
A useful next step.

We’re looking for one tokenized-credit protocol or fund to co-define a pilot using a test or anonymised loan tape. We offer free integration work and hands-on engineering around an authenticated servicing feed.

This is a design-partner invitation. No production customers or adoption metrics are claimed.

Discuss a pilot