Autonomous construction escrow. AI plans the milestones, verifies the evidence, releases the money.
$200 billion a year goes into construction for international development and disaster relief. Between 10% and 30% of it gets lost, to ghost invoices, fake receipts, doctored photos, milestones that never existed.
Construct fixes the spot where the money actually leaks: the decision to release it.
The funder describes a project in plain English (or Ukrainian, Arabic, Swahili — six languages). Claude generates structured milestones with literal acceptance criteria. The funder reviews, locks, and deploys, funding a smart contract on 0G in a single transaction.
The builder submits evidence as work progresses. A Trust Stack of EXIF, C2PA content credentials, and Reality Defender's deepfake detection runs before any judgement is made. Then Claude Vision reads the evidence against the criteria. If it passes, an MPC wallet — held by no single party, including Construct — autonomously signs on TurnKey the release transaction on-chain, through KeeperHubs cross-chian agent orchestration layer.
Every project gets a wrapped ENS subname on Sepolia (yourproject.construct.eth) that travels with it for life. Status, current milestone, and escrow address live in text records. When ownership changes, a charity hands a project to a successor, a contractor takes over a half-built site, the NFT transfers, the records repoint to a fresh escrow, and the work continues under the same identity. One project, one identity, multiple escrows over its life. The work survives the company.
No private key sits on our servers. No human clicks a release button on the happy path. Every fee is shown upfront, the problem Constrcut exists to solve is opacity in construction payments, so I don't get to be opaque about ours.
Stack - Solidity smart contracts (MilestoneEscrow.sol) on 0G Galileo (chain ID 16602), deployed via Hardhat with ethers v6. Express/Node.js backend (ESM, Node 25) split into agent/ (Claude orchestration), trust-stack/ (provenance verification), storage/ (0G Storage + ENS subname registry), keeperhub/ (MPC signing + ENS sync), routes/ (escrow, evidence, projects, handover, translate). React 19 + TypeScript + Vite frontend with wagmi v2, viem, and RainbowKit for wallet integration.
The pipeline - A funder writes a project description in any of six languages. Claude Sonnet (Anthropic) uses tool-use to generate structured milestones with confidence ratings (AI Verifiable / Partially Verifiable / Likely Needs Human) and literal acceptance criteria. The full spec is uploaded to 0G Storage and the content hash is baked into the escrow contract at deployment. The funder funds escrow + agent fee in one transaction from their own wallet (we never custody funds).
Trust Stack on evidence submission. Raw image buffer is preserved before sharp resizes for Claude Vision (sharp strips EXIF, so we read it from the original buffer). exifr extracts camera metadata. @trustnxt/c2pa-ts checks for content credentials. Reality Defender scores deepfake probability. A pricing oracle compares receipt totals against expected ranges. Then Claude Vision reads the image against each criterion and outputs APPROVE or ESCALATE.
Autonomous release via KeeperHub + Turnkey MPC. When Claude approves, our backend POSTs to a self-hosted KeeperHub webhook, which triggers a Turnkey MPC wallet to call completeMilestone() on 0G. The signing key is split across parties so it's never whole on any server. The contract has an onlyOwnerOrAgent modifier with the agent address set at deployment, so the MPC wallet drops in cleanly and could be swapped for ERC-4337 the day account abstraction lands on 0G. KeeperHub is self-hosted because 0G Galileo isn't on the hosted instance (as of time at development), I added it via SQL INSERT to the chains and explorer_configs tables and sent the team detailed feedback on the self-host experience.
Cross-chain ENS identity (Sepolia ↔ 0G). Every project gets a wrapped subname under construct.eth on Sepolia. The same MPC wallet that releases payment on 0G also writes ENS text records on Sepolia: escrow_address, escrow_chain, status, payee, milestone_count, current_milestone. After every milestone release on 0G, a diff-based sync writes the deltas to Sepolia. The subname is the project's PORTABLE IDENTITY, when the funder sends the NFT to a successor, records seal as handed_over, the recipient connects, the spec is recovered from 0G Storage, a fresh escrow deploys, and records repoint. One identity, multiple escrows.
Notable hacks worth mentioning.
PublicResolver approval, not NameWrapper. For wrapped ENS names, setApprovalForAll on PublicResolver is the only authorisation that propagates, NameWrapper governs NFT transfers, Registry-level approval doesn't reach the resolver for wrapped names. I diagnosed it by simulating setText via eth_call from three from addresses (user, MPC, NameWrapper) and seeing only the user succeed. Cached per-(owner, operator) in localStorage since the resolver doesn't expose isApprovedForAll as a public view.
Handover writes before NFT transfer. Sealing records as handed_over after safeTransferFrom hits a 90-second timeout, the new owner hasn't approved the resolver yet, so the MPC's writes silently fail. Reordered to write-then-transfer with hard abort on write failure.
Patched KeeperHub gas strategy. KH hardcoded a 0.1 gwei minimum priority fee, which fails on Sepolia during low base fee periods. Patched gas-strategy.ts to lower the floor to 0.000001 gwei. Submitted as feedback.
State polling over event subscription. 0G's RPC indexer lags behind block production, so I poll contract state directly after KH confirms a tx rather than trusting event logs.
Translation invariant. Six-language UI, but canonical milestone text and verification results are never mutated by translation, translation is purely display-layer, preserving audit integrity.
Partner tech benefits.
0G Storage's network-level content hashing eliminates the format-fragility problem that makes on-chain hashing impractical elsewhere, the hash is the lookup key, immutability is guaranteed by the network.
KeeperHub is what makes that wallet usable as an actual agent. We run three distinct workflows through KH, completeMilestone on 0G, wrapped subname minting on Sepolia, and setText against PublicResolver on Sepolia, each with its own chain config, contract ABI, and gas strategy. The backend fires a webhook and KH handles transaction construction, nonce management, gas, retries, and confirmation. Without it I'd have rebuilt that orchestration per chain per workflow around the Turnkey SDK directly, which for a 10-day build wasn't realistic.
ENS subnames gave us cross-chain identity without inventing one, the construct.eth namespace on Sepolia is the project's portable record across chain boundaries.
Anthropic's Claude does both the structured planning (tool use for milestones) and the verification (Vision against criteria), one model family, two jobs, consistent reasoning style across both.

