GitHub

07 — PIPs · PIP-0011

Settlement receipts in the common vocabulary

The capability used, the amounts sent and received, typed rail references, and receipts issued by either side of a payment.

ImplementedCore
Number
PIP-0011
Status
implemented
Type
Core
Author
PATH
Date
2026-10-04
Source
On the register

Why

A receipt states what happened. In 0.3 it names the rail as free text, carries one amount and one currency, and points at the rail through two untyped fields, source_tx_hash and source_reference. Only the payee's member issues receipts, although several failure reasons are observed on the payer's side. This PIP restates the receipt in the vocabulary of PIP-0006.

The object

{
  "type": "path.receipt",
  "reference": "q8w2e5r7t9y1u3i6o0p4as",
  "issuer": "member-a",
  "issued_by": "payee",
  "payer": { "member": "member-b" },
  "payee": { "member": "member-a", "address": "path:4a91c2f7e8d3" },
  "request": "7fk2m9pq3vx8",
  "instruction": "k3v9n2x8p4q7r1s6t0w5yz",
  "via": {
    "rail": "blockchain",
    "chain": { "slug": "base", "caip2": "eip155:8453" },
    "asset_type": "token",
    "asset_code": "USDC",
    "standard": "erc20",
    "contract": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
  },
  "sent": { "value": "7.62", "asset_type": "token", "asset_code": "USDC" },
  "received": { "value": "5000", "asset_type": "fiat", "asset_code": "USD" },
  "fx": { "rate": "656.17", "source": "operator_quote" },
  "fees": [
    {
      "kind": "network",
      "amount": { "value": "0.01", "asset_type": "token", "asset_code": "USDC" },
      "paid_by": "payer"
    }
  ],
  "rail_references": [{ "type": "tx_hash", "value": "0x9f…", "index": 3 }],
  "attestations": [],
  "status": "settled",
  "reason_code": null,
  "supersedes": null,
  "route": null,
  "grammar": 2
}

Rules

FieldRule
`issuer`The member that signs.
`issued_by``payee` or `payer`: the side `issuer` speaks for.
`payer`, `payee`Parties. Each side states only itself: `payer.member` appears on a payee-issued receipt when an attestation signed by the payer's member supports it.
`request`, `instruction`References, or `null`. A payment to an address with no request carries `payee.address`.
`via`The single capability used.
`sent`Required when the asset sent differs from the asset received.
`received`Required from `settled` on, on a payee-issued receipt.
`fx`Required when `sent` and `received` differ in asset.
`fees`Fees actually applied, as Fee objects.
`rail_references[]`At least one from `settled` on. Each `type` is one of the rail's `rail_reference_types` ([PIP-0007](/pips/0007)). Replaces `source_tx_hash` and `source_reference`.
`attestations[]`Signed PATH envelopes from other parties, such as the payer's member confirming its side. Nothing else.
`status`, `reason_code`, `supersedes`Unchanged.
`route`Unchanged: `null`. The shape is in [PIP-0005](/pips/0005).
`reference`From the common reference generator, like every linkable object.

Which side states what

SideMay issueReason codes it may state
`payer``pending`, `failed``insufficient_funds`, `rail_unavailable`, `rail_rejected`, `limit_exceeded`, `compliance_blocked`, `expired`
`payee``pending`, `settled`, `failed`, `reversed``destination_unknown`, `destination_closed`, `limit_exceeded`, `compliance_blocked`

The registry of reasons stays closed. A reason outside the issuing side's list is a 400. One payment may have a receipt from each side; they are matched by instruction and rail_references.

The state machine is unchanged: pending → settled | failed, settled → reversed.

Compatibility

Breaking for readers of amount, currency, rail, source_tx_hash, source_reference, payer_member and payee_member. Receipts signed in the 0.3 shape are replayed as signed. A transition of a 0.3 receipt is issued in the 0.3 shape, so that its supersedes chain stays in one grammar.