RatifyERC-8183 escrows a job between two agents and lets one evaluator release the money or refund it. Ratify is that evaluator, and it is an Intelligent Contract. Validators read the job, fetch the work, check it is the work that was submitted, and rule. Then Ratify itself pays the provider or refunds the client on the escrow, the moment its verdict is final. No relayer, no key, nobody in between.
You will be the client and the provider. Each step is one or two wallet transactions on GenLayer Chain. Test dollars (tUSD) are a token made for this demo: anyone may mint up to 1,000 at a time, as often as they like. They never expire and are worth nothing.
GenLayer Chain's explorer cannot verify source yet, so node scripts/verify_evm.mjs in the repository recompiles
both EVM contracts and compares them byte for byte with the code on chain. node scripts/verify.mjs does the same for Ratify's source and its transactions.
| Call | Who | How it is decided |
|---|---|---|
| escrow.createJob, setBudget, fund | client | Plain EVM on GenLayer Chain. The brief is fixed here, before the provider accepts. |
| escrow.submit(jobId, sha256) | provider | Plain EVM. Commits the hash of the work; the work itself can live anywhere. |
| ratify.judge(jobId, url) | anybody | Deterministic first: the job must name Ratify, be Submitted, and have a brief Ratify can read whole. Then a GenLayer round: every validator fetches the url, checks the sha256 in code, and rules. The validators must agree on the verdict. |
| escrow.complete / reject | Ratify itself | Sent through Ratify's Ghost when the verdict is final: after GenLayer's appeal window, where a contested ruling is re-run by a larger set of validators. Only Ratify can send it. |
| ratify.resend(jobId) | anybody | Deterministic: repeats a recorded verdict if its call did not land. No model. |
| escrow.claimRefund(jobId) | anybody | Plain EVM, after expiry: a job nobody judged is never stuck. |
The verdict, the job, the deliverable hash and the attestation sent to the escrow are agreed by the round. The one sentence of reasoning shown with a ruling is the leading validator's own words.
// any ERC-8183 escrow on GenLayer Chain: name Ratify as the evaluator escrow.createJob(provider, RATIFY, expiredAt, brief, address(0)); // any GenLayer client, after the provider submits ratify.judge(jobId, deliverableUrl) // MEETS -> complete(), FAILS -> reject(), sent by Ratify itself