is_wash_fleet
Free discovery: cheap circular-flow (wash) check for a payer wallet.
Returns the CATEGORICAL classification (clean / self_pay / reciprocal /
self+reciprocal), an is_circular bool, and the observed event counts +
distinct_merchants from the wallet's corpus edges. Use as a fast Sybil/wash
gate before trusting a counterparty.
Accepts a Solana public key or a Base/EVM address. On Base the signal reads
the high-confidence x402 rollup only, and 3-cycle ring detection does not run
(Solana-only precomputed matview), so ring_events=0 there means NOT EVALUATED,
never "no rings observed".
Fail-open: a DB gap returns classification "unknown". The numeric wash discount
(wash_factor / wash_ratio) and the full renormalized model stay paid — they are
NOT returned here.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | Wallet to check for circular-flow / wash behavior: a Solana public key (32-44 base58 chars) or a Base/EVM address (0x + 40 hex). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Which corpus answered: "solana" or "base". Base reads the high-confidence x402 rollup only. | |
| error | No | Present only on the degraded path. | |
| reason | No | Degraded-path reason, if any. | |
| wallet | No | The wallet checked. | |
| is_circular | No | True if any self-pay or reciprocal (2-cycle) flow was observed. | |
| ring_events | No | Events forming a 3-cycle ring. Meaningless unless ring_evaluated is true: 0 with ring_evaluated false means NOT LOOKED FOR, not none found. | |
| self_events | No | Events where the wallet paid itself. | |
| total_events | No | Total observed payment events. | |
| classification | No | Circular-flow class: "clean" | "self_pay" | "reciprocal" | "self+reciprocal" | "unknown". | |
| ring_evaluated | No | True only when the ring axis actually ran for this wallet: the precomputed Solana ring aggregate was read, or the live Base 3-cycle query returned. False when the ring lookup failed or the Solana wallet has no aggregate row yet - in both of which ring_events=0 means not evaluated, never none found. | |
| reciprocal_events | No | Events forming a 2-cycle (counterparty also pays this wallet). | |
| distinct_merchants | No | Distinct merchants this wallet paid. |