Reference integration showing how a Solana dApp (Marinade-style) consumes UZPROOF quest-completion attestations to gate loyalty tiers, airdrop eligibility, or reward badges on genuine on-chain activity.
Stack: @uzproof/verify-reader + @solana/web3.js. No API keys.
No UZPROOF account. No on-chain writes from this code.
UZPROOF writes SAS (Solana Attestation Service) attestations every time a wallet completes a verified UZPROOF quest. These attestations are permanent, portable, and cryptographically signed on Solana mainnet.
Your protocol reads them. This repo shows how, in under 30 lines of code.
UZPROOF's current Paid Claim flow writes one attestation per
quest, keyed by action = "quest_<id>". So to check "did this
wallet complete my loyalty-worthy quest?", you pass the UZPROOF
quest id:
import { hasQuestCompletion } from "@uzproof/verify-reader";
const eligible = await hasQuestCompletion(wallet, 31);See uzproof.com/docs for the current quest catalogue and what actions each quest verifies on-chain.
npm install
npm run check -- FX3Zs3jKRs8cQcjymCJRwmzwNh11PxnxSXTmLA1Dci8Q 31Output:
✅ FX3Zs3jK... completed UZPROOF quest 31
attestation: https://solscan.io/account/<attestation-pda>
protocol: DeFi
amount USD: $0.00
genuine: 87/100
verified at: 2026-04-10T14:23:00.000Z
SDK availability:
@uzproof/verify-readeris live on npm —npm install @uzproof/verify-reader @solana/web3.jsresolves against the latest published version. This example'spackage.jsonpins^0.1.4which is the currentlatesttag; all earlier 0.1.x versions are deprecated with upgrade pointers.
The minimum viable integration. One function call
(getQuestCompletion), prints an attestation reference if the wallet
completed the given UZPROOF quest.
Use in CI, snapshot pipelines, or cron jobs that filter candidate wallets.
A more realistic pattern: classify a wallet into Bronze / Silver /
Gold tier based on which UZPROOF quests it has completed. Uses
verifyBatch for cheap existence checks first, then
getQuestCompletion only for citation data on hits.
npm run tier -- FX3Zs3jKRs8cQcjymCJRwmzwNh11PxnxSXTmLA1Dci8Qimport { Connection, clusterApiUrl } from "@solana/web3.js";
import { verifyBatch } from "@uzproof/verify-reader";
// Your paid RPC for batch workloads
const conn = new Connection("https://mainnet.helius-rpc.com/?api-key=...");
// Filter a candidate list down to wallets that completed quest 42
const candidates = [/* wallet addresses */];
const verifiedMap = await verifyBatch(candidates, "quest_42", conn);
const eligible = candidates.filter((w) => verifiedMap.get(w) === true);That's the whole playbook. 3 lines for airdrop filtering, 5 lines for a loyalty tier.
- Portable credentials — your verified Marinade user arrives at Sanctum already pre-verified. Network effects favour protocols that share a reputation layer.
- No user friction — UZPROOF writes the attestation on-chain using the user's own payment (Paid Claim flow, user-signed).
- Cryptographic proof — every attestation is a signed account on SAS mainnet. Your users can verify it independently at any time.
- Anti-sybil built-in — UZPROOF runs 14 anti-sybil signals before
issuing an attestation, so
genuineScoreis meaningful.
MIT © UZPROOF
@uzproof/verify-reader— reader SDK@uzproof/verify— writer SDK (pay-per-call x402)- uzproof.com/docs — full documentation
- uzproof.com/stats — live traction metrics