# For payment rails · Integra

> Payments on your rail carry the agreement, in a field your rail already has. Settlement stays on your rail.

URL: https://integraledger.com/for-payment-rails

For payment rails

## Your payments carry the agreement, in a field you already have.

On almost every rail the public package supports, the ATR hash — the unique fingerprint of the agreement’s Agentic Transaction Record (ATR) — rides in a field the payment already has: a nonce, a memo, a note, a salt, an invoice field. Where a rail has none, the package says so. Settlement stays on your rail. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

**Sources (1)**

[lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

Where it rides

### A field the rail already has, and no new contract.

Each rail below, with the field its payments carry the ATR hash in, or, where a rail has none, what carries it instead. No pairing in the package adds a contract for LCP, and nothing about the rail changes. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md) · [Source: lcp docs: binding⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/binding.md)

| Rail | Where the ATR hash rides |
| --- | --- |
| [EVM chains](https://integraledger.com/rails/evm) | the signed authorization’s nonce |
| [Tempo](https://integraledger.com/rails/tempo) | MPP’s attribution memo |
| [Solana](https://integraledger.com/rails/solana) | one Memo instruction |
| [Stellar](https://integraledger.com/rails/stellar) | the seller’s muxed address |
| [XRP Ledger](https://integraledger.com/rails/xrpl) | the Payment’s InvoiceID |
| [Hedera](https://integraledger.com/rails/hedera) | the signed transaction body’s memo |
| [Algorand](https://integraledger.com/rails/algorand) | the asset transfer’s note |
| [Aptos](https://integraledger.com/rails/aptos) | the challenge only |
| [Cardano](https://integraledger.com/rails/cardano) | a CIP-20 message |
| [Casper](https://integraledger.com/rails/casper) | the CEP-3009 authorization’s nonce |
| [Concordium](https://integraledger.com/rails/concordium) | the transfer’s memo |
| [NEAR](https://integraledger.com/rails/near) | the NEP-141 transfer’s memo |
| [Polkadot Asset Hub](https://integraledger.com/rails/polkadot) | a remark batched with the transfer |
| [Starknet](https://integraledger.com/rails/starknet) | the outside execution’s nonce |
| [Sui](https://integraledger.com/rails/sui) | an unused Pure input |
| [Tron](https://integraledger.com/rails/tron) | the TRC-20 transfer’s memo |
| [TON](https://integraledger.com/rails/ton) | the Jetton transfer’s text comment |
| [Stacks](https://integraledger.com/rails/stacks) | the SIP-010 transfer’s memo |
| [Lightning](https://integraledger.com/rails/lightning) | the BOLT11 invoice |
| [Card networks](https://integraledger.com/rails/card) | the agent’s signature, the mandate, or the processor reference |
| [Stripe](https://integraledger.com/rails/stripe) | the PaymentIntent’s metadata |

[See every rail, field by field](https://integraledger.com/rails)

**Sources (2)**

[lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md) · [lcp docs: binding⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/binding.md)

#### The standard

Each rail’s field holds the hash in the form it can: all 32 bytes, its LCP string (`lcp:sha256:0x…`), its first 8 bytes, its low 250 bits, or a hash of it. The table gives each rail’s form, computed from the example’s ATR hash by the rail’s own helper in the package. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

| Rail | What it holds | For the example ATR | Pairings |
| --- | --- | --- | --- |
| EVM chains | H itself, as the EIP-3009 nonce (32 bytes) | 0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 15 |
| Tempo | the MPP challenge id that carries H, from which the memo’s last 7 bytes derive | hEjcG3FqUQMofLjzXja2FP_ZHmMKuLeRGDPFR0itXKY.0 | 4 |
| Solana | H’s LCP string, in the Memo instruction (77 bytes) | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 6 |
| Stellar | H’s first 8 bytes, as the muxed id | 9532110621754675459 | 2 |
| XRP Ledger | the x402 `InvoiceID`: SHA-256 of H’s LCP string | EDFC016DBC705845777C0A0B18ED760674935F8BDC774DE6161D9016D0BD5672 | 3 |
| Hedera | H’s LCP string, as the body memo | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 4 |
| Algorand | H’s LCP string, as the note | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Aptos | — | — | 1 |
| Cardano | H’s LCP string, as a CIP-20 message in two strings | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Casper | H itself, as the nonce (32 bytes) | 0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Concordium | H’s LCP string, as a CBOR text string in the memo | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| NEAR | H’s LCP string, as the memo | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 2 |
| Polkadot Asset Hub | H’s LCP string, in a `system.remark_with_event` | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Starknet | H’s low 250 bits, as one felt | 0x48dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Sui | H’s 32 bytes, as one `Pure` input | 0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Tron | H’s LCP string, as `raw_data.data` | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| TON | H’s LCP string, as a TEP-74 text comment | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Stacks | H’s 32 bytes, as the memo | 0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 1 |
| Lightning | H’s 32 bytes, in the invoice the seller’s node signs | 0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 4 |
| Card networks | H’s LCP string, as the seller’s processor reference | lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6 | 5 |
| Stripe | — | — | 2 |

#### The data

Read from the published packages when the site was built; nothing here is typed by hand.

H, the example’s ATR hash, that every form starts from

```
0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6
```

#### Check it yourself

1. Compute a form from H yourself: the LCP string is `lcp:sha256:` followed by H, and Stellar’s muxed id is H’s first 8 bytes read as an unsigned 64-bit integer. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

What it proves

### What makes a payment a proof of the agreement.

Three properties decide how much a payment on a rail shows, and every pairing in the package states all three about itself. [Source: lcp docs: binding⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/binding.md)

#### The payer signs it

The buyer’s own signature covers the ATR hash, or a value derived from it, so the payer cannot later say the payment was for something else. [Source: lcp docs: binding⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/binding.md)

#### The ledger keeps it

Settlement leaves a public record that commits to the ATR hash: anyone can check an ATR against it. [Source: lcp docs: binding⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/binding.md)

#### Anyone can read it back

Where the rail keeps all 32 bytes, the ATR hash can be read from the settled transaction alone, without asking either party. [Source: lcp docs: recovering H from the chain alone⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#recovering-h-from-the-chain-alone) · [Source: LCP §8.3.8⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#838-how-to-choose)

Where a rail’s payment carries nothing public, the seller can advertise an agreement URL: the buyer first pays it on a pairing that is a public proof, then makes the full payment. [Source: lcp docs: where the payment is not a public proof⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#where-the-payment-is-not-a-public-proof) · [Source: lcp docs: the agreement URL⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/buyer-gate.md#the-agreement-url)

**Sources (5)**

[lcp docs: binding⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/binding.md) · [lcp docs: recovering H from the chain alone⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#recovering-h-from-the-chain-alone) · [LCP §8.3.8⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#838-how-to-choose) · [lcp docs: where the payment is not a public proof⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#where-the-payment-is-not-a-public-proof) · [lcp docs: the agreement URL⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/concepts/buyer-gate.md#the-agreement-url)

#### The standard

Where a field is narrower than the ATR hash (Stellar’s 8-byte muxed id, Starknet’s 250-bit nonce) or holds a value derived from it, the ledger confirms an ATR hash someone already holds rather than revealing it, and the pairing’s record says what that does and does not bind. [Source: LCP §8.3.8⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#838-how-to-choose) · [Source: LCP §B.1⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#b1-native-field) · [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

Each pairing’s pattern record states the three properties as `buyerSigns`, `publicProof` and `zeroPartyRecoverable`; the counts are read from it when the site is built. [Source: lcp docs: pairings reference⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/reference/pairings.md)

- 42 of 67 pairings where the payer’s signature covers the ATR hash
- 41 of 67 pairings whose settlement is a public proof of it
- 23 of 67 pairings where anyone can read it back from the chain alone

#### The code

Compiled against the published packages when the site is built.

Count them yourself, from the package’s registry

src/snippets/registry.ts

```
// The package's registry holds every pairing with its pattern record: here, the pairings whose fingerprint anyone can
// read back from the settled transaction alone.
import { BINDINGS } from '@integraledger/lcp';

export const recoverable = BINDINGS.filter((b) => b.pattern.zeroPartyRecoverable).map((b) => b.id);
```

Non-custodial

### Nothing about your rail changes.

Integra orchestrates. It never broadcasts a transaction and never takes custody of funds. Settlement stays entirely on your rail.

The package itself holds no key, signs nothing, moves no funds and calls no network on its own. It reads a payment’s settlement through a reader you supply, with your endpoint and your credentials. A reader that fails never makes a payment read as failed. [Source: @integraledger/lcp: what it guarantees⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/README.md#what-it-guarantees-and-what-it-does-not) · [Source: lcp docs: reading settlement⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#reading-settlement)

**Sources (2)**

[@integraledger/lcp: what it guarantees⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/README.md#what-it-guarantees-and-what-it-does-not) · [lcp docs: reading settlement⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#reading-settlement)

#### The standard

Each rail page names its reader and the calls it makes. For EVM chains, `EvmReader` makes four: `eth_getTransactionReceipt`, `eth_getBlockByNumber` for the safe and finalized marks, `eth_getTransactionByHash` and `eth_call`. [Source: lcp docs: reading settlement⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md#reading-settlement)

#### The code

Compiled against the published packages when the site is built.

Your reader, your node: read the hash back from a settled transfer

src/snippets/recover.ts

```
// Anyone, from the chain alone: read the fingerprint back from a settled EIP-3009 transfer, through your own node.
import { isRefusal } from '@integraledger/lcp';
import type { Eip155, EvmReader, Hex } from '@integraledger/lcp/evm';
import { exactEip3009 } from '@integraledger/lcp/x402';

export async function fingerprintOf(network: Eip155, asset: Hex, transaction: Hex, reader: EvmReader) {
  const h = await exactEip3009.recover({ network, asset, transaction }, reader);
  return isRefusal(h) ? null : h; // compare it with the hash of the record you hold
}
```

Ways in

### Build it once, for your whole network.

#### Publish your rail’s profile

The standard invites chain operators and protocol stewards to publish authoritative binding profiles in their own documentation. The package’s own profiles, one per binding, show the form: the rail’s rules, clause by clause. [Source: LCP §8⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#8-protocol-integration) · [Source: @integraledger/lcp: LCP profiles⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/tree/66274bf/lcp/profiles)

#### Test against the vectors

The package ships its test vectors for every pairing: the placed challenge, what the payer signs, the ATR hash read back, and the settlement read. An implementation that passes them agrees with it byte for byte. [Source: @integraledger/lcp: vectors and conformance⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/README.md#vectors-and-conformance)

#### Run it on your test network

The hosted appliance is free on test networks, with test-network USDC, so your developers can see the agreement ride your rail before anything is in production.

[The protocols that pay on them](https://integraledger.com/protocols)

**Sources (3)**

[LCP §8⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#8-protocol-integration) · [@integraledger/lcp: LCP profiles⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/tree/66274bf/lcp/profiles) · [@integraledger/lcp: vectors and conformance⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/README.md#vectors-and-conformance)

#### The standard

The package’s LCP profiles are Markdown documents, one per binding, under `lcp/profiles/` in its repository. [Source: @integraledger/lcp: LCP profiles⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/tree/66274bf/lcp/profiles)

#### Check it yourself

1. Run the package’s vectors for your rail’s pairings against your implementation: each fixes the placed challenge, what the payer signs, the hash read back and the settlement read. [Source: @integraledger/lcp: vectors and conformance⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/README.md#vectors-and-conformance)

### Ready to see your own agreements proved?

Tell us what you sell, buy or carry, and we will show you where the agreement rides in it.

The hosted appliance is free on test networks, with test-network USDC.

[Talk to us](https://integraledger.com/contact)
