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.

  1. decisionsubjecttierscore
  2. -connecting to Arc 5042 …
Screenings
Outside payers
USDC paid
Own wallets excluded. All numbers →
Hops traced2upstream
Settlement<1s · x402
Price0.01USDC / screen
01PipelinePOST /api/v1/screen

Evidence in. Signed verdict out.

Fig. 02 · Pipeline timingschematic timeline · connecting to the ledger …
Pipeline timing diagramSchematic timeline of one screen: evidence sources run concurrently, deterministic rules score, the analyst writes and is clamped by a guard, the attestation is signed, and the registry write settles asynchronously. The readouts beside each lane come from the latest real decision on the ledger (none yet).0 ms4008001.2 s1.6 s2.0 s2.4 sEVIDENCERULESANALYSTATTESTATIONREGISTRY·LEDGERyentearc-graphblacklistpayee-booknetworktipst/oguard-----re-screen · HIGH 1 h · MEDIUM 24 h · LOW 7 d · tier.changed webhook0 ms
  1. 01

    Collect evidence

    6 sources · per-source timeout

    OpenSanctions (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.

  2. 02

    Score deterministically

    0–100 · rules, not a model

    LOW 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.

  3. 03

    Analyst, clamped

    LLM · ≤120 words · 3 EDD questions

    A 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.

  4. 04

    Attest and log

    EIP-712 · registry · hash chain

    Attestation(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.

02Failure modesstatus quo

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.

03Live verdictsanctioned wallet · real pipeline

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.

Fig. 03 · Live verdictverdict · live · clientId web-landing · depth 2 · x402

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.

04Verdict anatomyone JSON object

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.

05IntegrationHTTP · SDK · Solidity · MCP

One line in your stack.

agents

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": {...} }
treasuries

@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 events
contracts

ICompliR.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.timestamp
06Productsall backed by the public API

Six surfaces, one oracle.

07Propertiesnot another black box

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.

08The companyoperator · treasury · 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.

Fig. 04 · The companyearns · holds · pays
earns · x402 revenue
price
0.01 USDC / screen
rail
x402 · Circle facilitator
refunds
automatic on error / pause
report
signed daily · /report
holds · Circle wallets
custody
developer-controlled wallets
policy
per-tx · daily · allowlist
idle
Circle Earn vault sweep (operator decides)
books
public · /company
pays · GuardedTreasury
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
09Pricingx402 on Arc · first call returns 402

Pay per call. Nothing else.

Fig. 05 · Price listUSDC on Arc · settled by x402 in < 1 s
EndpointPrice
POST /api/v1/screenfull verdict + signed attestation0.01 USDC
POST /api/v1/watchadaptive re-screening + tier.changed webhooks0.05 USDC / 30 d
GET /api/v1/attestation/:addresslatest attestation JSONfree
GET /api/v1/badge/:address.svgscreened-by badge, cached 60 sfree
POST /api/v1/shadowshadow report, ≤50 addressesfree
feed · numbers · ledger · decisionpublic records, addresses maskedfree

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.

10FAQ
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.