Skip to main content
Version: 0.1.0

ZK Contracts

This page documents the on-chain contracts for ZK-based decisions and how to submit proofs on Base.

Status

Contracts are deployed on Base mainnet (8453).

Contracts

  • Verifier.sol
  • DecisionRegistry.sol

Base Mainnet (8453)

  • Verifier: 0x708FB78d97b32250e302F33A1A81936C8B618625
  • DecisionRegistry (Proxy): 0x694A54Bf1b7659e8A7e63CD8a45de378458659D8
Resubmission

The DecisionRegistry allows resubmission — calling submitDecision for the same subject + context will overwrite the existing record with the updated decision and proof.

ABI & Types

TypeScript ABI modules live in packages/contracts/abi. Inside other packages you can import them via the workspace alias:

import { VERIFIER_ABI, DECISION_REGISTRY_ABI } from "@basecred/contracts/abi";

Each export includes a readonly tuple plus a typed alias (Groth16VerifierAbi, DecisionRegistryAbi).

DecisionRegistry Interface

Function signature:

function submitDecision(
bytes32 subjectHash,
bytes32 context,
uint8 decision,
bytes32 policyHash,
uint256[2] a,
uint256[2][2] b,
uint256[2] c,
uint256[3] publicSignals
) external

Event:

event DecisionSubmitted(
bytes32 indexed subjectHash,
bytes32 indexed context,
uint8 decision,
bytes32 policyHash,
uint64 timestamp
);

Public Signals

  • publicSignals[0] must equal policyHash.
  • publicSignals[1] must equal contextId (numeric context selector).
  • publicSignals[2] must equal decision (numeric decision encoding).

Context IDs

  • 0 -> allowlist.general
  • 1 -> comment
  • 2 -> publish
  • 3 -> apply
  • 4 -> governance.vote

Example Transaction Payload

{
"subjectHash": "0x<bytes32>",
"context": "0x<bytes32(contextId)>",
"decision": 1,
"policyHash": "0x<bytes32>",
"a": ["0x...", "0x..."],
"b": [["0x...", "0x..."], ["0x...", "0x..."]],
"c": ["0x...", "0x..."],
"publicSignals": ["0x<policyHash>", "0x<contextId>", "0x<decision>"]
}

Notes

  • Replace the placeholder Verifier.sol with the Groth16 verifier generated by snarkjs.
  • Ensure the circuit’s public signal layout matches publicSignals ordering above.
  • context must be encoded as bytes32(uint256(contextId)) when submitting on-chain.
  • policyHash must be reduced into the BN254 field (value < r).

Generate Verifier (snarkjs)

snarkjs zkey export solidityverifier circuit_final.zkey Verifier.sol