On-chain escrow and open credit data for humans and agents
Every escrow transaction writes open credit data on-chain — permissionless, portable, and readable by any protocol. Build your own scoring model or use ours.
import { escrowFetch } from "xenga";const { payment } = await escrowFetch("https://merchant.xyz/api/order/981/pay",{ method: "POST", body: JSON.stringify(order) },{ walletClient });// payment.escrowId + payment.txHash
From Payment to Credit Data
Sequence: payment negotiation, typed-data signature, and escrow settlement all visible in the protocol inspector.
Choose Your Demo Path
Test interactive and autonomous escrow flows with real protocol events on Base Sepolia.
Open Credit Data
Every escrow outcome is recorded on-chain as raw stats — permissionless and portable. Any protocol can read the data and compute scores their own way.
Raw On-Chain Data
Stored per address in EscrowVault. Readable by anyone — getSellerStats(addr) / getBuyerStats(addr).
Example: Marketplace Scoring
Weight completion and dispute history for buyer-seller trust. One possible interpretation.
Example: Lending Protocol
Same on-chain data, different formula. Lenders can weight volume and repayment differently.
Add escrow payments in minutes
Two SDK calls — client and server. The rest is handled on-chain.
// Automatic escrow payment flowconst { payment } = await escrowFetch("https://api.example.com/order/123/pay",{ method: "POST" },{ walletClient });// payment.txHash — on-chain escrow// payment.escrowId — escrow ID
Built to Fit Your Stack
Drop-in escrow infrastructure for any framework. Use built-in service types or define your own.
Marketplaces & Freelance
7-day default. High-trust pairs settle in 3 days.
Agent & API Commerce
1-hour auto-release. Quality checks trigger disputes automatically.
Custom Use Cases
SaaS billing, lending protocols, insurance — any system that needs trust.
// Next.js Route Handler — same core, different frameworkexport async function POST(request: Request,{ params }: { params: Promise<{ id: string }> }) {const { id } = await params;const result = await handleEscrowPayment(request, { id }, deps);return toNextResponse(result);}