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.solDecisionRegistry.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 equalpolicyHash.publicSignals[1]must equalcontextId(numeric context selector).publicSignals[2]must equaldecision(numeric decision encoding).
Context IDs
0->allowlist.general1->comment2->publish3->apply4->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.solwith the Groth16 verifier generated by snarkjs. - Ensure the circuit’s public signal layout matches
publicSignalsordering above. contextmust be encoded asbytes32(uint256(contextId))when submitting on-chain.policyHashmust be reduced into the BN254 field (value < r).
Generate Verifier (snarkjs)
snarkjs zkey export solidityverifier circuit_final.zkey Verifier.sol