Provah

Provable STRK20 activity,an unlinkable capability anyone can redeem.

Provah checks something about a wallet's STRK20 activity, then issues a one-time capability you can hand to any wallet to redeem. Gas-sponsored, and nothing on-chain links the two.

Wallet Aproves eligibility
Capabilityone-time, bearer
Wallet Bclaims it, zero gas

No on-chain link, no shared address, no Provah-stored mapping between A and B. The capability itself is the only thing that crosses between them.

The problem

Private state, alone, doesn't do anything.

STRK20 shields balances and transfers on Starknet. But privacy that only sits there isn't useful by itself. The moment you try to act on it (claim a reward, prove you qualify, unlock access) you either reveal the wallet behind it, or build a bespoke proof system for that one case. Neither approach scales past a single app.

Provah is the layer in between: it turns a provable fact about a wallet's activity into a capability that acts on-chain, from a wallet with no relationship to the one that qualified for it.

Without Provah: acting on private state means revealing the wallet, or building a one-off proof system per app.

With Provah: the fact becomes a portable capability. Any wallet can redeem it, with zero on-chain link back to the source.

How it works

One primitive, three steps

The same flow works for any rule you can evaluate against public chain data. This is a capability layer, not a single campaign.

01

Prove it

Connect the wallet with the STRK20 activity that matters. Provah checks a rule (held for N days, above a threshold, deposit count) against public pool data. Your private note state is never touched.

02

Get a capability

Provah signs a one-time capability bound to a fresh nullifier and hands it to you as a bearer token, not to your wallet. Leave it a pure bearer, or lock it to one destination wallet up front — your choice, enforced before Provah ever signs a claim.

03

Redeem anywhere

Hand the token to any wallet: brand new, unfunded, or someone else entirely. They claim it, gas-sponsored. The chain records only campaign, nullifier, and recipient, nothing about you, and anyone can verify the claim landed straight from public RPC, without trusting Provah's word for it.

No on-chain link, ever: the capability is the only thing that crosses between the qualifying wallet and the claiming wallet.
Live product

This is a real, working app

Five live campaigns, real mainnet transactions, a gas-sponsored claim from any wallet. One campaign needs no prior STRK20 activity at all — pick your path below.

No deposit needed

Path 1 — try it in 2 minutes

  1. 1. Select "Capability Smoke Test" in the campaign picker below
  2. 2. Connect any Wallet A (even brand new) — generate pass
  3. 3. Connect any Wallet B (even empty) — claim, gas-sponsored
  4. 4. Verify on-chain
Real STRK20 eligibility

Path 2 — the real predicate, optional reward

  1. 1. Shield some STRK once, in Ready or Braavos, into the live pool
  2. 2. Come back and select a real campaign (e.g. "STRK Welcome Reward")
  3. 3. Same generate → claim → verify flow — the reward campaign also pays real STRK

Private balance turns into a bearer capability , redeemed by any wallet, unlinked.

Wallet Aprivate holder
Provah Passbearer capability
Wallet Bfresh, zero gas

No on-chain link, no shared address, no Provah-stored mapping between A and B. The pass itself is the only thing that crosses between them.

1. Pick a campaign

2. Connect the wallet with qualifying pool activity, generate a pass

Provah checks this wallet's public STRK20 deposit history against the campaign's rule. It never sees a private key or viewing key — but generating a pass does ask this wallet to sign a message proving you control it, before Provah reads anything.

none

3. Connect a different wallet, claim

none

Redeem a pass someone gave you

A Provah pass is a bearer token. Paste one below (from a friend, a Discord DM, a QR code, anywhere) and claim it from any wallet, without ever having generated it yourself.

none
Features

Built as a primitive, not a demo

Multiple rule types

Held for N days, above a threshold, or deposit count: pluggable rules against the same deployed contract, zero redeploys.

Cross-wallet claims

Generate from one wallet, claim from a completely different one, funded or brand new, by design.

Transferable capabilities

A pass is a literal token: copy it, DM it, put it in a QR code. Redeemable by anyone, from anywhere.

One-time nullifiers

Every pass consumes a fresh nullifier on-chain. Reuse is provably impossible: verify it yourself with is_nullifier_consumed.

Gas-sponsored claims

The claiming wallet needs zero STRK. Provah's operating account relays the transaction.

Honest trust boundary

The rule is checked by a signed attestation today, not yet a client-side ZK proof, and we say exactly why, with on-chain evidence.

Built on Starknet · STRK20

Real mainnet activity, not a testnet screenshot

15
Confirmed mainnet transactions (11 ProvaPass + 4 direct STRK20 pool txs)
5
Live campaigns, one open-access, one pays a real STRK reward
1
Contract, zero redeploys between them

Contract 0x7461…b402. See strk20.json for the full, machine-readable list.

Honest note: the rule check itself is a signed server attestation today, not a client-side ZK proof. The mainnet proving service the fully trustless version needs has no published endpoint. See "The attester today" for the on-chain proof of why, and exactly what changes when it's reachable.

Provable STRK20 activity in. Unlinkable capability out.

Consumed exactly once, from anywhere. Try the whole flow yourself: it takes under two minutes and it's real mainnet, not a testnet fork.

Try the live demo