onchain reputation, made legible

From zero to
integrated.

Everything you need to read PROOF passports, integrate them into your protocol, or contribute to the model. Start at the top or jump to what you need.

Introduction

PROOF turns a wallet's onchain history into a single, portable reputation score. Instead of every protocol re-asking "who are you?" with a KYC form, they can ask PROOF — and get back a score grounded entirely in public chain data.

This is a demonstration project. The API responses are mocked, the scoring model is illustrative, and no protocol is integrating with PROOF in production. If you want to see what a real reputation primitive looks like in production, check out Gitcoin Passport, Karma3Labs, or Galxe.

⌘ Demo notice

Everything on this site is for demonstration purposes. Don't pass real user data to anything you find here.

Quickstart — 90 seconds

The fastest way to feel out PROOF is to score a wallet you already know.

01

Make your first request

No API key required during preview. Replace the address with one you want to inspect.

bash
curl https://api.proof.demo/v1/passport/0x7a3f...e2c1
02

Read the response

You'll get back a JSON object with a score (0–1000), a tier (trusted / verified / neutral / risky), and a dimensions object scoring each of the six axes.

03

Gate something

The most common pattern is to gate a feature by tier. Block risky, prompt extra steps for neutral, let verified and trusted through.

Core concepts

Passport

A passport is the full document for a single wallet — score, tier, dimension breakdown, metrics, flags, and credentials. It's computed lazily on first request and cached for 24 hours unless refresh=true is passed.

Score

A single integer between 0 and 1000. Computed as a weighted sum of six normalized dimensions. The score is deterministic — the same chain state always produces the same score for the same model version.

Tier

A categorical bucket the score falls into: trusted (700+), verified (500–699), neutral (250–499), risky (under 250). Tiers are designed to be stable across minor model versions; gate on tier rather than raw score if you want fewer breaking changes.

Flags

Discrete risk signals attached to a wallet — sanctioned counterparty, mixer interaction, drainer victim, etc. Flags lower the Risk-free dimension and can also be queried directly via /flags/:address.

Credentials

Positive attestations — "DAO voter", "LP provider", "OG wallet (2017)". Earned automatically based on chain history. Not weighted into the score directly — they're a human-readable summary of what the wallet has done.

Frontend gating

The most common integration is gating a UI feature based on a connected wallet's tier. Here's a minimal example using fetch:

javascript
async function checkAccess(address) {
  const res = await fetch(
    `https://api.proof.demo/v1/tier/${address}`
  );
  const tier = await res.text();

  if (tier === 'risky') {
    return { allowed: false, reason: 'Wallet flagged' };
  }
  if (tier === 'neutral') {
    return { allowed: true, requireExtraStep: true };
  }
  return { allowed: true };
}

Cache the response on your end — passports update on a 24h cadence by default, so there's no benefit to re-fetching on every page load.

Smart contracts

Reading PROOF on-chain requires an oracle, since the score itself lives off-chain. We're working on a Chainlink Functions integration; in the meantime, you can use a signed attestation pattern:

solidity
contract GatedVault {
  address public proofSigner;

  function deposit(
    uint256 amount,
    uint256 score,
    uint256 expiry,
    bytes calldata sig
  ) external {
    require(score >= 500, "insufficient score");
    require(block.timestamp < expiry, "attestation expired");
    _verifySignature(msg.sender, score, expiry, sig);
    // ... deposit logic
  }
}

The user fetches a signed attestation from PROOF, then passes it into the contract along with their action. The contract verifies the signer and the freshness, then enforces whatever threshold makes sense.

Webhooks

Subscribe to changes on a list of wallets and get notified when their score crosses a tier boundary. Useful for monitoring an allowlist over time.

Available events: tier.changed, flag.added, flag.removed, credential.earned. Configure via the dashboard or POST /v1/webhooks.

⌘ Coming soon

Webhook delivery is not implemented in the demo. The endpoint shape and event types are sketched here for design feedback.

FAQ

Why don't you use KYC?
KYC binds a wallet to a real-world identity. PROOF deliberately doesn't — we want a reputation that any wallet can earn through its own onchain behavior, without trusting a single jurisdiction or document-verification vendor. The trade-off is that PROOF can't tell you who is behind a wallet, only what that wallet has done.
Can someone game the score by airdrop-farming?
Partially. Airdrop farmers tend to score well on Activity and Diversity but poorly on History, Governance, and held-position duration. The weighted sum and time-discounting in the model mean a freshly farmed wallet typically lands in the Neutral tier rather than Trusted.
What chains do you index?
In the demo: 9 EVM chains. A real version would prioritize Ethereum, Arbitrum, Optimism, Base, Polygon, and BNB Chain first, then expand. Non-EVM chains (Solana, Cosmos, Bitcoin) would each need their own indexer and signal definitions.
How are risk flags determined?
A real version would combine the public OFAC sanctioned-address list, known mixer contract addresses (Tornado Cash and similar), drainer-contract registries maintained by security firms, and exploit-linked wallets tracked by Chainalysis-style services. False positives are a real concern — direct flags should be appealable.
Is this open source?
The scoring model would be — that's the whole point of "made legible". The indexing infrastructure and the risk databases would likely not be, since they require ongoing investment to maintain.
Why is the model only at v0.4.2?
Because this is a demo. Real reputation systems should ship slowly. Every weight change moves money and access for the wallets gated on the score; that's a higher bar than "it ships now".

Changelog

v0.4.2

2026-05-12 · Risk floor recalibration

Adjusted the multiplicative penalty for direct OFAC matches. Slight downward shift across affected wallets; no Trusted-tier wallets affected.

v0.4.0

2026-04-18 · Mixer detection expanded

Added 14 newly-identified mixer contracts to the watchlist. Affects roughly 0.2% of indexed wallets.

v0.3.0

2026-03-02 · Governance rebalance

Reduced Governance weight from 0.15 to 0.10 to better reflect how few real users participate in DAO voting.