Counterparty risk oracle · Arc mainnet 5042 · USDC
The risk layer money on Arc runs on.
One call before every payment. Deterministic score, signed EIP-712 verdict, mirrored on-chain, re-graded on a cadence, replayable from a hash-chained log. Run end to end by an agent. Never holds funds.
- decisionsubjecttierscore
- -connecting to Arc 5042 …
Evidence in. Signed verdict out.
- 01
Collect evidence
6 sources · per-source timeoutOpenSanctions (yente), Circle USDC isBlacklisted, the Arc protocol blocklist, on-chain activity, a 2-hop USDC funder trace with tx hashes, and a lookalike check against your payee book. A source that fails is recorded, never assumed clean.
- 02
Score deterministically
0–100 · rules, not a modelLOW 0–20, MEDIUM 21–60, HIGH 61–100. Every point is attributed to a reason code with its evidence. Two runs over the same evidence produce the same score.
- 03
Analyst, clamped
LLM · ≤120 words · 3 EDD questionsA Risk Analyst reads the evidence, writes the rationale, proposes limits, asks up to three EDD questions and picks the re-screen cadence. Code clamps every field to the tier band. The analyst cannot move the score.
- 04
Attest and log
EIP-712 · registry · hash chainAttestation(subject, tier, score, decisionHash, issuedAt, validUntil) is signed, mirrored in AttestationRegistry on Arc, and appended to a hash-chained decision log whose roots are Merkle-anchored on-chain.
Screening today is a yes/no at payment time.
A denylist lookup, one hop deep, checked once, never re-checked, from a vendor whose reasoning you cannot reproduce. An agent that pays a hundred suppliers a day inherits every one of those blind spots.
- one hop
- The payee is clean; the wallet that funded it was funded by a sanctioned one. Nobody looked.
- one moment
- A payee graded LOW in March is paid in October on March's answer.
- one bit
- Allow or deny. No limits, no questions, no path for a legitimate new counterparty to prove itself.
- black box
- The verdict cannot be verified, replayed, or checked by a contract before funds move.
Athens once banned every Megarian from its markets with a single decree and no appeal. Modern denylists are not much more granular. CompliR grades, limits, asks, and re-grades instead.
Screened seconds ago.
This page just screened a real sanctioned wallet (the Ronin Bridge exploiter, OFAC SDN) through the real pipeline. Dial, reasons with evidence, 2-hop funder graph, analyst rationale, signed attestation.
Screening the demo address through the real pipeline: collecting evidence, walking funders two hops, asking the Risk Analyst, signing the attestation. Usually a few seconds.
Nine fields. Each one actionable.
score- 0–100, deterministic
tier- LOW / MEDIUM / HIGH
recommendedLimits- maxPerTxUsdc, maxPerDayUsdc - clamped to the tier band
reasons[]- code, weight and evidence: tx hashes, funder paths, sanctions entity ids
rationale- written by the Risk Analyst, ≤120 words
eddRequested[]- up to three questions to ask the counterparty instead of refusing
nextRescreenAt- cadence the analyst picked: HIGH hourly → LOW weekly
attestation- EIP-712 typed data, signature, attester, validUntil, registryTx
decisionId- replayable entry in the hash-chained log: /log/<id>
Full shape and reason codes in the docs.
One line in your stack.
Any x402-aware HTTP client. No API key.
curl -s -X POST https://trycomplir.xyz/api/v1/screen \
-H 'Content-Type: application/json' \
-d '{ "address": "0xPayee", "amountUsdc": 120 }'
# → 402 + x402 requirements; your client pays 0.01 USDC and retries
# → { "tier": "MEDIUM", "score": 37, "recommendedLimits": {...}, "attestation": {...} }@complir/sdk with offline attestation verification.
import { CompliR } from "@complir/sdk";
const c = new CompliR({ wallet }); // Circle agent wallet on Arc pays via x402
const v = await c.screen("0xPayee", { amountUsdc: 120, payeeBook });
if (v.tier === "HIGH") hold();
else pay(Math.min(amount, v.recommendedLimits.maxPerTxUsdc));
await c.watch("0xPayee", { webhook }); // tier.changed eventsICompliR.sol against AttestationRegistry on Arc.
require(
ICompliR(registry).isAllowed(payee, ICompliR.Tier.MEDIUM),
"CompliR: payee tier too high"
);
// true iff tier != UNKNOWN && tier <= MEDIUM && validUntil > block.timestampSix surfaces, one oracle.
Arc Trust Maplive
Every counterparty receiving meaningful USDC on Arc mainnet, graded and re-graded as the chain moves.
re-graded every tick/map →02Guarded Payoutsdemo
A treasury agent pays through GuardedTreasury. Paid, limited or held, each with a signed reason.
isAllowed(payee, MEDIUM)/payouts →03Explorertool
One address in. Dial, reasons, 2-hop funder graph, analyst rationale, signed attestation out.
POST /api/v1/screen/explorer →04Shadow Reportfree
Paste a payee book and recent payments. See what the denylist missed, as a report you can share.
≤ 50 addresses/shadow →05Screened-by Badgefree
An SVG badge for receipts and READMEs. Links to the live attestation JSON.
SVG · cached 60 s/badge →06Tip Marketx402
Staked community intelligence. A verified tip earns a bounty; a bad one loses its stake.
stake 0.05 USDC/tips →Anyone can check the work.
- 01Signed
- Every verdict is an EIP-712 attestation you can verify offline against the published attester address.
- 02Replayable
- Every decision is an entry in a hash-chained log with the evidence it was built on. Re-walk the chain any time.
- 03On-chain
- AttestationRegistry on Arc mirrors the tier. A contract checks isAllowed(payee, MEDIUM) in one call.
- 04Continuous
- Re-graded on a cadence the agent picks: HIGH hourly, MEDIUM daily, LOW weekly. tier.changed webhooks.
- 05Pay per call
- 0.01 USDC via x402 with the Circle facilitator. No API keys, no contracts, no sales call.
- 06Never holds funds
- CompliR is an oracle. Your USDC never touches us; the treasury that moves money stays yours.
Two hops, not one. Re-graded on a cadence the agent picks. Replay any decision at /ledger.
A company run by an agent.
CompliR is the first company on Arc run end to end by an agent. It sells risk screening, holds in Circle wallets, pays its contributors through a treasury that refuses tainted payees, and signs every decision into a ledger.
- price
- 0.01 USDC / screen
- rail
- x402 · Circle facilitator
- refunds
- automatic on error / pause
- report
- signed daily · /report
- custody
- developer-controlled wallets
- policy
- per-tx · daily · allowlist
- idle
- Circle Earn vault sweep (operator decides)
- books
- public · /company
- gate
- isAllowed(payee, MEDIUM)
- cap
- attested maxPerTxUsdc
- held
- HIGH · signed reason
- watch
- live · /payouts
- x402 facilitatorpay-per-call in USDC, no keys
- Circle walletsagent wallets with spending policies
- Circle contractsAttestationRegistry + GuardedTreasury
- USDC isBlacklistedread from the token contract
- Gateway / USYCplanned: idle revenue sweep
Pay per call. Nothing else.
| Endpoint | Price |
|---|---|
| POST /api/v1/screenfull verdict + signed attestation | 0.01 USDC |
| POST /api/v1/watchadaptive re-screening + tier.changed webhooks | 0.05 USDC / 30 d |
| GET /api/v1/attestation/:addresslatest attestation JSON | free |
| GET /api/v1/badge/:address.svgscreened-by badge, cached 60 s | free |
| POST /api/v1/shadowshadow report, ≤50 addresses | free |
| feed · numbers · ledger · decisionpublic records, addresses masked | free |
Free for Tameion teams during the event. Send us a payee list and we will return a shadow report; integrate and screen for free until the deadline.
Do you hold funds?
No. CompliR is a read-only oracle. The only USDC that moves is the per-call x402 fee you pay to our revenue wallet. Guarded Payouts uses a separate GuardedTreasury contract that you deploy and own.
What data sources do you use?
OpenSanctions via yente (address and name matching), Circle's USDC contract isBlacklisted(), the Arc protocol blocklist, Arc RPC for activity and a 2-hop USDC funder trace, our own prior verdicts, and the payee book you send for lookalike and address-change detection.
Can the LLM change a score?
No. Deterministic rules own the score and tier. The Risk Analyst writes the rationale, proposes limits, EDD questions and a re-screen cadence; code clamps all of it to the tier band and the analyst's output never feeds back into the score.
How do I verify a verdict offline?
Recover the signer of attestation.typedData + attestation.signature (EIP-712 domain CompliR v1, chainId 5042, the registry as verifyingContract) and compare with the attester address from /api/v1/health. The SDK does this in one call: CompliR.verifyAttestation(v.attestation).
What if yente or the RPC is down?
Every evidence source runs behind a timeout. A source that fails is recorded as timeout_or_error in the decision record and is never silently treated as clean. If no RPC is configured, chain sources are skipped and the verdict says so. COMPLIR_PAUSED is a kill switch that returns 503 and makes no charge.
Mainnet or testnet?
Arc mainnet (chain id 5042). Nothing on this site is mocked: the example addresses are a real sanctioned wallet (the Ronin Bridge exploiter, on the OFAC SDN and JP MOF lists - read-only, we never pay it) and our own live attester / treasury wallet. The hero lattice, the timing readouts and the live verdict all come from the ledger and the Trust Map on Arc.