---
name: payeeguard
description: Deterministic payment-destination preflight for agents, paid per call.
---

# PayeeGuard

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.

## When to use this

Use `POST https://payee.schemasure.com/v1/guard/payee` when you need: Check a payment destination before the transfer becomes irreversible.

## How to pay

1. Send the request without payment. You receive HTTP 402 and a base64 `PAYMENT-REQUIRED` header.
2. Decode it, sign one of the `accepts` entries with your wallet locally.
3. Retry the identical request with the `PAYMENT-SIGNATURE` header.
4. A successful response carries a `PAYMENT-RESPONSE` receipt.

Cost: $0.01 in USDC on Base mainnet. Failed calls are free.
Your private key never leaves your process.

## Request

```json
{
  "address": "0x7a3D40f7c6B18E5920Ab7C3e5d81f4A04E6F8a0D",
  "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
  "expected_address": "0x7A3D9C1b5e2F4A8d6C0b3E5F7a9D1c2b4e6f8A0d"
}
```

## 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."
  ]
}
```

## Reading the verdict

- `resolved` / `pass` / `allow` — the service answered and the answer is usable.
- `warn` — usable, but `evidence` contains findings you should act on.
- `block` — the service is telling you not to proceed. Read `risk_codes`.
- `unknown` — the service could not determine the answer. **Do not treat this as safe.**
