# PayeeGuard Deterministic payment-destination preflight for agents, paid per call. PayeeGuard checks where the money is about to go, while that is still a decision rather than a fact. It verifies the EIP-55 checksum a mixed-case address carries, compares the destination against the address you said you expected and reports the exact hex positions that differ, recognises the ground look-alikes used in address-poisoning attacks by their shared prefix and suffix rather than by edit distance alone, blocks burn sinks, precompiles and a token contract offered as its own payee, and says whether the destination can receive the asset at all. There is no model anywhere in it, and most of it is exact arithmetic on twenty bytes. Where the chain is needed and cannot answer, it returns unknown, because a confident guess about an irreversible transfer is worse than no answer. ## Payment - Protocol: x402 V2, scheme `exact`, network `eip155:8453` (Base mainnet) - Asset: USDC `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` - No accounts, no API keys, no subscriptions. - Failed calls are not charged. Only a successful, usable result settles. - Payment authorization window: 60s ## Endpoints ### `POST /v1/guard/payee` — $0.01 per successful call Pre-flight a Base payment destination before you send. Verifies the EIP-55 checksum, measures distance from an address you expect — catching a mistyped digit and the shared prefix-and-suffix shape of a ground look-alike — flags the zero address, burn sinks and precompiles, refuses a token offered as its own payee, and reports whether the destination can receive the asset. Returns unknown rather than guessing when bytecode does not decide it. Not a judgement of the counterparty. Unpaid request returns HTTP 402 with the challenge in the `PAYMENT-REQUIRED` header: ```bash curl -i -sS -X POST https://payee.schemasure.com/v1/guard/payee \ -H 'content-type: application/json' \ -d '{"address":"0x7a3D40f7c6B18E5920Ab7C3e5d81f4A04E6F8a0D","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","expected_address":"0x7A3D9C1b5e2F4A8d6C0b3E5F7a9D1c2b4e6f8A0d"}' ``` Example successful response: ```json { "ok": true, "verdict": "block", "confidence": 1, "risk_codes": [ "EXPECTED_ADDRESS_VANITY_COLLISION", "ASSET_EXISTENCE_UNKNOWN" ], "evidence": [ { "code": "CHECKSUM_VALID", "severity": "info", "detail": "The destination matches its EIP-55 checksum exactly.", "source": "eip55" }, { "code": "EXPECTED_ADDRESS_VANITY_COLLISION", "severity": "critical", "detail": "The destination shares the first 4 and last 8 hex digits with the address you expected while differing throughout the middle. That is the signature of a ground look-alike address, the shape used in address-poisoning attacks, because those are the digits a person checks.", "source": "address-distance", "data": { "match": "vanity_collision", "differing_positions": [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 ], "hamming_distance": 27, "edit_distance": 25, "shared_prefix": 4, "shared_suffix": 8, "expected": "0x7A3D9C1b5e2F4A8d6C0b3E5F7a9D1c2b4e6f8A0d" } }, { "code": "RECEIPT_UNCONDITIONAL", "severity": "info", "detail": "An ERC-20 transfer credits a balance in the token's own storage and never calls the destination, so receipt succeeds for any address — contract or wallet, token-aware or not. Whether the destination can later move those units is a property of its own code and is not evaluated here.", "source": "erc20-semantics" }, { "code": "ASSET_EXISTENCE_UNKNOWN", "severity": "medium", "detail": "Whether 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 has a deployed token behind it could not be established, so this answer covers the destination but not the asset.", "source": "eth_getCode" } ], "result": { "address": { "input": "0x7a3D40f7c6B18E5920Ab7C3e5d81f4A04E6F8a0D", "canonical": "0x7a3D40f7c6B18E5920Ab7C3e5d81f4A04E6F8a0D", "lowercase": "0x7a3d40f7c6b18e5920ab7c3e5d81f4a04e6f8a0d" }, "asset": { "kind": "erc20", "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "symbol": null, "decimals": null, "exists": null, "detail": "no RPC configured, so code presence could not be read; no RPC configured, so token metadata could not be read" }, "checksum": { "form": "mixed", "valid": true, "canonical": "0x7a3D40f7c6B18E5920Ab7C3e5d81f4A04E6F8a0D", "detail": "matches its EIP-55 checksum exactly" }, "expected_comparison": { "match": "vanity_collision", "differing_positions": [ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 ], "hamming_distance": 27, "edit_distance": 25, "shared_prefix": 4, "shared_suffix": 8, "expected_canonical": "0x7A3D9C1b5e2F4A8d6C0b3E5F7a9D1c2b4e6f8A0d", "detail": "shares the first 4 and last 8 hex digits with the address you expected while differing throughout the middle. That is the signature of a ground look-alike address, the shape used in address-poisoning attacks, because those are the digits a person checks" }, "sinks": { "is_zero_address": false, "is_burn_address": false, "is_precompile": false, "label": null, "detail": "is not the zero address, a known burn sink, or a precompile" }, "destination": { "is_contract": null, "code_size": null, "account_kind": "unknown", "forwards_to": null, "detail": "no RPC configured, so code presence could not be read" }, "can_receive": { "value": true, "basis": "erc20-balance-mapping", "detail": "An ERC-20 transfer credits a balance in the token's own storage and never calls the destination, so receipt succeeds for any address — contract or wallet, token-aware or not. Whether the destination can later move those units is a property of its own code and is not evaluated here." }, "self_send": { "present": false, "from": null, "matches": null, "detail": "No sender was supplied, so the self-send check did not run." }, "denylist_hits": [], "unresolved": [ "whether 0x7a3D40f7c6B18E5920Ab7C3e5d81f4A04E6F8a0D holds contract code: no RPC configured, so code presence could not be read", "whether 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 is a deployed contract: no RPC configured, so code presence could not be read" ], "rpc": { "configured": false, "endpoints": [] } }, "policy_version": "2026-09-19", "request_hash": "sha256:7eac1cd1fd4cd5268c1b873571b4a3212a532ca60f4a788d084239f962a2dd61", "data_versions": { "denylist": "2026-08-03.1", "sinks": "2026-09-19", "bytecode_shapes": "2026-09-19", "policy": "2026-09-19", "chain": "eip155:8453" }, "warnings": [ "No Base RPC endpoint is configured, so this answer covers only what twenty bytes can tell you: checksum integrity, distance from the address you expected, and known sinks. Every chain-dependent field is reported as unknown rather than assumed." ] } ``` ## Result contract Every response is the shared portfolio envelope: `ok`, `verdict`, `confidence`, `risk_codes`, `evidence`, `result`, `policy_version`, `request_hash`, `data_versions`, `warnings`. `verdict: "unknown"` is a real answer, not a failure. It means the service could not determine the result and says why in `evidence`. It is never silently reported as a safe or clean outcome. ## Service level - Target P50: 400 ms - Target P95: 1500 ms ## Data handling - Caller content is processed transiently and never retained. - No training on customer content. - Subprocessors: base-rpc.publicnode.com, mainnet.base.org, base.gateway.tenderly.co ## Machine-readable surfaces - https://payee.schemasure.com/openapi.json - https://payee.schemasure.com/.well-known/x402.json - https://payee.schemasure.com/.well-known/pricing.json - https://payee.schemasure.com/.well-known/benchmarks.json - https://payee.schemasure.com/.well-known/data-handling.json - https://payee.schemasure.com/apis.json - https://payee.schemasure.com/SKILL.md