{"criteria_id":"settlement-evidence/v1","criteria_family":"settlement-evidence/v1","version":"1.0.0","corpus":{"id":"settlement-evidence-corpus/v1","sha256":"31adfeff91395e8f8a0ef01a8a1f1cb1e9cc8cedfafbe30a16d0fdd4cadc7568"},"corpus_pin_definition":"The corpus pin is the SHA-256 of the corpus's canonical serialization (the corpus object excluding its sha256 field), computed and verifiable by the published harness (harness.mjs).","network":"solana-mainnet","asset":{"mint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v","symbol":"USDC","decimals":6},"price":{"usdc_units_per_call":10000,"label":"$0.01","basis":"per lookup"},"free_tier":{"per_day":100,"min_interval_ms":5000,"on_exhaustion":"402"},"input":{"body":"One JSON request body: { signature, expected: { payTo, amountUnits, tokenAccount?, memo? }, caller? (free pre-check only) }.","signature":"Required base58 Solana transaction signature (64-byte signature). A malformed signature is a free validation refusal.","payTo":"Required recipient wallet (base58 pubkey).","amountUnits":"Required expected amount in USDC micro-units (positive integer, u64). Compared EXACTLY — u64 equality, never >=.","tokenAccount":"Optional expected destination token account. When absent, the destination graded is the payTo wallet's USDC associated token account, derived with the fleet PDA derivation.","memo":"Optional expected SPL Memo program instruction text, graded exactly when supplied.","over_cap":"A request body over 262,144 bytes is a free pre-gate refusal naming the cap."},"verdicts":["SETTLED-MATCH","SETTLED-MISMATCH","NOT-FOUND","PENDING","FAILED"],"mismatch_fields":["instruction_type","destination","amount","memo"],"rules":{"discriminators":{"transfer":3,"transferChecked":12,"approveChecked":13},"approve_checked":"ApproveChecked (discriminator 13) is an approval, moves no tokens, and is NEVER reported as a payment; an approval-only transaction grades SETTLED-MISMATCH on instruction_type.","plain_transfer":"A plain Transfer (discriminator 3, no decimals proof) grades as a payment only when destination and exact amount match AND the transaction's token balances corroborate the USDC mint at that destination; the delivery names instruction_type 'transfer' with decimals null. Without corroboration it grades SETTLED-MISMATCH on destination.","amount":"EXACT u64 equality of micro-units; underpayment and overpayment both mismatch on amount.","destination":"The transfer destination must equal the expected token account when supplied, else the payTo wallet's derived USDC ATA. For TransferChecked the instruction mint must equal the USDC mint; a wrong mint grades as a destination mismatch.","memo":"When an expected memo is supplied, an SPL Memo instruction text must equal it exactly; a different text or no memo instruction grades as a memo mismatch.","finality":"The bar is finalized: confirmed, processed, or missing confirmation status grades PENDING. A transaction with meta.err grades FAILED — never SETTLED-MATCH, and named distinctly from PENDING.","refund":"Reversed roles verify a refund transfer with the same call: the refund recipient is the expected payTo, the refund amount the expected amount, the refund memo the expected memo."},"engine_interface":"verifySettlement({ signature, expected }, rpc) -> verdict object; rpc is async (signature) => getTransactionResult | null. The engine is build/engine.mjs, imported unchanged by M-21/M-24/M-25; the identical block is delimited in this worker.","boundary_q25":"Boundary vs Q-25 (C5 subset-S reconciliation): Q-25 is a post-hoc signed report over submitted record sets inside subset S; B1 is a per-payment, per-call live chain read. The two do not share deliverables.","custody":{"ledger_closed_fields":["payer wallet","timestamp","day","price (USDC units) with the CAD fair-market-value block (rate, rate date, basis, cad_pending, refund — null unless refunded)","payment tx id","Solana fee (lamports)","criteria version","op","verdict line","looked-up signature","verdict","house flag"],"ledger_note":"The ledger list above is closed: adding a field is a criteria/handling version change.","retention":"Looked-up transactions are read once at call time and are never stored — not in KV, not in logs, not in the payments ledger, not in metrics. The payments ledger records only the closed field list published in the criteria (payer, time, price, the service's own payment tx, the looked-up signature, and the verdict). Because nothing is kept, a paid retry re-sends the lookup input."},"payment_includes":"$0.01 per settlement lookup. The payment includes: one settlement lookup — one Solana transaction signature plus the expected fields you supply (payTo wallet, expected amount in USDC micro-units, and optionally an expected token account and an expected memo) — returned as the fields as found on-chain, one verdict (SETTLED-MATCH / SETTLED-MISMATCH with the mismatching field named / NOT-FOUND / PENDING / FAILED), and an as-of timestamp. The lookup reads the chain once at call time; nothing about the looked-up transaction is stored beyond the payments ledger's closed field list.","kill_line":"Kill line (M-20, under the operator's 2026-11-03 zero-demand doctrine): build, bank, and hold; judged at the fleet's periodic reviews. There is NO demand kill line for this item. Tripwires, all stop-and-review: refunds >5% of paid calls in any 30-day window; free use >10x paid use; a wrong verdict from undisclosed stale or partial data (stop-serving under the affected criteria version, per the corpus re-pinning discipline in the criteria).","service":"settlement-verify","endpoints":{"criteria":"GET /criteria (free)","precheck":"POST /precheck (free, input-shape validation + assessability only; no chain read, no verdict)","verify":"POST /verify (paid, $0.01 per lookup: signed settlement report — fields as found, one verdict, as-of timestamp)","metrics":"GET /metrics"}}