GitHub

07 — PIPs · PIP-0008

Address capabilities, limits and receive targets

Standing intent, resolver answers and receive targets expressed in the common vocabulary, with per-capability limits and a versioned commitment.

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

Why

A standing intent states what an address accepts. In 0.3, its accepts entries use two shapes, its limits carry a single currency for every asset, and receive targets mix account types with rail names in kind. This PIP restates the address in the vocabulary of PIP-0006 and the registers of PIP-0007.

Standing intent

{
  "grammar": 2,
  "accepts": [
    {
      "rail": "blockchain",
      "chain": { "slug": "base", "caip2": "eip155:8453" },
      "asset_type": "token",
      "asset_code": "USDC",
      "standard": "erc20",
      "contract": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
      "limits": {
        "max_single": { "value": "1000", "asset_type": "token", "asset_code": "USDC" }
      }
    },
    {
      "rail": "sepa-inst",
      "asset_type": "fiat",
      "asset_code": "EUR",
      "reference_required": true
    },
    { "rail": "book", "asset_type": "fiat", "asset_code": "USD" }
  ],
  "limits": {},
  "policy": { "unknown_sender": "quarantine" }
}
FieldRule
`accepts[]`Capabilities. Order states preference.
`accepts[].limits`Optional. `min_single`, `max_single`, each an Amount in the capability's asset.
`accepts[].reference_required`Optional. `true` when a payment on this capability must carry a `payment_reference`. The value comes from a [payment instruction](/pips/0009).
`limits`Optional address-wide limits. Every amount is an Amount. `limits.currency` is not part of this grammar.
`policy`Unchanged. Stored, not returned by the resolver.

Each entry is a single rail and a single asset. Accepting several assets, or several rails, means several entries.

Commitment

The commitment is the SHA-256 digest of the canonical JSON of:

{ "grammar": 2, "address": "path:…", "accepts": [ … ], "limits": { … } }

chain.name is excluded. A commitment produced before this PIP has no grammar member, covers {address, accepts, limits}, and remains verifiable as published. A member moves to grammar 2 by setting a new version of its standing intent.

Resolver answer

The envelope is unchanged. accepts and limits take the shapes above, and the payload gains grammar.

{
  "kind": "resolver_answer",
  "address": "path:4a91c2f7e8d3",
  "requester": null,
  "standing": "holder",
  "valid": true,
  "grammar": 2,
  "accepts": [ "…" ],
  "limits": {},
  "commitment": "…",
  "commitment_version": 4
}

Without a standing intent, the resolver derives accepts from receive targets as complete capabilities, asset_code included, and commitment is null.

The answer carries no destination. A concrete destination is the object of a payment instruction.

Receive targets

A receive target serves one capability.

FieldMeaning
`rail`, `chain`, `asset_type`, `asset_code`, `standard`, `contract`The capability served, in the common vocabulary
`account_kind``own_ledger`, `virtual_account`, `external_account`, `wallet`
`beneficiary_format`One of the rail's `beneficiary_formats`
`requires_payment_reference`Whether payments to this target need a `payment_reference`
`account_ref`Unchanged. Never leaves the member.

kind (p2p_wallet, va_deposit, eva_deposit, external, viban, iban, ach, fps) is not part of this grammar. Account types move to account_kind, rail names to rail.

Compatibility

Breaking for readers of accepts, limits, commitment and receive targets. The signed path.address object and the resolver answer change shape. Commitments published before this PIP keep their value and their meaning.