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

## 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](/pips/0006) and the registers of [PIP-0007](/pips/0007).

## Standing intent

```json
{
  "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" }
}
```

| Field | Rule |
|---|---|
| `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:

```json
{ "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`.

```json
{
  "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](/pips/0009).

## Receive targets

A receive target serves one capability.

| Field | Meaning |
|---|---|
| `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.