From hl-design-systems
Submit zero-knowledge proofs to zkVerify using the Kurier REST API. Use when the user wants to submit proofs, verify on zkVerify, register verification keys, or interact with the zkVerify network.
npx claudepluginhub horizenlabs/hl-claude-marketplace --plugin hl-design-systemsThis skill uses the workspace's default tool permissions.
Help the user submit their generated proofs to zkVerify for on-chain verification using the Kurier REST API.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Performs token-optimized structural code search using tree-sitter AST parsing to discover symbols, outline files, and unfold code without reading full files.
Help the user submit their generated proofs to zkVerify for on-chain verification using the Kurier REST API.
If invoked with an argument (e.g., /groth16-submit testnet), use it as the network.
| Argument | Network | API Base URL |
|---|---|---|
testnet | Volta Testnet | https://api-testnet.kurier.xyz |
mainnet | zkVerify Mainnet | https://api.kurier.xyz |
If no argument provided, ask the user which network they want to use.
Before doing anything else, verify the .env file exists:
ls -la .env 2>/dev/null && echo "Found .env" || echo "ERROR: .env not found"
| Check | If Missing |
|---|---|
.env file | STOP - User must create it with API key (see Setup below) |
proofs/proof.json | Run /groth16-prove first |
proofs/public.json | Run /groth16-prove first |
build/verification_key.json | Run /groth16-compile first |
IMPORTANT: Do NOT read the contents of .env - it contains sensitive credentials.
If .env does not exist, tell the user to create it and do not proceed.
This skill submits Groth16 proofs to zkVerify blockchain using the Kurier REST API.
What this covers:
Prerequisites:
/groth16-prove (proofs/proof.json, proofs/public.json)build/verification_key.json)npm install axios dotenv
If using TypeScript:
npm install axios dotenv typescript ts-node @types/node
The user must create a .env file:
# Your Kurier API key
API_KEY="your-api-key-here"
Important: Ensure .env is in .gitignore to avoid committing credentials.
| Network | Sign Up URL |
|---|---|
| Testnet | https://testnet.kurier.xyz |
| Mainnet | https://kurier.xyz |
npx ts-node src/submit.ts testnet register-vk
# Save the vkHash for future submissions
# To testnet
npx ts-node src/submit.ts testnet submit
# To mainnet
npx ts-node src/submit.ts mainnet submit
After submission, you'll receive a job ID and can track status through the API. Once finalized, view on explorer:
https://zkverify-testnet.subscan.io/https://zkverify.subscan.io/Submit proof with full verification key:
npx ts-node src/submit.ts testnet submit
Register VK once:
npx ts-node src/submit.ts testnet register-vk
# Save the vkHash from the response
Submit with registered VK (more efficient):
npx ts-node src/submit.ts testnet submit --vk-hash=0x123abc...
For aggregation to settlement layers, include a chainId:
# Sepolia (chainId: 11155111)
npx ts-node src/submit.ts testnet submit --chain-id=11155111
# Base Sepolia (chainId: 84532)
npx ts-node src/submit.ts testnet submit --chain-id=84532
IMPORTANT: All endpoints require the /api/v1/ prefix (not shown in some older docs).
| Endpoint | Method | Purpose |
|---|---|---|
/api/v1/register-vk/{API_KEY} | POST | Register verification key |
/api/v1/submit-proof/{API_KEY} | POST | Submit proof for verification |
/api/v1/job-status/{API_KEY}/{jobId} | GET | Check proof status |
Register VK:
{
proofType: "groth16",
proofOptions: {
library: "snarkjs",
curve: "bn128"
},
vk: verificationKeyObject
}
Submit Proof (with full VK):
{
proofType: "groth16",
vkRegistered: false,
proofOptions: {
library: "snarkjs",
curve: "bn128"
},
proofData: {
proof: proofObject,
publicSignals: publicSignalsArray,
vk: verificationKeyObject
}
}
Submit Proof (with registered vkHash):
{
proofType: "groth16",
vkRegistered: true,
proofOptions: {
library: "snarkjs",
curve: "bn128"
},
proofData: {
proof: proofObject,
publicSignals: publicSignalsArray,
vk: "0xvkHash..." // The vkHash string, not the full VK
}
}
| Status | Description |
|---|---|
Queued | Proof is queued for processing |
Valid | Proof passed optimistic verification |
Submitted | Transaction submitted to zkVerify |
IncludedInBlock | Transaction included in a block |
Finalized | Transaction finalized on chain |
Failed | Verification failed |
AggregationPending | Waiting for aggregation (with chainId) |
Aggregated | Proof aggregated (with chainId) |
AggregationPublished | Aggregation published to settlement layer |
.env file exists with valid API_KEYproofs/proof.json, proofs/public.json)build/verification_key.json)