# Solana · Integra

> On Solana, the transaction’s one Memo instruction holds the ATR hash.

URL: https://integraledger.com/rails/solana

Payment rail

## Solana

On Solana, the transaction’s one Memo instruction holds the ATR hash. [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 the ATR hash rides

On this rail, the ATR hash rides in one Memo instruction.

#### The standard

The memo holds the ATR hash as `lcp:sha256:0x…`, so anyone can read it back from the settled transaction alone. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md) · [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)

- The transaction’s one Memo instruction, holding H’s LCP string. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

  `x402/exact/solana` `x402/upto/solana` `x402/batch-settlement/solana` `mpp/charge/solana` `mpp/charge/usdc/solana`
- The session channel’s salt: H’s first 8 bytes. It binds those 8 bytes only: whoever assembles the ATR can construct a second ATR whose hash shares them. [Source: lcp docs: rails⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/guides/rails.md)

  `mpp/session/solana`

Entry points: `@integraledger/lcp/svm` , `@integraledger/lcp/x402-exact-solana` , `@integraledger/lcp/x402-upto-solana` , `@integraledger/lcp/mpp` · Install beside the package: `@solana/kit`

#### The data

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

The ATR hash of the site’s example ATR, as this rail carries it

H’s LCP string, in the Memo instruction (77 bytes)

lcp:sha256:0x8448dc1b716a5103287cb8f35e36b614ffd91e630ab8b7911833c54748ad5ca6

Computed from the site’s example ATR by this rail’s own helper in the package, when the site was built.

### What a payment on this rail proves

Of these 6 pairings, 5 have the buyer’s signature cover the ATR hash, 6 leave a public proof of it, and 5 let anyone read it back from the chain alone. [Source: lcp docs: pairings reference⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/docs/reference/pairings.md)

Switch to Technical to see each pairing, and the sentence its record states about what a payment through it proves.

#### The standard

- **`x402/exact/solana` Native Field Buyer signs H: yes H on chain: yes Public proof: yes Recoverable from chain: yes**

  Pattern: [Native Field (LCP §8.3.1)⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#831-native-field)

  Where the ATR hash rides: The transaction’s one Memo instruction, holding H’s LCP string.

  What a payment through it proves: The payer signed a Solana transaction whose one Memo instruction carries this ATR's hash in LCP string form, and the transaction executed without error, carrying a token or SOL transfer. The memo is in the transaction's instruction data on chain. This does not show that amount, recipient, mint or timing match the ATR's content.
- **`x402/upto/solana` Native Field Buyer signs H: yes H on chain: yes Public proof: yes Recoverable from chain: yes**

  Pattern: [Native Field (LCP §8.3.1)⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#831-native-field)

  Where the ATR hash rides: The transaction’s one Memo instruction, holding H’s LCP string.

  What a payment through it proves: The payer signed a Solana transaction whose one Memo instruction carries this ATR's hash in LCP string form, and which opened a one-request payment channel escrowing the signed maximum; it executed without error. The memo is in the transaction's instruction data on chain. The amount charged from the escrow, which may be zero, is the seller's metering, settled by the facilitator in a later transaction that does not carry the hash, and the rest returns to the payer. This does not show that amount, recipient, mint or timing match the ATR's content.
- **`x402/batch-settlement/solana` Native Field Buyer signs H: yes H on chain: yes Public proof: yes Recoverable from chain: yes**

  Pattern: [Native Field (LCP §8.3.1)⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#831-native-field)

  Where the ATR hash rides: The transaction’s one Memo instruction, holding H’s LCP string.

  What a payment through it proves: The payer signed a Solana transaction whose one Memo instruction carries this ATR's hash in LCP string form, and which opened an x402 batch-settlement payment channel; it executed without error. The memo is in the transaction's instruction data on chain. Later requests in this channel were paid under this ATR by vouchers the seller did not meter. This does not show that amount, recipient, mint or timing match the ATR's content.
- **`mpp/charge/solana` Native Field Buyer signs H: yes H on chain: yes Public proof: yes Recoverable from chain: yes**

  Pattern: [Native Field (LCP §8.3.1)⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#831-native-field)

  Where the ATR hash rides: The transaction’s one Memo instruction, holding H’s LCP string.

  What a payment through it proves: The payer signed a Solana transaction whose one Memo instruction carries this ATR's hash in LCP string form, and the transaction executed without error, carrying a token or SOL transfer. The memo is in the transaction's instruction data on chain. This does not show that amount, recipient, mint or timing match the ATR's content.

  LCP profile: [mpp/charge/solana⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/profiles/mpp-charge-solana.md)
- **`mpp/charge/usdc/solana` Native Field Buyer signs H: yes H on chain: yes Public proof: yes Recoverable from chain: yes**

  Pattern: [Native Field (LCP §8.3.1)⁠ (opens in a new tab)](https://github.com/legal-context-protocol/legal-context-protocol/blob/c8df26d/spec/legal-context-protocol-v1.md#831-native-field)

  Where the ATR hash rides: The transaction’s one Memo instruction, holding H’s LCP string.

  What a payment through it proves: The payer signed a Solana transaction whose one Memo instruction carries this ATR's hash in LCP string form, and the transaction executed without error, carrying a token or SOL transfer. The memo is in the transaction's instruction data on chain. This does not show that amount, recipient, mint or timing match the ATR's content.

  LCP profile: [mpp/charge/solana⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/profiles/mpp-charge-solana.md)
- **`mpp/session/solana` Native Field, truncated Buyer signs H: no H on chain: yes Public proof: yes Recoverable from chain: no**

  Pattern: [Native Field, truncated (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)

  Where the ATR hash rides: The session channel’s salt: H’s first 8 bytes. It binds those 8 bytes only: whoever assembles the ATR can construct a second ATR whose hash shares them.

  What a payment through it proves: The ATR was assembled, written to the seller's storage and linked in the challenge before approval, and its hash is in the MPP challenge the opening answered, protected by the server's binding of the challenge. The payer signed a Solana transaction that opened a session channel on the channel program named in the challenge, with the first 8 bytes of this ATR's hash as the channel's salt, and it executed without error. The salt binds only this hash's first 8 bytes: whoever assembles the ATR can construct a second ATR whose hash shares them. Later requests in this channel were paid under this ATR by vouchers the seller did not meter. Where the operator signs the vouchers, each request also carried the payer's session proof, which signs the opening challenge's id and so this ATR's hash. This does not show that amount, deposit, recipient, mint or timing match the ATR's content.

  LCP profile: [mpp/session/hedera-solana-xrpl⁠ (opens in a new tab)](https://github.com/IntegraLedger/integra-protocol/blob/66274bf/lcp/profiles/mpp-session-hedera-solana-xrpl.md)

### Reading the settlement

The package reads a payment’s settlement through a reader you supply: the endpoint, the credentials, the timeouts and the retries are yours. A reader that fails never makes a payment read as failed. [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 (1)**

[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

**Reader**

`SvmReader`

**Its calls**

`getTransaction` at a commitment, `getSignaturesForAddress`, `isBlockhashValid`, `getFirstAvailableBlock`, `getAccountInfo` at `finalized` for a durable nonce account

**A settled read carries**

the commitment: `confirmed` or `finalized` [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 protocols that pay on it

- [x402](https://integraledger.com/protocols/x402)
- [MPP](https://integraledger.com/protocols/mpp)

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