---
name: receiptsure
description: Deterministic Base transaction receipt verification against a declared intent, paid per call.
---

# ReceiptSure

ReceiptSure is the other half of a transaction preflight: not what a transaction will do, but what it actually did. It fetches the receipt, decodes every Transfer, TransferSingle, TransferBatch and Approval log, and holds them against the transfers the caller said they intended — reporting each one as matched, missing or short, with the shortfall quantified in base units and in display units where the token's decimals are readable. It catches the cases a status code hides: a revert whose reason the receipt does not carry, a transaction that succeeded while moving nothing, a token that skimmed a fee on the way through, and funds leaving a declared sender for an address nobody named. There is no model anywhere in it, and a receipt it cannot read comes back as unknown rather than as approval.

## When to use this

Use `POST https://receipt.schemasure.com/v1/tx/receipt-verify` when you need: Verify what a Base transaction actually did against the intent you declared.

## 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
{
  "tx_hash": "0x7f1c3a58e0b94d26c5af7318d0e42b96c1d85f0a3b72e648d9c05147ae2b6f30",
  "expected_transfers": [
    {
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "from": "0x9F2C5E4A8db1C3a7E6B0d4f8C1E2a5b7D9C0e3F4",
      "to": "0x5d3e1a9b7c2f4e8a0b6d3c5f9e1a7b4d2c8f0a6e",
      "amount": "10000"
    }
  ]
}
```

## Response

```json
{
  "ok": true,
  "verdict": "block",
  "confidence": 1,
  "risk_codes": [
    "AMOUNT_MISMATCH",
    "FEE_ON_TRANSFER_SKIM"
  ],
  "evidence": [
    {
      "code": "AMOUNT_MISMATCH",
      "severity": "critical",
      "detail": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E received 9900 base units, short of the declared 10000 by 100 base units.",
      "source": "intent-match",
      "data": {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "to": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E",
        "expected_base_units": "10000",
        "observed_base_units": "9900",
        "delta_base_units": "-100",
        "shortfall_base_units": "100",
        "shortfall_display": null,
        "decimals": null,
        "symbol": null
      }
    },
    {
      "code": "FEE_ON_TRANSFER_SKIM",
      "severity": "medium",
      "detail": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4 sent 10000 base units of 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 but 0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E received 9900. The missing 100 (1.00%) went to 1 other address(es) in the same transfer chain, which is the signature of a fee-on-transfer token.",
      "source": "skim",
      "data": {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "from": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
        "to": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E",
        "sent_base_units": "10000",
        "received_base_units": "9900",
        "skimmed_base_units": "100",
        "implied_fee_bps": 100,
        "plausible_fee_ceiling_bps": 1000,
        "other_recipients": [
          {
            "to": "0x4CbE9fd4a2B7c0e1D8f3A6b9C2E5d8F1A4B7C0e3",
            "amount": "100"
          }
        ]
      }
    }
  ],
  "result": {
    "tx_hash": "0x7f1c3a58e0b94d26c5af7318d0e42b96c1d85f0a3b72e648d9c05147ae2b6f30",
    "chain": "eip155:8453",
    "receipt": {
      "status": "success",
      "block_number": "0x1f4a2c0",
      "transaction_index": 12,
      "gas_used": "0xd6d8",
      "from": "0x9F2C5E4A8db1C3a7E6B0d4f8C1E2a5b7D9C0e3F4",
      "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "contract_address": null,
      "log_count": 2,
      "detail": "mined in block 0x1f4a2c0 with status 1 and 2 log(s)"
    },
    "revert": {
      "reverted": false,
      "reason": null,
      "kind": null,
      "raw": null,
      "detail": "the receipt reports status 1, so the transaction was applied"
    },
    "effect": {
      "has_logs": true,
      "decoded_logs": 2,
      "undecodable_logs": 0,
      "unrelated_logs": 0,
      "silent_success": false,
      "detail": "2 log(s): 2 transfer(s), 0 approval(s), 0 unrelated event(s), 0 that did not decode"
    },
    "expected_transfers": [
      {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "asset_kind": "erc20",
        "from": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
        "to": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E",
        "amount": "10000",
        "token_id": null
      }
    ],
    "transfer_checks": [
      {
        "expected": {
          "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "asset_kind": "erc20",
          "from": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
          "to": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E",
          "amount": "10000",
          "token_id": null
        },
        "status": "amount_mismatch",
        "amounts": {
          "expected_base_units": "10000",
          "observed_base_units": "9900",
          "delta_base_units": "-100",
          "shortfall_base_units": "100",
          "decimals": null,
          "symbol": null,
          "expected_display": null,
          "observed_display": null,
          "shortfall_display": null
        },
        "matched_log_indexes": [
          0
        ],
        "detail": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E received 9900 base units, short of the declared 10000 by 100 base units."
      }
    ],
    "observed_transfers": [
      {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "asset_kind": "erc20",
        "event": "Transfer",
        "from": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
        "to": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E",
        "amount": "9900",
        "token_id": null,
        "operator": null,
        "log_index": 0
      },
      {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "asset_kind": "erc20",
        "event": "Transfer",
        "from": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
        "to": "0x4CbE9fd4a2B7c0e1D8f3A6b9C2E5d8F1A4B7C0e3",
        "amount": "100",
        "token_id": null,
        "operator": null,
        "log_index": 1
      }
    ],
    "observed_approvals": [],
    "fee_on_transfer": [
      {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "from": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4",
        "to": "0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E",
        "sent_base_units": "10000",
        "received_base_units": "9900",
        "skimmed_base_units": "100",
        "implied_fee_bps": 100,
        "implied_fee_percent": "1.00%",
        "skimmed_display": null,
        "plausible_fee": true,
        "other_recipients": [
          {
            "to": "0x4CbE9fd4a2B7c0e1D8f3A6b9C2E5d8F1A4B7C0e3",
            "amount": "100"
          }
        ],
        "detail": "0x9f2C5E4a8DB1C3A7e6b0d4f8C1e2A5b7d9c0E3f4 sent 10000 base units of 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 but 0x5D3e1a9b7c2f4E8A0b6d3c5F9E1A7b4D2C8f0a6E received 9900. The missing 100 (1.00%) went to 1 other address(es) in the same transfer chain, which is the signature of a fee-on-transfer token."
      }
    ],
    "unexpected_recipients": [],
    "denylist_hits": [],
    "tokens": [
      {
        "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "symbol": null,
        "decimals": null,
        "detail": "no RPC configured, so token metadata could not be read"
      }
    ],
    "unresolved": [],
    "rpc": {
      "receipts_configured": true,
      "reads_configured": false,
      "detail": "receipts are read from the configured Base endpoints; token metadata is best-effort and never changes a verdict"
    }
  },
  "policy_version": "2026-09-19",
  "request_hash": "sha256:50864960b295fd6c1d41ddf29b9da8397286701a16480b7184a14444f0ecf1d3",
  "data_versions": {
    "denylist": "2026-08-03.1",
    "event_abis": "2026-09-19.1",
    "policy": "2026-09-19",
    "chain": "eip155:8453",
    "fee_plausibility_bps": "1000"
  },
  "warnings": [
    "No Base RPC endpoint is configured for token reads, so symbols and decimals are absent and every amount is reported in base units only. This affects presentation, never a verdict."
  ]
}
```

## 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.**
