ZK Escrow Explorer

A live demo of the Pigfox zk-escrow contracts on Base Sepolia. Funds are released either by a Groth16 zero-knowledge proof of a delivery secret, or — when delivery is contested — by an AI arbiter whose ruling and full reasoning are written to the chain.

BaseBase Sepolia · testnet only

Everything below is live and readable without a wallet — connect one only to send a transaction.

Proxy 0x4421…9774 · Implementation 0x22c9…1b8A · Verifier 0x20B9…5825 · Source on GitHub

Watch: 30 seconds

Live on chain

  • Escrows14
  • Contract balance0.0018 ETH
  • Pending withdrawals0.001 ETH
  • Block45525025

Funds are never pushed. Every settlement credits a pull-payment balance the payee withdraws themselves, so the contract's ETH balance covers the total pending withdrawals, plus anything still held in an open escrow.


Escrows

Every escrow this contract has created, oldest first. Expand a row for its commitment and its full evidence timeline.
#StateAmountBuyerSellerArbiterDetails
0 Released 0.001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
1 Resolved 0.001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
2 Disputed 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
3 Created 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
4 Funded 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
5 Disputed 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
6 Funded 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
7 Disputed 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
8 Funded 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE
9 Disputed 0.0001 ETH 0xe2DA…c03E 0xfEe5…6eEb 0x97eC…32aE

Interact

Everything above is readable without a wallet. To send a transaction, connect one — it signs and broadcasts on your machine. Pigfox never holds, receives, or proxies a private key.

Not connected.

Create an escrow

The commitment is Poseidon(secret). Derive it locally with scripts/poseidon.js — the secret never leaves your machine, and you will need it again to generate the release proof. You become the buyer; the three addresses must all differ.

Fund an escrow

The exact amount is read back from the chain, so the value sent always matches to the wei. Buyer only, and only while the escrow is Created.

Release with a proof

Anyone may send this transaction: the proof authorises the release, not the sender, and it is bound to this one escrow by the nullifier. Generate all of it with scripts/prove.sh <secret> <escrowId>.

Refund the buyer

Seller only, and only while the escrow is Funded.

Raise a dispute

Buyer or seller, on a Funded escrow. This text is emitted on chain in the clear and is what the AI arbiter reads — and what anyone else can read too.

Submit further evidence

Buyer or seller, on a Disputed escrow. Also emitted on chain in the clear.

Withdraw your balance

Settlements are never pushed to you. Every outcome credits a pull-payment balance that you withdraw yourself.

Connect a wallet to see your balance.

Every check on this panel is UX only — the contract enforces all of it regardless of what this page allows. There is deliberately no resolveDispute action here: disputes are settled by the AI arbiter agent, and its rulings appear in the escrow timelines above.


Recovery story

This happened on the retired v1 deployment (0x8bB2…8A84), not on the contract above. That proxy is still on chain and still holds every transaction described here — but none of these numbers belong to the deployment this page reads. It is kept because it is the honest record of how the contract behaved under real traffic.

An earlier run assigned several disputes an arbiter address that had no private key anywhere — a keyless arbiter can never call resolveDispute, so nine escrows sat stranded in Disputed, their funds frozen (though never at risk: a settlement can only ever pay the buyer or seller).

The fix used the one authority still keyed — the contract owner. A V2 implementation (0x1cB2…1637) was deployed and that proxy upgraded to it via UUPS upgradeToAndCall, adding a single owner-only setArbiter scoped to a disputed escrow; the storage layout is byte-identical to V1. All nine arbiters were then rotated to a fresh keyed address — one rotation on-chain.

With the arbiter keyed and funded, the AI agent settled all nine: it read each dispute's evidence, ruled, and wrote both the ruling and its full reasoning to the chain — one settlement on-chain. Every one now reads Resolved.


About this demo

Testnet only. These contracts hold Base Sepolia test ETH, which has no monetary value, and the circuit's trusted setup is demo-grade — it was generated for this demo and is not a ceremony anyone should rely on.

Pigfox never holds, receives, or proxies a private key. This page reads the chain and nothing more; anything that changes state is signed by your own wallet.

What the AI arbiter is and is not trusted with is written out in full in the trust model. A commitment is Poseidon(secret), derived locally by scripts/poseidon.js — the secret itself never leaves your machine.