Skip to main content
PSR (Provable Stealth Reputation) lets issuers attest facts about a stealth identity without learning the recipient’s public address. Recipients discover traits via their scanner and prove them with zero-knowledge.

V2 model

On-chain objectPurpose
SchemaDefines attestation fields (bool passed, u64 score), revocability, optional resolver
AttestationBinds field values to a stealth_address_hash (32-byte commitment)
AnnouncementOptional discovery marker so the recipient’s WASM scanner finds the trait
Schemas and attestations return chain-neutral SchemaV2 / AttestationV2 shapes from both Ethereum and Solana.

Issuer flow

Recipient flow

Recipient formats

issueAttestation accepts:
FormatExampleAnnounce?
66-byte meta-address0x + 132 hex charsYes (default)
20-byte stealth addressEVM addressResolves to hash
32-byte hashstealth_address_hashNo ephemeral key, announce skipped

Action scopes and nullifiers

Proofs are scoped to a specific action via externalNullifier:
import { buildActionScope, externalNullifierFromScope } from "@opaquecash/opaque";

const scope = buildActionScope({
  chainId: 11155111,
  module: "my-dapp",
  actionId: "gate-v1",
});
const externalNullifier = externalNullifierFromScope(scope);
The same trait + scope can only be verified once (nullifier consumed on-chain).