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.
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.
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.
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.
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.
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.
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.
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.
Path 1 — try it in 2 minutes
- 1. Select "Capability Smoke Test" in the campaign picker below
- 2. Connect any Wallet A (even brand new) — generate pass
- 3. Connect any Wallet B (even empty) — claim, gas-sponsored
- 4. Verify on-chain
Path 2 — the real predicate, optional reward
- 1. Shield some STRK once, in Ready or Braavos, into the live pool
- 2. Come back and select a real campaign (e.g. "STRK Welcome Reward")
- 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.
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.
3. Connect a different wallet, claim
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.
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.
Real mainnet activity, not a testnet screenshot
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