Developer Studio
Design your own ZKNative use case
Configure a custom privacy-preserving app, preview the full flow, and export the config, route, and contract checklist needed to integrate it into ZKNative.
Core Identity
Contract Surface
Signal Labels & Outcomes
Metrics
Scenarios
Actions
Proof Checklist & Technical Notes
Card Preview
Private Bounty Claims
Let builders claim milestones or rewards without exposing which allowlisted contributor wallet qualified.
Proof System
Groth16 / BN254
Nullifier Scope
Per user, per campaign
Same verifier, new business logic. Only the consumer contract and circuit semantics change.
Studio Preview →Export JSON
{
"slug": "private-bounties",
"href": "/private-bounties",
"navLabel": "Bounties",
"icon": "🧪",
"eyebrow": "Custom Privacy App",
"title": "Private Bounty Claims",
"shortTitle": "Bounties",
"description": "Let builders claim milestones or rewards without exposing which allowlisted contributor wallet qualified.",
"privacyPromise": "The contract learns only the campaign and claim type while the proving wallet stays hidden behind a Merkle membership proof and campaign-scoped nullifier.",
"contractCall": "PrivateBounty.claimBounty(campaignId, claimType, proof, publicSignals)",
"contractSummary": "The consumer contract checks the campaign root, enforces one claim per nullifier, and releases the reward only after ZKNativeVerifier accepts the proof.",
"scenarioLabel": "Campaign",
"contextLabel": "campaignId",
"actionLabel": "claimType",
"proofButtonLabel": "Generate Custom Proof",
"submitButtonLabel": "Execute Custom Use Case",
"successTitle": "Custom use case executed",
"successDescription": "Your draft flow completed and is ready to export into a real ZKNative integration.",
"successLinkHref": "/use-cases",
"successLinkLabel": "Return to Studio",
"benchmark": "Same verifier, new business logic. Only the consumer contract and circuit semantics change.",
"metrics": [
{
"label": "Proof System",
"value": "Groth16 / BN254"
},
{
"label": "Nullifier Scope",
"value": "Per user, per campaign"
},
{
"label": "On-Chain Action",
"value": "Claim gated reward"
},
{
"label": "Verifier Path",
"value": "Solidity -> PVM Rust"
}
],
"actionOptions": [
{
"code": 0,
"label": "Milestone A",
"description": "Redeem the first claim type privately."
},
{
"code": 1,
"label": "Milestone B",
"description": "Claim a larger reward without revealing the proving wallet."
}
],
"scenarios": [
{
"id": "season-1",
"label": "Season 1",
"summary": "Launch campaign with a gated contributor reward pool.",
"contextValue": 1,
"settlement": "One private claim is released for this campaign."
},
{
"id": "season-2",
"label": "Season 2",
"summary": "Follow-up program with a separate nullifier scope and allowlist root.",
"contextValue": 2,
"settlement": "A distinct campaign can settle without replaying previous proofs."
}
],
"proofChecklist": [
"Prove allowlist membership for the campaign.",
"Bind the proof to a custom context-specific nullifier.",
"Reveal only the action type needed for settlement."
],
"technicalHighlights": [
"Keep the public signal layout aligned with your consumer contract checks.",
"Reuse ZKNativeVerifier for any Groth16-compatible flow that needs roots and nullifiers.",
"Let business logic evolve in Solidity while the heavy verification runs in native Rust."
]
}Export TypeScript
import type { UseCaseConfig } from '@/lib/use-cases';
export const customUseCase: UseCaseConfig = {
"slug": "private-bounties",
"href": "/private-bounties",
"navLabel": "Bounties",
"icon": "🧪",
"eyebrow": "Custom Privacy App",
"title": "Private Bounty Claims",
"shortTitle": "Bounties",
"description": "Let builders claim milestones or rewards without exposing which allowlisted contributor wallet qualified.",
"privacyPromise": "The contract learns only the campaign and claim type while the proving wallet stays hidden behind a Merkle membership proof and campaign-scoped nullifier.",
"contractCall": "PrivateBounty.claimBounty(campaignId, claimType, proof, publicSignals)",
"contractSummary": "The consumer contract checks the campaign root, enforces one claim per nullifier, and releases the reward only after ZKNativeVerifier accepts the proof.",
"scenarioLabel": "Campaign",
"contextLabel": "campaignId",
"actionLabel": "claimType",
"proofButtonLabel": "Generate Custom Proof",
"submitButtonLabel": "Execute Custom Use Case",
"successTitle": "Custom use case executed",
"successDescription": "Your draft flow completed and is ready to export into a real ZKNative integration.",
"successLinkHref": "/use-cases",
"successLinkLabel": "Return to Studio",
"benchmark": "Same verifier, new business logic. Only the consumer contract and circuit semantics change.",
"metrics": [
{
"label": "Proof System",
"value": "Groth16 / BN254"
},
{
"label": "Nullifier Scope",
"value": "Per user, per campaign"
},
{
"label": "On-Chain Action",
"value": "Claim gated reward"
},
{
"label": "Verifier Path",
"value": "Solidity -> PVM Rust"
}
],
"actionOptions": [
{
"code": 0,
"label": "Milestone A",
"description": "Redeem the first claim type privately."
},
{
"code": 1,
"label": "Milestone B",
"description": "Claim a larger reward without revealing the proving wallet."
}
],
"scenarios": [
{
"id": "season-1",
"label": "Season 1",
"summary": "Launch campaign with a gated contributor reward pool.",
"contextValue": 1,
"settlement": "One private claim is released for this campaign."
},
{
"id": "season-2",
"label": "Season 2",
"summary": "Follow-up program with a separate nullifier scope and allowlist root.",
"contextValue": 2,
"settlement": "A distinct campaign can settle without replaying previous proofs."
}
],
"proofChecklist": [
"Prove allowlist membership for the campaign.",
"Bind the proof to a custom context-specific nullifier.",
"Reveal only the action type needed for settlement."
],
"technicalHighlights": [
"Keep the public signal layout aligned with your consumer contract checks.",
"Reuse ZKNativeVerifier for any Groth16-compatible flow that needs roots and nullifiers.",
"Let business logic evolve in Solidity while the heavy verification runs in native Rust."
]
};
Export Route File
import { UseCaseDemo } from '@/components/use-case-demo';
import { customUseCase } from '@/lib/custom-use-case';
export default function BountiesPage() {
return <UseCaseDemo config={customUseCase} />;
}
Integration Guide
1. Consumer contract: Implement PrivateBounty.claimBounty and verify these checks before calling ZKNativeVerifier: - publicSignals[0] matches the active Merkle root - publicSignals[1] nullifier has not been used - publicSignals[2] matches campaignId - publicSignals[3] matches claimType 2. Circuit design: - Private inputs: secret, wallet identity, Merkle path - Public inputs: merkleRoot, nullifier, campaignId, claimType - Nullifier recipe: Poseidon(secret, campaignId) 3. Frontend route: - Mount UseCase with your exported config - Proof generation with snarkjs.fullProve - Point submission to PrivateBounty.claimBounty(campaignId, claimType, proof, publicSignals)
Live Preview
Run the full custom flow before you export it
Custom Privacy App
Private Bounty Claims
Let builders claim milestones or rewards without exposing which allowlisted contributor wallet qualified.
The contract learns only the campaign and claim type while the proving wallet stays hidden behind a Merkle membership proof and campaign-scoped nullifier.
Proof System
Groth16 / BN254
Nullifier Scope
Per user, per campaign
On-Chain Action
Claim gated reward
Verifier Path
Solidity -> PVM Rust
Step 1: Connect Eligible Identity
Connect a wallet, then generate a proof that you belong to the right allowlist without revealing which address qualified.
Current Signal Preview
publicSignals[0] · merkleRoot
0x47c93c0631370dc42aef07263822d0f4a83562d6046ade1c0a1c13de21fdfc84publicSignals[1] · nullifier
0x5676770f2562f73e08f34b75bb46dda8fcf7955bc670e03ac7f60649abdd575cpublicSignals[2] · campaignId
1publicSignals[3] · claimType
0