Check whether a transaction is a scam without telling anyone what you are about to trade.
To find out whether a transaction is a drainer, you currently send your unsigned intent to a scanner's API. That intent contains the trade you are about to make. Somebody else now knows your position before the chain does, before you have signed, before it hits the mempool, at the moment the information is worth the most.
sealed-check runs the adjudication inside a TEE on the 0G compute network. The operator running the model does not see your intent. You get back a verdict that is signed by the enclave and cryptographically bound to the exact transaction it was reached over.
That binding cuts both ways, which is the point. A checker that cleared a drainer has left signed, non-repudiable evidence that it did so.
The judge accepts exactly one input: a Facts object validated against a zod schema. Nothing else is interpolated into the prompt. Every field in Facts is a number, boolean, enum, address, or integer-as-string. There is no free-text field in the schema. Not for names, not for symbols, not for notes. tests/schema-audit.test.ts walks the schema tree and fails the build if any string field appears that is not regex-constrained to hex or digits. Addresses are rendered as hex, never resolved to a human-readable label. src/judge.ts imports from src/facts.ts and nothing else. It has no access to raw traces or contract source, and that is enforced by the import graph rather than by discipline. Revert strings are attacker-controlled too a honeypot can revert with "SAFE: audited by CertiK". Only the sell-outcome enum crosses the boundary.

