<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 4.0.6) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC3339 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3339.xml">
<!ENTITY RFC4648 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8259 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8259.xml">
<!ENTITY RFC8785 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8785.xml">
<!ENTITY RFC9457 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml">
]>


<rfc ipr="noModificationTrust200902" docName="draft-solana-session-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Solana Session">Solana Session Intent for HTTP Payment Authentication</title>

    <author initials="L." surname="Galabru" fullname="Ludo Galabru">
      <organization>Solana Foundation</organization>
      <address>
        <email>ludo.galabru@solana.org</email>
      </address>
    </author>
    <author initials="" surname="Desormeaux" fullname="Jo">
      <organization>Solana Foundation</organization>
      <address>
        <email>jo.desormeaux@solana.org</email>
      </address>
    </author>
    <author initials="M." surname="Assaf" fullname="Michael Assaf">
      <organization>Moonsong Labs</organization>
      <address>
        <email>michael@moonsonglabs.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="15"/>

    
    
    

    <abstract>


<?line 70?>

<t>This document defines the "solana" payment method implementation
of the "session" intent registered by
<xref target="I-D.payment-intent-session"/>, for use within the Payment HTTP
Authentication Scheme <xref target="I-D.ryan-httpauth-payment-01"/>. Sessions
enable metered, streaming, or repeated-use access to resources
through off-chain vouchers backed by an on-chain escrow. The
client opens a payment channel by depositing into a channel
program. The client either authorizes incremental spend directly
with signed vouchers or presents a reusable bearer proof while the
operator signs the corresponding vouchers. The channel
settles on-chain when the session closes.</t>



    </abstract>



  </front>

  <middle>


<?line 84?>

<section anchor="introduction"><name>Introduction</name>

<t>HTTP Payment Authentication <xref target="I-D.ryan-httpauth-payment-01"/> defines
a challenge-response mechanism that gates access to resources
behind payments. The "session" intent and its shared semantics —
lifecycle operations, accounting invariants, request fields, and
receipt shape — are registered and defined by
<xref target="I-D.payment-intent-session"/>. This document defines how the
"solana" payment method implements that intent.</t>

<t>The <spanx style="verb">session</spanx> intent establishes a unidirectional
streaming payment channel using on-chain escrow and
off-chain signed vouchers. This enables high-frequency,
low-cost payments by batching many off-chain voucher
updates into periodic on-chain settlement.</t>

<t>Unlike the <spanx style="verb">charge</spanx> intent, which settles a full
on-chain transaction per request, the <spanx style="verb">session</spanx> intent
allows clients to pay incrementally as service is
consumed. This makes sessions suitable for streaming,
metered APIs, and any use case where per-request
on-chain settlement would be prohibitively expensive
or slow.</t>

<section anchor="solana-specific-capabilities"><name>Solana-Specific Capabilities</name>

<t>This specification leverages Solana-specific capabilities:</t>

<t><list style="symbols">
  <t><strong>Escrow via channel program</strong>: Deposits are held by an
on-chain program (not the server), enabling trustless
settlement and client-initiated forced close.</t>
  <t><strong>Atomic multi-instruction transactions</strong>: Channel open
can include the channel-PDA creation, escrow ATA
creation, deposit transfer, and splits commitment in
a single transaction. Similarly, cooperative close
can bundle <spanx style="verb">settleAndSeal</spanx> and <spanx style="verb">distribute</spanx> so
the merchant payout, payer refund, treasury sweep,
and escrow-ATA closure all land atomically and
immediately — no token movement is ever slot-gated
(see <xref target="channel-closure"/>).</t>
  <t><strong>Fee payer separation</strong>: The server / operator can
sponsor the cooperative on-chain operations it submits
(open, topUp, settle, settleAndSeal, distribute,
reclaim).
The operator funds both the transaction fees AND the
channel rent: it acts as the <spanx style="verb">rentPayer</spanx> that funds
the channel PDA and escrow ATA rent at <spanx style="verb">open</spanx> and
recovers that SOL rent after close — via the
terminal <spanx style="verb">distribute</spanx>'s fast path or a later
permissionless <spanx style="verb">reclaim</spanx> (see
<xref target="channel-closure"/>). The client
(<spanx style="verb">payer</spanx>) only ever moves stablecoin and never needs
SOL during the normal session lifecycle. Because a
SOL-free client cannot self-fund escape-route
instructions (requestClose, seal, withdrawPayer),
those instructions are permissionless or
payer-authorized but <bcp14>MAY</bcp14> be submitted by the operator
or any party; a client that does hold SOL <bcp14>MAY</bcp14> also
submit them itself.</t>
  <t><strong>Ed25519 native verification</strong>: Voucher signatures can
be verified on-chain using Solana's native <spanx style="verb">ed25519</spanx>
program, enabling trustless settlement without
reimplementing signature verification in the channel
program.</t>
  <t><strong>Passkey-compatible P256 verification</strong>:
Implementations can support delegated voucher signers
using Solana's native <spanx style="verb">secp256r1</spanx> verification
program, enabling WebAuthn/passkey-backed session
authorization without requiring the funding key to
sign each voucher.</t>
</list></t>

</section>
<section anchor="session-flow"><name>Session Flow</name>

<figure><artwork><![CDATA[
  Client                      Server             Solana
     |                           |                  |
     |  (1) GET /resource        |                  |
     |-------------------------> |                  |
     |                           |                  |
     |  (2) 402 (pricing, asset, |                  |
     |       splits, grace)      |                  |
     |<------------------------- |                  |
     |                           |                  |
     |  (3) open (deposit tx,    |                  |
     |       no initial voucher) |                  |
     |-------------------------> |                  |
     |                           | (4) co-sign +    |
     |                           |     broadcast    |
     |                           |----------------> |
     |  (5) 200 OK + Receipt     |                  |
     |<------------------------- |                  |
     |                           |                  |
     |  (6) voucher (cumulative: |                  |
     |       100)                |  no on-chain tx  |
     |-------------------------> |                  |
     |  (7) 200 OK + Receipt     |                  |
     |<------------------------- |                  |
     |                           |                  |
     |  (8) voucher (cumulative: |                  |
     |       200)                |  no on-chain tx  |
     |-------------------------> |                  |
     |  (9) 200 OK + Receipt     |                  |
     |<------------------------- |                  |
     |        ...                |                  |
     |                           |                  |
     |  (10) close (final        |                  |
     |        voucher, optional) |                  |
     |-------------------------> |                  |
     |                           | (11) settleAnd-  |
     |                           | Seal +           |
     |                           | distribute       |
     |                           |----------------> |
     |  (12) 200 OK + Receipt    |                  |
     |<------------------------- |                  |
     |                           |                  |
]]></artwork></figure>

<t>Steps 6–9 are off-chain: the client signs a voucher
authorizing cumulative spend, the server verifies the
signature and serves the resource. No on-chain
transaction occurs per request.</t>

<t>The diagram shows client-signed vouchers. With operator-signed
vouchers, the client presents the proof in <xref target="session-bearer-proof"/>
and the operator meters service and signs each cumulative voucher.</t>

<t>Step 11 typically bundles <spanx style="verb">settleAndSeal</spanx> and
<spanx style="verb">distribute</spanx> in the same transaction so the
merchant payout, payer refund, treasury sweep, and
escrow-ATA closure all land atomically and
immediately. The channel PDA itself is deallocated
in the same instruction when the epoch window of
<xref target="channel-closure"/> has already elapsed; otherwise
it is left <spanx style="verb">Distributed</spanx> and the operator's periodic
<spanx style="verb">reclaim</spanx> sweep recovers the PDA rent after the
window.</t>

<t>When fee sponsorship is enabled, the server co-signs
as fee payer on steps 4 and 11 — the client never
needs SOL for transaction fees.</t>

</section>
<section anchor="relationship-to-the-charge-intent"><name>Relationship to the Charge Intent</name>

<t>The "charge" intent (defined separately) handles one-time
payments. The "session" intent handles metered, streaming,
or repeated-use payments within a single channel. Both
intents share the same <spanx style="verb">solana</spanx> method identifier and
encoding conventions.</t>

<t>Like a zero-amount charge proof, the session bearer proof signs a
domain-separated, challenge-bound message without moving funds. It is
a reusable <spanx style="verb">session</spanx> proof and <bcp14>MUST NOT</bcp14> be processed as a <spanx style="verb">charge</spanx>.</t>

</section>
<section anchor="voucher-signer"><name>Voucher Signer</name>

<t>Two voucher-signing modes are defined:</t>

<dl>
  <dt><spanx style="verb">client</spanx></dt>
  <dd>
    <t>The client controls <spanx style="verb">authorizedSigner</spanx> and signs cumulative
vouchers. A valid voucher both authorizes payment and proves
possession of the channel's voucher-signing key.</t>
  </dd>
  <dt><spanx style="verb">operator</spanx></dt>
  <dd>
    <t>The operator controls <spanx style="verb">authorizedSigner</spanx>. The client authenticates
metered requests with the reusable bearer proof defined in
<xref target="session-bearer-proof"/>, and the operator signs the
resulting cumulative vouchers.</t>
  </dd>
</dl>

<t><spanx style="verb">client</spanx> is the default when the challenge omits <spanx style="verb">voucherSigner</spanx>.</t>

</section>
</section>
<section anchor="requirements-language"><name>Requirements Language</name>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="terminology"><name>Terminology</name>

<dl>
  <dt>Payment Channel</dt>
  <dd>
    <t>A unidirectional payment relationship between a payer
and payee, consisting of an on-chain escrow account
managed by a channel program and a sequence of
off-chain vouchers. The channel is identified by a
unique <spanx style="verb">channelId</spanx>.</t>
  </dd>
  <dt>Channel Program</dt>
  <dd>
    <t>A Solana program that manages channel escrow accounts.
It enforces deposit, settlement, and withdrawal rules.
The program address is declared in the challenge so
clients can verify they are interacting with the
expected program.</t>
  </dd>
  <dt>Voucher</dt>
  <dd>
    <t>A signed message authorizing a cumulative payment
amount for a specific channel. Vouchers are
monotonically increasing in amount.</t>
  </dd>
  <dt>Cumulative Amount</dt>
  <dd>
    <t>The total amount authorized from channel open, not a
per-request delta. For example, if the first voucher
authorizes 100 and the second authorizes 250, the
payee may claim up to 250 total, not 350.</t>
  </dd>
  <dt>Authorized Signer</dt>
  <dd>
    <t>The key permitted to sign vouchers for a channel.
Defaults to the payer unless the channel open binds a
delegated signer in channel state.</t>
  </dd>
  <dt>Grace Period</dt>
  <dd>
    <t>A time window after a client requests forced close,
during which the server can still settle outstanding
vouchers before funds are returned to the client.</t>
  </dd>
  <dt>Idle Timeout</dt>
  <dd>
    <t>The maximum period without channel activity before
the server initiates cooperative close. Channel
activity is defined in <xref target="idle-timeout"/>.</t>
  </dd>
</dl>

</section>
<section anchor="intent-identifier"><name>Intent Identifier</name>

<t>The intent identifier for this specification is "session".
It <bcp14>MUST</bcp14> be lowercase.</t>

</section>
<section anchor="encoding-conventions"><name>Encoding Conventions</name>

<t>This specification uses two distinct encoding regimes:</t>

<t><list style="numbers" type="1">
  <t><strong>HTTP envelope canonicalization.</strong> Challenge
payloads (<spanx style="verb">request</spanx> auth-param), credential
payloads (<spanx style="verb">Authorization: Payment</spanx> header bodies),
and receipts use the same encoding as the Solana
charge intent: JCS-serialized <xref target="RFC8785"/> JSON,
base64url-encoded <xref target="RFC4648"/> without padding.</t>
  <t><strong>On-chain signed-payload encoding.</strong> The bytes
the channel's <spanx style="verb">authorizedSigner</spanx> signs to authorize
spend are produced by Borsh-encoding the on-chain
<spanx style="verb">Voucher</spanx> struct (see <xref target="on-chain-voucher-encoding"/>).
These bytes are the exact message verified by
Solana's native <spanx style="verb">ed25519</spanx> precompile and read back
by the channel program via the Instructions
sysvar. Using a fixed-layout binary encoding here
removes the need to repack between the HTTP JSON
shape and the precompile message, and makes the
on-chain verification a single byte-equality
check.</t>
</list></t>

<t>JCS produces deterministic JSON bytes for header
canonicalization but is unnecessary for the inner
signed payload: the on-chain Borsh layout is
deterministic by construction.</t>

</section>
<section anchor="channel-program-interface"><name>Channel Program Interface</name>

<t>The channel program manages escrow accounts and
enforces settlement rules. This section defines the
logical interface that conforming channel programs
<bcp14>MUST</bcp14> implement.</t>

<section anchor="channel-state"><name>Channel State</name>

<t>Each channel is represented by an on-chain account
(typically a PDA derived from payer, payee, mint,
authorized signer, a salt, and the open slot) with the
following logical fields. Field names use camelCase; tag and
enum-variant values (<spanx style="verb">Channel</spanx>, <spanx style="verb">Open</spanx>, <spanx style="verb">Closing</spanx>,
<spanx style="verb">Sealed</spanx>, <spanx style="verb">Distributed</spanx>) use PascalCase by convention,
matching how they appear in Rust program source.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Storage</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">discriminator</spanx></c>
      <c>u8</c>
      <c>Account state</c>
      <c>Non-zero account-type tag (<spanx style="verb">Channel</spanx>); rejected when 0 so zero-initialized PDAs cannot impersonate a channel</c>
      <c><spanx style="verb">version</spanx></c>
      <c>u8</c>
      <c>Account state</c>
      <c>Account-layout version; lets implementations evolve the account layout across program versions</c>
      <c><spanx style="verb">bump</spanx></c>
      <c>u8</c>
      <c>Account state</c>
      <c>Canonical PDA bump</c>
      <c><spanx style="verb">status</spanx></c>
      <c>u8</c>
      <c>Account state</c>
      <c><spanx style="verb">Open</spanx> / <spanx style="verb">Closing</spanx> / <spanx style="verb">Sealed</spanx> / <spanx style="verb">Distributed</spanx> enum value. <spanx style="verb">Distributed</spanx> is terminal and fully drained — every token leg paid, escrow ATA closed — inert to every instruction except <spanx style="verb">reclaim</spanx> and holding only the PDA's own rent (see <xref target="channel-closure"/>)</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>u64</c>
      <c>Seed + Account state</c>
      <c>PDA disambiguator. Persisted so the channel PDA can re-derive its own seeds for self-signed CPIs (refunds, distribution) without off-chain inputs</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>u64</c>
      <c>Account state</c>
      <c>Total amount currently escrowed</c>
      <c><spanx style="verb">settled</spanx></c>
      <c>u64</c>
      <c>Account state</c>
      <c>Cumulative amount authorized for distribution (voucher watermark)</c>
      <c><spanx style="verb">payoutWatermark</spanx></c>
      <c>u64</c>
      <c>Account state</c>
      <c>Distribution watermark (<spanx style="verb">payoutWatermark &lt;= settled</spanx>); <spanx style="verb">distribute</spanx> advances it to <spanx style="verb">settled</spanx> and pays cumulative floor deltas between the old and new watermark (see <xref target="splits-canonicalization"/>)</c>
      <c><spanx style="verb">closureStartedAt</spanx></c>
      <c>i64</c>
      <c>Account state</c>
      <c>Unix timestamp when <spanx style="verb">requestClose</spanx> was called (0 if not set; cleared on <spanx style="verb">Sealed</spanx>)</c>
      <c><spanx style="verb">payerWithdrawnAt</spanx></c>
      <c>i64</c>
      <c>Account state</c>
      <c>Unix timestamp of the payer refund (0 if not yet); guards against double-refund when both <spanx style="verb">withdrawPayer</spanx> and <spanx style="verb">distribute</spanx> can pay the payer</c>
      <c><spanx style="verb">gracePeriod</spanx></c>
      <c>u32</c>
      <c>Account state</c>
      <c>Non-zero seconds between <spanx style="verb">requestClose</spanx> and permissionless <spanx style="verb">seal</spanx>. Per-channel, set at <spanx style="verb">open</spanx>, so a single program deployment can host channels with differing dispute windows</c>
      <c><spanx style="verb">distributionHash</spanx></c>
      <c>[u8;32]</c>
      <c>Account state</c>
      <c>Hash digest of the canonical splits preimage committed at <spanx style="verb">open</spanx>; <spanx style="verb">distribute</spanx> <bcp14>MUST</bcp14> re-verify this hash before paying recipients</c>
      <c><spanx style="verb">payer</spanx></c>
      <c>Pubkey</c>
      <c>Seed + Account state</c>
      <c>Client who deposited funds</c>
      <c><spanx style="verb">payee</spanx></c>
      <c>Pubkey</c>
      <c>Seed + Account state</c>
      <c>Server authorized to settle; receives the implicit-remainder share on <spanx style="verb">distribute</spanx></c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>Pubkey</c>
      <c>Seed + Account state</c>
      <c>Voucher signer; <bcp14>MAY</bcp14> equal <spanx style="verb">payer</spanx> or a delegated signer</c>
      <c><spanx style="verb">mint</spanx></c>
      <c>Pubkey</c>
      <c>Seed + Account state</c>
      <c>SPL Token or Token-2022 mint. Stored (not seed-only) so refund / distribution CPIs can be validated without re-binding seeds</c>
      <c><spanx style="verb">rentPayer</spanx></c>
      <c>Pubkey</c>
      <c>Account state</c>
      <c>The operator / transaction submitter that funded the channel PDA and escrow ATA rent at <spanx style="verb">open</spanx>. Recorded so the terminal <spanx style="verb">distribute</spanx> (fast path) or the permissionless <spanx style="verb">reclaim</spanx> can drain the freed SOL rent to this account without an off-chain input. Distinct from <spanx style="verb">payer</spanx>: the client (<spanx style="verb">payer</spanx>) only moves stablecoin and never needs SOL</c>
      <c><spanx style="verb">openSlot</spanx></c>
      <c>u64</c>
      <c>Seed + Account state</c>
      <c>Client-supplied per-incarnation epoch, carried in the <spanx style="verb">open</spanx> instruction data and window-validated against the Clock sysvar (see <xref target="channel-closure"/>). A PDA seed, so the channel address itself is per-incarnation and <spanx style="verb">channelId</spanx> alone identifies an incarnation; persisted for signer-seed reconstruction and as the reclaim-gate input</c>
</texttable>

<t>The <spanx style="verb">channelId</spanx> is the base58-encoded address of the
channel account (PDA). Channel programs <bcp14>MUST</bcp14> derive
the channel PDA deterministically from channel
parameters and the program ID. At minimum, the seed
set <bcp14>MUST</bcp14> bind the PDA to:</t>

<t><list style="symbols">
  <t>the payer public key;</t>
  <t>the payee public key;</t>
  <t>the mint address (native SOL is unsupported; clients
wishing to pay in SOL <bcp14>MUST</bcp14> wrap to wSOL before opening
a channel);</t>
  <t>a client-chosen salt or nonce;</t>
  <t>the authorized signer public key (or payer if no
delegation is used); and</t>
  <t>the client-supplied <spanx style="verb">openSlot</spanx> epoch, so that each
incarnation of the same participant tuple derives a
distinct address (see <xref target="channel-closure"/>).</t>
</list></t>

<t>Once a channel is opened, vouchers for that channel
<bcp14>MUST</bcp14> verify under the channel's <spanx style="verb">authorizedSigner</spanx>.
No other signer is valid for that channel.</t>

<t>Clients and servers <bcp14>MUST</bcp14> derive the expected
<spanx style="verb">channelId</spanx> from the channel program ID and the seed
components above and <bcp14>MUST</bcp14> verify that the open
transaction creates and funds exactly that PDA.
Relying on a client-declared <spanx style="verb">channelId</spanx> string alone
is NOT sufficient.</t>

<t>Channel programs <bcp14>MUST</bcp14> use Solana's canonical PDA
derivation procedure and <bcp14>MUST</bcp14> reject non-canonical
addresses or user-supplied bump values that do not
match the canonical derivation for the channel seeds.</t>

<t><spanx style="verb">Channel</spanx> state — <spanx style="verb">deposit</spanx>, <spanx style="verb">settled</spanx>,
<spanx style="verb">payoutWatermark</spanx>, and <spanx style="verb">payerWithdrawnAt</spanx> — is
authoritative for pending settlement value. The escrow
ATA balance and the channel PDA's lamports can exceed
those values, because third parties can prefund either
address; the program does not record those surpluses in
<spanx style="verb">Channel</spanx>. Off-chain consumers <bcp14>MUST</bcp14> derive spendable
capacity and pending settlement from channel state,
never from raw escrow ATA balances or PDA lamports.</t>

<t>The SOL rent backing the channel PDA and escrow ATA is
funded at <spanx style="verb">open</spanx> by <spanx style="verb">rentPayer</spanx> (the operator /
transaction submitter), not by the client. The freed
SOL rent is returned to <spanx style="verb">Channel.rentPayer</spanx> at close —
the escrow-ATA rent by the <spanx style="verb">Sealed</spanx> <spanx style="verb">distribute</spanx>,
and the channel PDA's own rent either in the same
instruction (fast path) or by a later permissionless
<spanx style="verb">reclaim</spanx> (see
<xref target="channel-closure"/>). The token <spanx style="verb">deposit</spanx> and any
surplus PDA lamports are independent of this rent
accounting: the token refund of <spanx style="verb">deposit - settled</spanx>
always goes to the <spanx style="verb">payer</spanx>, while surplus PDA lamports
drain to <spanx style="verb">rentPayer</spanx> at close.</t>

</section>
<section anchor="instructions"><name>Instructions</name>

<section anchor="open"><name>open</name>

<t>Creates the channel account, transfers the initial
deposit from the payer, and commits a hash of the
distribution splits preimage. The payer <bcp14>MUST</bcp14> be a
signer.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">salt</spanx></c>
      <c>u64</c>
      <c>PDA disambiguator</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>u64</c>
      <c>Initial deposit in base units; <bcp14>MUST</bcp14> be non-zero</c>
      <c><spanx style="verb">gracePeriod</spanx></c>
      <c>u32</c>
      <c>Forced-close grace period in seconds; stored per-channel; encoded as <spanx style="verb">grace_period</spanx>; <bcp14>MUST</bcp14> be non-zero</c>
      <c><spanx style="verb">openSlot</spanx></c>
      <c>u64</c>
      <c>Client-supplied per-incarnation epoch; encoded as <spanx style="verb">open_slot</spanx>; window-validated against the Clock sysvar (see <xref target="channel-closure"/>). A PDA seed: it is a derivation input for the channel address, and servers <bcp14>MUST</bcp14> include it when re-deriving or validating <spanx style="verb">channelId</spanx>. The open transaction <bcp14>MUST</bcp14> land within <spanx style="verb">OPEN_SLOT_WINDOW</spanx> (1,500 slots — ~10 min at 400 ms slots) of this slot; standard transactions are bounded tighter still by the 150-block blockhash validity, while durable-nonce transactions get the full window. A flow that misses the window <bcp14>MUST</bcp14> re-derive with a fresh <spanx style="verb">openSlot</spanx> — and therefore a fresh <spanx style="verb">channelId</spanx> — and re-sign; no other protocol message carries an on-chain deadline</c>
      <c><spanx style="verb">distributionSplits</spanx></c>
      <c><spanx style="verb">(Pubkey, u16)[]</spanx></c>
      <c>Splits preimage; canonical encoding hashed into <spanx style="verb">distributionHash</spanx> (see <xref target="splits-canonicalization"/>)</c>
</texttable>

<t>The reference instruction-data layout after the
instruction discriminator is:</t>

<figure><artwork><![CDATA[
salt (u64 LE) || deposit (u64 LE) ||
grace_period (u32 LE) || open_slot (u64 LE) ||
count (u32 LE) || entries (count × 34 bytes)
]]></artwork></figure>

<t><spanx style="verb">open</spanx> takes the following leading accounts, in this
exact order:</t>

<texttable>
      <ttcol align='left'>Index</ttcol>
      <ttcol align='left'>Account</ttcol>
      <ttcol align='left'>Signer</ttcol>
      <ttcol align='left'>Writable</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0</c>
      <c><spanx style="verb">payer</spanx></c>
      <c>Yes</c>
      <c>Yes</c>
      <c>Client depositing stablecoin; signs the deposit transfer</c>
      <c>1</c>
      <c><spanx style="verb">rentPayer</spanx></c>
      <c>Yes</c>
      <c>Yes</c>
      <c>Operator / transaction submitter funding the SOL rent for the channel PDA and escrow ATA. <bcp14>MUST</bcp14> be the operator / fee-payer key already in scope (the same key that co-signs <spanx style="verb">open</spanx> as fee payer); a single operator signature satisfies both the fee-payer and <spanx style="verb">rentPayer</spanx> signer roles. Recorded into <spanx style="verb">Channel.rentPayer</spanx> so its rent can be reclaimed at close. There is no separate wire field for <spanx style="verb">rentPayer</spanx>; it is derived from the existing operator / fee payer</c>
      <c>2</c>
      <c><spanx style="verb">payee</spanx></c>
      <c>No</c>
      <c>No</c>
      <c>Channel payee</c>
      <c>3</c>
      <c><spanx style="verb">mint</spanx></c>
      <c>No</c>
      <c>No</c>
      <c>SPL Token / Token-2022 mint</c>
      <c>4</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>No</c>
      <c>No</c>
      <c>Voucher signer bound into the PDA seeds</c>
      <c>5</c>
      <c><spanx style="verb">channel</spanx></c>
      <c>No</c>
      <c>Yes</c>
      <c>Channel PDA being created</c>
</texttable>

<t>The remaining accounts (payer token account, escrow
token account, token program, system program, rent,
associated-token program, and program-internal
accounts) follow <spanx style="verb">channel</spanx> in their fixed order.
Verifiers that read <spanx style="verb">open</spanx> accounts by fixed index <bcp14>MUST</bcp14>
account for <spanx style="verb">rentPayer</spanx> at index 1 and the resulting
<spanx style="verb">+1</spanx> shift of every account after <spanx style="verb">payer</spanx>, and <bcp14>MUST</bcp14>
verify that <spanx style="verb">accounts[1]</spanx> equals the operator /
fee-payer key.</t>

<t>The client (<spanx style="verb">payer</spanx>) only ever moves stablecoin and
never needs SOL: <spanx style="verb">rentPayer</spanx> funds all channel rent at
<spanx style="verb">open</spanx> and recovers it after close, via the terminal
<spanx style="verb">distribute</spanx>'s fast path or a later permissionless
<spanx style="verb">reclaim</spanx> (see <xref target="channel-closure"/>).</t>

<t><spanx style="verb">open</spanx> <bcp14>MUST</bcp14> validate the client-supplied <spanx style="verb">openSlot</spanx>
against the Clock sysvar:
<spanx style="verb">openSlot &lt;= clock.slot</spanx> and
<spanx style="verb">clock.slot - openSlot &lt;= OPEN_SLOT_WINDOW</spanx> (see
<xref target="channel-closure"/>). Future slots <bcp14>MUST</bcp14> be strictly
rejected (reference error <spanx style="verb">OpenSlotOutOfWindow</spanx>,
code 2003): a far-future <spanx style="verb">openSlot</spanx> would otherwise
break the address-never-repeats argument of
<xref target="reincarnation-replay"/> and push the reclaim gate
arbitrarily far out, permanently stranding the
operator's PDA rent.
<spanx style="verb">open</spanx> <bcp14>MUST</bcp14> reject any <spanx style="verb">distributionSplits</spanx> whose
preimage is malformed, whose total share exceeds
10000 bps, which contains duplicate recipients, or
which lists the derived channel PDA as a recipient.
Mints carrying Token-2022 extensions outside the
allow-list (see <xref target="token-extension-policy"/>) <bcp14>MUST</bcp14> be
rejected.</t>

<t>The <spanx style="verb">gracePeriod</spanx> parameter <bcp14>MUST</bcp14> be non-zero. Channel
programs <bcp14>MUST</bcp14> reject <spanx style="verb">grace_period == 0</spanx>.</t>

<t><spanx style="verb">open</spanx> does NOT curve-check <spanx style="verb">payee</spanx>; both on-curve and
PDA payees are permitted (see <xref target="settle-and-seal"/>).</t>

<t><spanx style="verb">open</spanx> is prefund-tolerant. The channel PDA allocation
and the escrow ATA creation are both idempotent: a
prefunded but still-uninitialized channel PDA (a
system-owned, data-empty account holding only lamports)
or a pre-existing canonical escrow ATA is accepted
rather than reverting. Prefunded balances are never
credited to channel state — surplus PDA lamports drain
to <spanx style="verb">rentPayer</spanx> at close, and surplus escrow tokens are
swept to the treasury by the terminal <spanx style="verb">distribute</spanx>.</t>

<t>Servers <bcp14>MUST</bcp14> use a <spanx style="verb">salt</spanx> that keeps concurrent live
channels between the same participants distinct.
Reusing the full seed tuple — <spanx style="verb">(payer, payee, mint,
authorizedSigner, salt, openSlot)</spanx> — of a live or
still-<spanx style="verb">Distributed</spanx> channel reverts <spanx style="verb">open</spanx> (the PDA
still holds an initialized <spanx style="verb">Channel</spanx>); resume a live
channel instead of reopening it. Reopening a fully
closed relationship is legal by design and creates a
fresh channel at a <strong>new address</strong>: <spanx style="verb">distribute</spanx>'s
fast path or <spanx style="verb">reclaim</spanx> removed the old PDA, and
because <spanx style="verb">openSlot</spanx> is a PDA seed, the new incarnation
(the same <spanx style="verb">salt</spanx> is fine) necessarily carries a new
<spanx style="verb">openSlot</spanx> and therefore derives a different
<spanx style="verb">channelId</spanx> (see <xref target="channel-closure"/>). A lamport
donation to a deallocated channel address cannot block
reopening, because <spanx style="verb">open</spanx> is prefund-tolerant
(Transfer + Allocate + Assign).</t>

<t><spanx style="verb">open</spanx> does NOT carry an initial voucher; the first
voucher is exchanged off-chain after confirmation.</t>

</section>
<section anchor="settle"><name>settle</name>

<t>Advances the on-chain <spanx style="verb">settled</spanx> watermark using a
voucher signed by <spanx style="verb">authorizedSigner</spanx>. Permissionless;
authority is the voucher signature.</t>

<t><spanx style="verb">settle</spanx> takes no instruction-data arguments; the
voucher is carried entirely by the preceding Ed25519
precompile instruction.</t>

<t>The submitter <bcp14>MUST</bcp14> bundle a Solana native <spanx style="verb">ed25519</spanx>
precompile instruction immediately before <spanx style="verb">settle</spanx>
in the same transaction. The program reads the
verified message bytes via the Instructions sysvar,
decodes the voucher (<spanx style="verb">magic</spanx>, <spanx style="verb">channelId</spanx>,
<spanx style="verb">cumulativeAmount</spanx>, <spanx style="verb">expiresAt</spanx>) from them (see
<xref target="on-chain-voucher-encoding"/>), asserts the <spanx style="verb">magic</spanx>
prefix matches exactly (reference error
<spanx style="verb">VoucherBadMagic</spanx>, code 238), asserts
<spanx style="verb">channelId</spanx> equals the channel PDA address (reference
error <spanx style="verb">VoucherChannelMismatch</spanx>, code 232 — because
<spanx style="verb">openSlot</spanx> is a PDA seed, this address binding also
covers cross-incarnation replay; no separate epoch
check exists), and asserts the
precompile-recorded signer equals <spanx style="verb">authorizedSigner</spanx>.
The program then verifies
<spanx style="verb">settled &lt; cumulativeAmount &lt;= deposit</spanx> and
writes <spanx style="verb">settled = cumulativeAmount</spanx>. No
token transfer occurs in <spanx style="verb">settle</spanx>, and <spanx style="verb">settle</spanx> is
not slot-gated.</t>

</section>
<section anchor="topup"><name>topUp</name>

<t>Payer transfers additional funds to the escrow.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">amount</spanx></c>
      <c>u64</c>
      <c>Amount to add in base units; <bcp14>MUST</bcp14> be non-zero</c>
</texttable>

<t><spanx style="verb">topUp</spanx> requires <spanx style="verb">status == Open</spanx> and <bcp14>MUST</bcp14> be
rejected when <spanx style="verb">status == Closing</spanx>. Implementations
of this specification do NOT clear <spanx style="verb">closureStartedAt</spanx>
via <spanx style="verb">topUp</spanx>. The payer <bcp14>MUST</bcp14> be a signer.</t>

</section>
<section anchor="requestclose"><name>requestClose</name>

<t>Payer initiates a forced close. Sets
<spanx style="verb">closureStartedAt = Clock::get().unix_timestamp</spanx>,
<spanx style="verb">status = Closing</spanx>. Requires <spanx style="verb">status == Open</spanx>. The
payer <bcp14>MUST</bcp14> be a signer.</t>

</section>
<section anchor="seal"><name>seal</name>

<t>Permissionless post-grace crank. Transitions
<spanx style="verb">Closing -&gt; Sealed</spanx> once
<spanx style="verb">now &gt;= closureStartedAt + gracePeriod</spanx>, clears
<spanx style="verb">closureStartedAt</spanx>, and freezes <spanx style="verb">settled</spanx>. No
token transfer occurs.</t>

</section>
<section anchor="settle-and-seal"><name>settleAndSeal</name>

<t>Payee-initiated cooperative close. Optionally
applies one final voucher (using the same
precompile-verified path as <spanx style="verb">settle</spanx>), then
transitions the channel to <spanx style="verb">Sealed</spanx>.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">hasVoucher</spanx></c>
      <c>u8</c>
      <c><spanx style="verb">0</spanx> seals with no settlement (full refund); non-zero verifies and settles the voucher carried by the preceding Ed25519 precompile instruction (read via the Instructions sysvar) before sealing</c>
</texttable>

<t>The payee <bcp14>MUST</bcp14> be a signer. Callable from <spanx style="verb">Open</spanx>
and from <spanx style="verb">Closing</spanx> while <spanx style="verb">now &lt; closureStartedAt + gracePeriod</spanx>;
after the grace deadline use <spanx style="verb">seal</spanx> instead. No
token transfer occurs.</t>

<t>The <spanx style="verb">payee</spanx> <bcp14>MAY</bcp14> be an on-curve address or a
program-derived address (PDA). Because cooperative
close requires a transaction signer equal to
<spanx style="verb">Channel.payee</spanx>, a PDA payee can use this path only
when its owning program invokes <spanx style="verb">settleAndSeal</spanx>
via CPI with signer seeds. The permissionless
<spanx style="verb">settle</spanx>, <spanx style="verb">seal</spanx>, and <spanx style="verb">distribute</spanx> cranks need no
payee signature.</t>

</section>
<section anchor="distribute"><name>distribute</name>

<t>Pays the merchant-side pool out of escrow according
to the splits preimage committed at <spanx style="verb">open</spanx>.
Permissionless; authority is the on-chain hash
commitment.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">distributionSplits</spanx></c>
      <c><spanx style="verb">(Pubkey, u16)[]</spanx></c>
      <c>Splits preimage (see <xref target="splits-canonicalization"/>); rehashed and <bcp14>MUST</bcp14> equal <spanx style="verb">distributionHash</spanx></c>
</texttable>

<t><spanx style="verb">distribute</spanx> takes a fixed head of accounts (channel,
<spanx style="verb">payer</spanx>, <spanx style="verb">rentPayer</spanx>, escrow token account, payer token
account, payee token account, treasury token account,
mint, token program, and program-internal accounts)
followed by the dynamic recipient-ATA tail. The
<spanx style="verb">rentPayer</spanx> account (writable, NOT a signer) <bcp14>MUST</bcp14> be
positioned immediately after <spanx style="verb">payer</spanx> and <bcp14>MUST</bcp14> equal
<spanx style="verb">Channel.rentPayer</spanx>; at the <spanx style="verb">Sealed</spanx> branch it
receives the SOL rent freed by closing the escrow
ATA, plus every lamport of the channel PDA when the
fast path deallocates the account in place (see
<xref target="channel-closure"/>).</t>

<t>Recipient token accounts are supplied as the dynamic
account tail, in the same order as the preimage
entries. Each <bcp14>MUST</bcp14> be the canonical ATA for
<spanx style="verb">(recipient, channel.mint, channel.tokenProgram)</spanx>. A
<spanx style="verb">distribute</spanx> carrying enough recipient accounts to
exceed the legacy transaction account-key budget — in
practice at <spanx style="verb">MAX_DISTRIBUTION_RECIPIENTS</spanx> recipients
(<bcp14>RECOMMENDED</bcp14> 32) — <bcp14>MUST</bcp14> be sent as a version-0
transaction with an address lookup table indexing the
recipient ATAs.</t>

<t>Each beneficiary is paid a cumulative floor delta
keyed to <spanx style="verb">payoutWatermark</spanx>:</t>

<t><list style="symbols">
  <t>recipient <spanx style="verb">i</spanx>:
<spanx style="verb">floor(settled * shareBps[i] / 10000) − floor(payoutWatermark * shareBps[i] / 10000)</spanx>;</t>
  <t>payee (implicit remainder):
<spanx style="verb">floor(settled * (10000 − Σ shareBps) / 10000) − floor(payoutWatermark * (10000 − Σ shareBps) / 10000)</spanx>.</t>
</list></t>

<t><spanx style="verb">distribute</spanx> then advances <spanx style="verb">payoutWatermark</spanx> to
<spanx style="verb">settled</spanx>.</t>

<t>From <spanx style="verb">Open</spanx>, <spanx style="verb">distribute</spanx> requires
<spanx style="verb">settled &gt; payoutWatermark</spanx>, pays the cumulative floor
deltas, leaves flooring-residual dust in the escrow
ATA, advances <spanx style="verb">payoutWatermark</spanx> to <spanx style="verb">settled</spanx>, and keeps
the channel <spanx style="verb">Open</spanx>; later distributions compute fresh
deltas from the advanced watermark, so residual value
remains claimable as a share's cumulative entitlement
crosses the next whole unit. From <spanx style="verb">Sealed</spanx>,
<spanx style="verb">distribute</spanx> additionally — when
<spanx style="verb">payerWithdrawnAt == 0</spanx> — transfers the token refund
<spanx style="verb">deposit - settled</spanx> to the payer, stamps
<spanx style="verb">payerWithdrawnAt</spanx>, sweeps the final irreducible
residual dust to the treasury ATA, and closes the
escrow ATA. None of this token movement is
slot-gated: the <spanx style="verb">Sealed</spanx> branch runs immediately
and <bcp14>MUST NOT</bcp14> emit <spanx style="verb">ChannelCloseTooEarly</spanx>. In the
same instruction, when
<spanx style="verb">clock.slot &gt; openSlot + OPEN_SLOT_WINDOW</spanx> already
holds, the channel PDA is fully deallocated in place
(fast path); otherwise the channel is set to the
terminal <spanx style="verb">Distributed</spanx> status and its rent is recovered
later by the permissionless <spanx style="verb">reclaim</spanx> (see
<xref target="channel-closure"/>). The freed SOL — the escrow ATA
rent plus, at deallocation, every lamport of the
channel PDA, including any prefund surplus — is
drained to <spanx style="verb">Channel.rentPayer</spanx> (the operator), not
the payer; the token refund still goes to the payer.
<spanx style="verb">distribute</spanx> <bcp14>MUST NOT</bcp14> be callable from <spanx style="verb">Closing</spanx> or
<spanx style="verb">Distributed</spanx>.</t>

<t>On a nonzero beneficiary share whose canonical ATA is
unusable — missing or uninitialized, frozen, closed or
malformed, carrying an unsupported Token-2022 account
extension, or with a reassigned authority — that share
is redirected to the treasury ATA, a <spanx style="verb">PayoutRedirected</spanx>
event is emitted, and <spanx style="verb">payoutWatermark</spanx> still advances.
The beneficiary permanently forfeits that share;
repairing the ATA later does not reclaim it, because
future deltas only cover newly settled amounts. The
same redirect applies to the payer refund ATA at
<spanx style="verb">Sealed</spanx> (the same instruction closes the escrow
ATA, so no later crank could pay the
refund). Malformed token-account data and wrong
(non-canonical) accounts hard-fail rather than
redirecting.</t>

</section>
<section anchor="withdrawpayer"><name>withdrawPayer</name>

<t>One-shot payer refund in <spanx style="verb">Sealed</spanx> that does NOT
close or deallocate the channel PDA and is NOT
slot-gated. The program requires
<spanx style="verb">status == Sealed</spanx> and <spanx style="verb">payerWithdrawnAt == 0</spanx>,
transfers <spanx style="verb">deposit - settled</spanx> to the payer, and
stamps <spanx style="verb">payerWithdrawnAt</spanx>. The payer <bcp14>MUST</bcp14> be a
signer.</t>

</section>
<section anchor="reclaim"><name>reclaim</name>

<t>Permissionless rent-recovery crank. Deallocates a
fully drained <spanx style="verb">Distributed</spanx> channel PDA and returns every
remaining lamport to <spanx style="verb">Channel.rentPayer</spanx>. By the
time a channel is <spanx style="verb">Distributed</spanx>, every token leg has been
paid and the escrow ATA has been closed by the
<spanx style="verb">Sealed</spanx> <spanx style="verb">distribute</spanx>; the only value left at the
address is the PDA's own SOL rent, so delaying
<spanx style="verb">reclaim</spanx> delays nobody's money.</t>

<t><spanx style="verb">reclaim</spanx> takes no instruction-data arguments and no
signers, and exactly two accounts:</t>

<texttable>
      <ttcol align='left'>Index</ttcol>
      <ttcol align='left'>Account</ttcol>
      <ttcol align='left'>Signer</ttcol>
      <ttcol align='left'>Writable</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0</c>
      <c><spanx style="verb">channel</spanx></c>
      <c>No</c>
      <c>Yes</c>
      <c>Channel PDA; <bcp14>MUST</bcp14> be <spanx style="verb">Distributed</spanx>. Deallocated; all lamports drained</c>
      <c>1</c>
      <c><spanx style="verb">rentPayer</spanx></c>
      <c>No</c>
      <c>Yes</c>
      <c><bcp14>MUST</bcp14> equal the recorded <spanx style="verb">Channel.rentPayer</spanx>; receives every remaining lamport</c>
</texttable>

<t><spanx style="verb">reclaim</spanx> <bcp14>MUST</bcp14> require <spanx style="verb">status == Distributed</spanx>, <bcp14>MUST</bcp14>
verify the supplied <spanx style="verb">rentPayer</spanx> account equals the
recorded <spanx style="verb">Channel.rentPayer</spanx>, and <bcp14>MUST</bcp14> reject with
reference error <spanx style="verb">ChannelCloseTooEarly</spanx> (code 2414)
until <spanx style="verb">clock.slot &gt; openSlot + OPEN_SLOT_WINDOW</spanx>; a
rejected <spanx style="verb">reclaim</spanx> is safely retryable once the
window elapses. The gate exists solely to keep the
address occupied through the epoch window — the
address-never-repeats invariant of
<xref target="reincarnation-replay"/> — not to sequence any
payment.</t>

<t>Because <spanx style="verb">reclaim</spanx> needs only two writable accounts
and no signers, operators <bcp14>SHOULD</bcp14> batch many
<spanx style="verb">reclaim</spanx> instructions into a single periodic sweep
transaction. <spanx style="verb">reclaim</spanx> is unnecessary for a channel
whose terminal <spanx style="verb">distribute</spanx> ran after the window had
already elapsed: the fast path deallocates directly
(see <xref target="channel-closure"/>).</t>

</section>
<section anchor="channel-closure"><name>Channel Closure</name>

<t>Closure is two-phase: all value moves immediately,
and only the recovery of the channel PDA's own rent
waits for an epoch window.</t>

<t><strong>Phase 1 — drain (immediate).</strong> The <spanx style="verb">Sealed</spanx>
branch of <spanx style="verb">distribute</spanx> pays the merchant-side
cumulative deltas, refunds <spanx style="verb">deposit - settled</spanx> to
the payer (when not already withdrawn), sweeps
residual dust to the treasury, and closes the escrow
ATA, returning the escrow-ATA rent to
<spanx style="verb">Channel.rentPayer</spanx>. None of this is slot-gated: the
epoch window never delays a payout or a refund.</t>

<t><strong>Phase 2 — deallocate (window-gated).</strong> After the
drain, the channel holds only its own PDA rent. When
<spanx style="verb">clock.slot &gt; openSlot + OPEN_SLOT_WINDOW</spanx> already
holds, <spanx style="verb">distribute</spanx> deallocates the PDA in the same
instruction (fast path): every lamport — the rent
funded at <spanx style="verb">open</spanx> plus any prefund surplus — is
drained to <spanx style="verb">Channel.rentPayer</spanx> (the operator that
funded the rent at <spanx style="verb">open</spanx>), not the payer, the
account data is zeroed, and the runtime
garbage-collects the account. Otherwise <spanx style="verb">distribute</spanx>
sets <spanx style="verb">status = Distributed</spanx>: the channel is fully drained
and inert to every instruction except <spanx style="verb">reclaim</spanx>, and
its continued existence keeps the address occupied
until the window elapses, when the permissionless
<spanx style="verb">reclaim</spanx> deallocates it identically. Once
deallocated, the address becomes reopenable as a new
incarnation. <spanx style="verb">withdrawPayer</spanx> <bcp14>MUST NOT</bcp14> close or
deallocate the channel.</t>

<t>Full deallocation is safe against voucher replay
because the channel address is per-incarnation by
construction: <spanx style="verb">openSlot</spanx> is a PDA seed, so <spanx style="verb">channelId</spanx>
alone identifies one incarnation and an address can
never host two channels. <spanx style="verb">openSlot</spanx> is a
client-supplied per-incarnation epoch carried in the
<spanx style="verb">open</spanx> instruction data and validated on-chain
against the Clock sysvar:</t>

<figure><artwork><![CDATA[
openSlot <= clock.slot
clock.slot - openSlot <= OPEN_SLOT_WINDOW
]]></artwork></figure>

<t>where <spanx style="verb">OPEN_SLOT_WINDOW = 1500</spanx> slots (approximately
10 minutes at 400 ms slots; the window is measured in
slots and <bcp14>MUST</bcp14> be at least the 150-block blockhash
validity, so any deliverable transaction passes it at
any slot duration). Future slots are strictly rejected
(reference error <spanx style="verb">OpenSlotOutOfWindow</spanx>, code 2003):
a far-future <spanx style="verb">openSlot</spanx> would otherwise break the
uniqueness argument below and push the reclaim gate
arbitrarily far out, permanently stranding the
operator's PDA rent.</t>

<t>Only <spanx style="verb">reclaim</spanx> carries the slot gate: it <bcp14>MUST</bcp14> reject
with reference error <spanx style="verb">ChannelCloseTooEarly</spanx> (code
2414) until
<spanx style="verb">clock.slot &gt; openSlot + OPEN_SLOT_WINDOW</spanx>, and a
rejected <spanx style="verb">reclaim</spanx> is safely retryable. <spanx style="verb">distribute</spanx>
<bcp14>MUST NOT</bcp14> emit <spanx style="verb">ChannelCloseTooEarly</spanx>; when the
window has not yet elapsed, its <spanx style="verb">Sealed</spanx> branch
simply leaves the channel <spanx style="verb">Distributed</spanx> instead of
deallocating it. <spanx style="verb">withdrawPayer</spanx>, <spanx style="verb">settle</spanx>,
<spanx style="verb">settleAndSeal</spanx>, <spanx style="verb">seal</spanx>, and both branches
of <spanx style="verb">distribute</spanx> are NOT slot-gated; only the PDA
deallocation — rent recovery — waits.</t>

<t>Together, the open window and the occupied address
guarantee that a channel address never repeats: the
address stays occupied — live, then <spanx style="verb">Distributed</spanx> —
until some slot strictly greater than
<spanx style="verb">openSlot + OPEN_SLOT_WINDOW</spanx>, and from then on the
<spanx style="verb">openSlot</spanx> baked into the address's seeds is too
stale for <spanx style="verb">open</spanx> to ever re-derive it. A voucher
bound to an earlier incarnation can never settle
against a later one, because the later incarnation
lives at a different address. See
<xref target="reincarnation-replay"/> for the uniqueness
argument and the constraint on evolving
<spanx style="verb">OPEN_SLOT_WINDOW</spanx>.</t>

<t>Because the client chooses <spanx style="verb">openSlot</spanx>, it can derive
the channel address (<spanx style="verb">openSlot</spanx> is one of the PDA
derivation inputs) at transaction-build time and <bcp14>MAY</bcp14>
construct and sign vouchers before the open
transaction confirms; no post-open read-back is
required to produce a voucher. The open-landing window and the reclaim
unlock share the same <spanx style="verb">OPEN_SLOT_WINDOW</spanx> budget
measured from the supplied slot — but the only thing
the window delays is the operator's recovery of the
channel PDA's own rent (roughly 2.7 million lamports
per channel, for at most the window). Supplying the
current slot maximizes landing safety at the cost of
the full rent float; back-dating <spanx style="verb">openSlot</spanx> by <spanx style="verb">k</spanx>
slots shrinks the landing window to
<spanx style="verb">OPEN_SLOT_WINDOW − k</spanx> slots and shortens the rent
float — a close landing after the dated window even
takes <spanx style="verb">distribute</spanx>'s fast path and skips <spanx style="verb">reclaim</spanx>
entirely. Back-dating never affects payout or refund
latency, which is zero-wait either way.</t>

<t>Because <spanx style="verb">reclaim</spanx> takes only two writable accounts
and no signers, operators <bcp14>SHOULD</bcp14> run a periodic
sweep that batches many <spanx style="verb">reclaim</spanx> instructions per
transaction across their <spanx style="verb">Distributed</spanx> channels.</t>

<t>Implementations <bcp14>MUST NOT</bcp14> treat a fee-payer
signature as satisfying payer or payee authority
checks on any authority-gated instruction above.</t>

</section>
</section>
<section anchor="grace-period"><name>Grace Period</name>

<t>The grace period (<bcp14>RECOMMENDED</bcp14>: 15 minutes) protects
the payee. If the payer calls <spanx style="verb">requestClose</spanx> while
the payee has unsubmitted vouchers, the payee has
until the grace period expires to call <spanx style="verb">settle</spanx>
followed by <spanx style="verb">settleAndSeal</spanx> (or to bundle a
voucher into <spanx style="verb">settleAndSeal</spanx> directly).</t>

<t>Without a grace period, the payer could
<spanx style="verb">requestClose</spanx>, immediately call <spanx style="verb">seal</spanx>, and
sweep funds before the server has time to settle.</t>

</section>
<section anchor="access-control"><name>Access Control</name>

<texttable>
      <ttcol align='left'>Instruction</ttcol>
      <ttcol align='left'>Caller</ttcol>
      <ttcol align='left'>Gating</ttcol>
      <c>open</c>
      <c>Payer</c>
      <c>Payer signs the deposit transfer</c>
      <c>settle</c>
      <c>Anyone (permissionless crank)</c>
      <c>Precompile-verified Ed25519 voucher from <spanx style="verb">authorizedSigner</spanx></c>
      <c>topUp</c>
      <c>Payer</c>
      <c>Payer signs the additional transfer; rejected when <spanx style="verb">status != Open</spanx></c>
      <c>requestClose</c>
      <c>Payer</c>
      <c>Payer signer equals channel <spanx style="verb">payer</spanx></c>
      <c>seal</c>
      <c>Anyone (permissionless crank)</c>
      <c><spanx style="verb">status == Closing</spanx> and elapsed grace period</c>
      <c>settleAndSeal</c>
      <c>Payee</c>
      <c>Payee signer equals channel <spanx style="verb">payee</spanx></c>
      <c>distribute</c>
      <c>Anyone (permissionless crank)</c>
      <c>On-chain hash commitment to splits preimage; never slot-gated (the <spanx style="verb">Sealed</spanx> branch deallocates the PDA in place only when the epoch window has already elapsed; see <xref target="channel-closure"/>)</c>
      <c>withdrawPayer</c>
      <c>Payer</c>
      <c>Payer signer equals channel <spanx style="verb">payer</spanx> and <spanx style="verb">status == Sealed</spanx></c>
      <c>reclaim</c>
      <c>Anyone (permissionless crank)</c>
      <c><spanx style="verb">status == Distributed</spanx>, supplied <spanx style="verb">rentPayer</spanx> equals the recorded <spanx style="verb">Channel.rentPayer</spanx>, and <spanx style="verb">clock.slot &gt; openSlot + OPEN_SLOT_WINDOW</spanx> (see <xref target="channel-closure"/>)</c>
</texttable>

</section>
<section anchor="account-shapes-and-events"><name>Account Shapes and Events</name>

<t>Every instruction takes an exact account list and
rejects transactions with missing OR extra accounts.
The only dynamic account tail is <spanx style="verb">distribute</spanx>'s
recipient token accounts (one canonical ATA per active
preimage entry, in preimage order). Conforming
generated clients enforce the same shapes, so callers
cannot pad an instruction with unexpected accounts.</t>

<t>The channel program declares two events in its IDL:
<spanx style="verb">Opened</spanx> (emitted by <spanx style="verb">open</spanx>) and <spanx style="verb">PayoutRedirected</spanx>
(emitted by <spanx style="verb">distribute</spanx> when a beneficiary share is
redirected to the treasury; see <xref target="payout-forfeiture"/>).
Each event carries an 8-byte discriminator so
IDL-driven indexers can decode it without custom
tooling.</t>

</section>
</section>
<section anchor="request-schema"><name>Request Schema</name>

<section anchor="shared-fields"><name>Shared Fields</name>

<dl>
  <dt>amount</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Price per unit of service in the token's
smallest unit, encoded as a decimal string.</t>
  </dd>
  <dt>unitType</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Unit being priced (for example,
<spanx style="verb">"request"</spanx>, <spanx style="verb">"token"</spanx>, or <spanx style="verb">"byte"</spanx>).</t>
  </dd>
  <dt>suggestedDeposit</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Suggested initial channel deposit in base
units. Clients <bcp14>MAY</bcp14> deposit less or more depending on
expected usage.</t>
  </dd>
  <dt>minimumDeposit</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Hard floor on initial channel deposit in
base units. Enforced at the HTTP layer (not on
chain). Servers <bcp14>MUST</bcp14> reject <spanx style="verb">POST /channel/open</spanx>
payloads with <spanx style="verb">depositAmount &lt; minimumDeposit</spanx>.
Implementations <bcp14>SHOULD</bcp14> set this to a minimum
economically useful balance to avoid spam; channel
rent is fully recovered at close (see
<xref target="channel-closure"/>), so the floor guards
signature-verification and settlement overhead
rather than storage cost.</t>
  </dd>
  <dt>recipient</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Base58-encoded public key of the server's
account that will receive settlement funds.</t>
  </dd>
  <dt>currency</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Base58-encoded SPL token mint address.
Native SOL is not supported; clients wishing to pay
in SOL <bcp14>MUST</bcp14> wrap it to wSOL
(<spanx style="verb">So11111111111111111111111111111111111111112</spanx>)
before opening a channel.</t>
  </dd>
  <dt>description</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Human-readable description of the service
or resource being paid for.</t>
  </dd>
  <dt>externalId</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Merchant reference for reconciliation or
audit correlation.</t>
  </dd>
</dl>

</section>
<section anchor="method-details"><name>Method Details</name>

<dl>
  <dt>network</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Solana cluster identifier. <bcp14>MUST</bcp14> be one of
"mainnet", "devnet", or "localnet".
There is no default; the challenge <bcp14>MUST</bcp14> state the
cluster explicitly.</t>
  </dd>
  <dt>channelProgram</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. Base58-encoded address of the on-chain
channel program, which <bcp14>MUST</bcp14> be the program explicitly
deployed for the selected <spanx style="verb">network</spanx>. Clients <bcp14>MUST</bcp14>
verify this matches their expected program for that
cluster before depositing funds.</t>
  </dd>
  <dt>channelId</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Existing channel identifier to resume. When
present, clients <bcp14>SHOULD</bcp14> verify the referenced channel
is open and sufficiently funded before reuse.</t>
  </dd>
  <dt>recentBlockhash</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14> when <spanx style="verb">channelId</spanx> is absent and <bcp14>MUST</bcp14> be absent
when resuming an existing channel. Base58-encoded recent blockhash for
the client to use when constructing the open transaction. The server
<bcp14>MUST</bcp14> obtain it from the selected <spanx style="verb">network</spanx>, and the client <bcp14>MUST</bcp14> use it
as the transaction message's recent blockhash.</t>
  </dd>
  <dt>recentSlot</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14> when <spanx style="verb">channelId</spanx> is absent and <bcp14>MUST</bcp14> be absent
when resuming an existing channel. Decimal-string u64 identifying the
RPC context slot associated with <spanx style="verb">recentBlockhash</spanx>. It provides the
reference from which the client selects the open credential's
<spanx style="verb">openSlot</spanx> without making its own RPC request.</t>
  </dd>
  <dt>decimals</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. Token decimal places (0–9).
<bcp14>MUST</bcp14> be present when <spanx style="verb">currency</spanx> is a mint address.</t>
  </dd>
  <dt>tokenProgram</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Base58-encoded token program ID for the
mint in <spanx style="verb">currency</spanx>. <bcp14>MUST</bcp14> be either the SPL Token
Program or the Token-2022 Program when present. If
omitted for a mint-based <spanx style="verb">currency</spanx>, clients <bcp14>MUST</bcp14>
determine the correct token program from on-chain
state before constructing token instructions.</t>
  </dd>
  <dt>feePayer</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. If <spanx style="verb">true</spanx>, the server sponsors transaction
fees for open, topUp, and close operations. When
<spanx style="verb">true</spanx>, <spanx style="verb">feePayerKey</spanx> <bcp14>MUST</bcp14> also be present.</t>
  </dd>
  <dt>feePayerKey</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. Base58-encoded public key
of the server's fee payer account.</t>
  </dd>
  <dt>voucherSigner</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Party that signs cumulative vouchers. <bcp14>MUST</bcp14> be either
<spanx style="verb">client</spanx> or <spanx style="verb">operator</spanx>. Defaults to <spanx style="verb">client</spanx>.</t>
  </dd>
  <dt>operator</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14> when <spanx style="verb">voucherSigner</spanx> is <spanx style="verb">operator</spanx>.
Base58-encoded Ed25519 public key that <bcp14>MUST</bcp14> equal
the channel's <spanx style="verb">authorizedSigner</spanx>. The operator signs cumulative
vouchers after authenticated requests are metered. This key <bcp14>MAY</bcp14>
equal <spanx style="verb">feePayerKey</spanx>, but the fields describe separate roles.</t>
  </dd>
  <dt>minVoucherDelta</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Minimum amount increase between accepted
vouchers.</t>
  </dd>
  <dt>ttlSeconds</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Suggested session duration in seconds. This
field does not change the idle-timeout negotiation
defined in <xref target="idle-timeout"/>.</t>
  </dd>
  <dt>idleTimeoutOptionsSeconds</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Server-supported inactivity thresholds for
a new channel, in seconds. When present, this <bcp14>MUST</bcp14> be
a non-empty, strictly increasing array of distinct
integers from 1 through 2592000, inclusive (1 second
through 30 days). When omitted, the server selects the
effective timeout at its discretion and the client
cannot request a specific value. For example, a server can
advertise
<spanx style="verb">[30, 600, 86400]</spanx>. The client selects one option in
its <spanx style="verb">open</spanx> credential or lets the server choose. This
field <bcp14>MUST</bcp14> be absent when <spanx style="verb">channelId</spanx> is present. See
<xref target="idle-timeout"/>.</t>
  </dd>
  <dt>idleTimeoutSeconds</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14> when <spanx style="verb">channelId</spanx> is present.
Effective negotiated threshold for the resumed
channel, as an integer from 1 through 2592000 seconds,
inclusive (1 second through 30 days). This field <bcp14>MUST</bcp14>
be absent from a challenge for a new channel. The value
is server-side state and is not stored in the on-chain
channel account.</t>
  </dd>
  <dt>gracePeriodSeconds</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. Grace period for forced close
when <spanx style="verb">channelId</spanx> is absent (<bcp14>RECOMMENDED</bcp14>: 900).
Stored per-channel in <spanx style="verb">Channel.gracePeriod</spanx> at
<spanx style="verb">open</spanx>. The value <bcp14>MUST</bcp14> be greater than zero.</t>
  </dd>
  <dt>distributionSplits</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Ordered list of <spanx style="verb">{recipient, shareBps}</spanx>
entries the merchant proposes to bind into the
channel at <spanx style="verb">open</spanx>. The payee receives the implicit
remainder share <spanx style="verb">10000 − Σ shareBps</spanx>; the explicit
list therefore covers only co-recipients, not the
payee itself.
</t>

    <t>Each entry <bcp14>MUST</bcp14> have <spanx style="verb">shareBps &gt; 0</spanx>. The list <bcp14>MUST</bcp14>
satisfy <spanx style="verb">0 ≤ Σ shareBps ≤ 10000</spanx>. The list size is
bounded by an implementation-defined
<spanx style="verb">MAX_DISTRIBUTION_RECIPIENTS</spanx> (<bcp14>RECOMMENDED</bcp14>: 32).</t>

    <t>When omitted, the channel behaves as a vanilla
two-party channel in which the payee receives the
full distributed pool.</t>
  </dd>
</dl>

<t>For the <spanx style="verb">session</spanx> intent, <spanx style="verb">amount</spanx> specifies the price
per unit of service, not a total charge. When
<spanx style="verb">unitType</spanx> is present, clients can estimate cost
before a session begins:</t>

<figure><artwork><![CDATA[
total = amount × units_consumed
]]></artwork></figure>

</section>
</section>
<section anchor="credential-schema"><name>Credential Schema</name>

<t>The credential payload uses a discriminated union on
the <spanx style="verb">action</spanx> field. Five actions are defined.</t>

<t>These actions map to the abstract session lifecycle
operations of <xref target="I-D.payment-intent-session"/> as
follows:</t>

<texttable>
      <ttcol align='left'>Abstract Operation</ttcol>
      <ttcol align='left'>This Method's action</ttcol>
      <c>Open</c>
      <c><spanx style="verb">open</spanx></c>
      <c>Use</c>
      <c><spanx style="verb">voucher</spanx> for <spanx style="verb">client</spanx>; <spanx style="verb">use</spanx> for <spanx style="verb">operator</spanx></c>
      <c>Top-Up</c>
      <c><spanx style="verb">topUp</spanx></c>
      <c>Close</c>
      <c><spanx style="verb">close</spanx></c>
</texttable>

<section anchor="session-bearer-proof"><name>Session Bearer Proof</name>

<t>An operator-signed channel uses one payer-signed proof for <spanx style="verb">Open</spanx> and
each subsequent <spanx style="verb">Use</spanx>. It authorizes access, not payment.</t>

<t>The client derives <spanx style="verb">channelId</spanx> from the channel program and open
parameters, then constructs this JCS <xref target="RFC8785"/> object:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "channelId": "<base58 channel address>",
  "domain": "mpp-session-auth-v1",
  "payer": "<base58 payer public key>",
  "sessionChallengeId": "<session challenge id>"
}
]]></sourcecode></figure>

<t>The client signs the UTF-8 bytes of the JCS serialization with the
Ed25519 private key corresponding to <spanx style="verb">payer</spanx>. The resulting
<spanx style="verb">authentication</spanx> object has this shape:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>The string <spanx style="verb">"proof"</spanx></c>
      <c><spanx style="verb">challengeId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Session challenge ID signed as <spanx style="verb">sessionChallengeId</spanx></c>
      <c><spanx style="verb">payer</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 Ed25519 public key that produced the proof</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 encoding of the 64-byte Ed25519 signature</c>
</texttable>

<t>At open, the server <bcp14>MUST</bcp14> verify the session challenge and signature.
The proof's <spanx style="verb">challengeId</spanx>, <spanx style="verb">channelId</spanx>, and <spanx style="verb">payer</spanx> <bcp14>MUST</bcp14> equal the
opening challenge ID, declared and derived channel ID, and transaction
payer. The verified challenge transitively binds its remaining policy.
The server <bcp14>MUST</bcp14> bind the proof to exactly one channel; its verifier
storage is implementation-defined.</t>

<t>For a subsequent <spanx style="verb">use</spanx> action, the outer Payment credential <bcp14>MUST</bcp14> echo
the same session challenge that was bound at open and <bcp14>MUST</bcp14> carry the
same <spanx style="verb">authentication</spanx> field values. The server <bcp14>MUST</bcp14> verify the proof
against the bound channel state. The challenge's <spanx style="verb">expires</spanx> auth-param
limits opening the binding, not later use by the open channel. The
channel idle timeout still applies.</t>

<t>Repeated presentation is the expected bearer-proof behavior for the
generic session <spanx style="verb">Use</spanx> operation. It <bcp14>MUST NOT</bcp14> be treated as fulfillment
of a <spanx style="verb">charge</spanx> intent or rejected merely because it was previously
presented. The proof remains valid while the channel is open, including
when it temporarily has insufficient capacity. It becomes invalid when
close begins or the channel otherwise becomes terminal.</t>

<t>The <spanx style="verb">authentication</spanx> object cannot by itself open, fund, top up, or
settle a channel. The open transaction and cumulative vouchers remain
the payment proofs and retain their normal replay protections.</t>

</section>
<section anchor="action-open"><name>Action: "open"</name>

<t>Opens a new payment channel.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">action</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"open"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 channel account address</c>
      <c><spanx style="verb">payer</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 public key of the depositor</c>
      <c><spanx style="verb">payee</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 public key of the channel payee (matches <spanx style="verb">recipient</spanx> in the 402 challenge)</c>
      <c><spanx style="verb">mint</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 SPL Token / Token-2022 mint (matches <spanx style="verb">currency</spanx> in the 402 challenge)</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 public key bound into the PDA seeds as the voucher signer; <bcp14>MAY</bcp14> equal <spanx style="verb">payer</spanx> or a delegated signer</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Decimal u64 PDA disambiguator</c>
      <c><spanx style="verb">depositAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Initial deposit in base units; <bcp14>MUST</bcp14> equal the decoded <spanx style="verb">open</spanx> deposit and satisfy <spanx style="verb">depositAmount &gt;= minimumDeposit</spanx> (when the challenge sets one)</c>
      <c><spanx style="verb">gracePeriodSeconds</spanx></c>
      <c>integer</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Grace-period seconds bound into channel state at <spanx style="verb">open</spanx>; <bcp14>MUST</bcp14> be greater than zero and <bcp14>MUST</bcp14> match the challenge's <spanx style="verb">methodDetails.gracePeriodSeconds</spanx></c>
      <c><spanx style="verb">idleTimeoutSeconds</spanx></c>
      <c>integer</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Client-selected inactivity threshold; <bcp14>MAY</bcp14> be present only when the challenge advertises <spanx style="verb">idleTimeoutOptionsSeconds</spanx> and <bcp14>MUST</bcp14> exactly match an offered value; when omitted, lets the server select the effective value</c>
      <c><spanx style="verb">openSlot</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Decimal u64 per-incarnation epoch encoded into the open instruction as <spanx style="verb">open_slot</spanx>; <bcp14>MUST</bcp14> be no greater than the challenge's <spanx style="verb">methodDetails.recentSlot</spanx> and <bcp14>MUST</bcp14> satisfy the on-chain window rule of <xref target="channel-closure"/> when the transaction executes. Also a PDA derivation input: servers <bcp14>MUST</bcp14> include it when re-deriving and validating <spanx style="verb">channelId</spanx></c>
      <c><spanx style="verb">distributionSplits</spanx></c>
      <c>array</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Splits preimage (see the challenge's <spanx style="verb">methodDetails.distributionSplits</spanx>); <bcp14>MUST</bcp14> byte-match the splits proposed in the 402 challenge</c>
      <c><spanx style="verb">authorizationPolicy</spanx></c>
      <c>object</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Voucher signer policy. When present, <bcp14>MUST</bcp14> be consistent with <spanx style="verb">authorizedSigner</spanx></c>
      <c><spanx style="verb">authentication</spanx></c>
      <c>object</c>
      <c>Conditionally <bcp14>REQUIRED</bcp14></c>
      <c>Reusable proof from <xref target="session-bearer-proof"/>; <bcp14>REQUIRED</bcp14> for <spanx style="verb">operator</spanx> and <bcp14>MUST</bcp14> be absent for <spanx style="verb">client</spanx></c>
      <c><spanx style="verb">transaction</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base64-encoded (standard alphabet, padded) signed or partially signed transaction</c>
      <c><spanx style="verb">capabilities</spanx></c>
      <c>object</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Implementation-specific extensions</c>
</texttable>

<t>The <spanx style="verb">transaction</spanx> contains the open instruction(s).
When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the client partially signs
(transfer authority only) and the server co-signs as
fee payer before broadcasting — same pattern as the
charge intent's pull mode.</t>

<t><spanx style="verb">Action: "open"</spanx> <bcp14>MUST NOT</bcp14> carry an initial voucher.
The first voucher is exchanged off-chain in a
subsequent metered request, after the channel is
confirmed on-chain. This keeps the open path
focused on channel construction and avoids burning
on-chain compute on a signature for a single
request's worth of authorization.</t>

<t>Clients <bcp14>SHOULD</bcp14> set <spanx style="verb">openSlot</spanx> to the challenge's
<spanx style="verb">methodDetails.recentSlot</spanx> and <bcp14>MUST</bcp14> use the challenged
<spanx style="verb">recentBlockhash</spanx> in the transaction. A client <bcp14>MAY</bcp14> choose an earlier
<spanx style="verb">openSlot</spanx> to shorten the operator's post-close rent float. Because the
client chooses <spanx style="verb">openSlot</spanx> — and it is one of
the PDA derivation inputs — it can derive the
channel address before the open transaction confirms
and <bcp14>MAY</bcp14> pre-sign vouchers for the new channel
immediately; no post-open read-back is required.
Back-dating <spanx style="verb">openSlot</spanx> by <spanx style="verb">k</spanx> slots shrinks the
transaction-landing window to <spanx style="verb">OPEN_SLOT_WINDOW − k</spanx>
slots and shortens the operator's post-close rent
float (see <xref target="channel-closure"/>); it has no effect on
payout or refund latency, and a future slot is
always rejected on-chain.</t>

<t><spanx style="verb">Action: "open"</spanx> <bcp14>MUST NOT</bcp14> carry a <spanx style="verb">bump</spanx> field. The
channel PDA's canonical bump is derived on-chain via
<spanx style="verb">find_program_address</spanx> and validated by the program's
direct address check, so any wire-supplied bump is
redundant. Servers <bcp14>MUST</bcp14> reject open envelopes that
include a <spanx style="verb">bump</spanx> field using the <spanx style="verb">malformed-credential</spanx>
problem type. Silently accepting and ignoring a wire
<spanx style="verb">bump</spanx> is forbidden because a client whose derivation
is buggy can compute a wrong bump that nonetheless
pairs with the canonical PDA address — a mismatch the
on-chain address check cannot catch.</t>

<t>Servers <bcp14>MUST</bcp14> treat the decoded <spanx style="verb">transaction</spanx>, not the
HTTP envelope, as the authoritative open request
before signing, paying fees, or broadcasting. Servers
<bcp14>MUST</bcp14> reject <spanx style="verb">Action: "open"</spanx> credentials when the
challenge, HTTP payload, decoded transaction, derived
PDA, escrow ATA, token program, or confirmed on-chain
state disagree. See <xref target="open-settlement"/> for the
required decoding and validation sequence.</t>

<t>For <spanx style="verb">client</spanx>, the client controls <spanx style="verb">authorizedSigner</spanx>. For <spanx style="verb">operator</spanx>,
<spanx style="verb">authorizedSigner</spanx> <bcp14>MUST</bcp14> equal the challenged <spanx style="verb">operator</spanx>,
and the server <bcp14>MUST</bcp14> verify <spanx style="verb">authentication</spanx> before broadcasting the
open transaction. The public transaction proves authorization of the
deposit and operator settlement key; it does not authenticate later
metered requests.</t>

<t>Example <spanx style="verb">open</spanx> credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "action": "open",
  "channelId": "C4HnVjA7WMUtSQzAv4G6T3qBjLwK5jM7PvE2nQ5sZ3kP",
  "payer":     "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
  "payee":     "FNvFqYn4yV7HsoZyHRsbsj1Vd2HFcUe2NMRJq3rJxg7c",
  "mint":      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "authorizedSigner":
               "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
  "salt": "42",
  "depositAmount": "10000000",
  "gracePeriodSeconds": 900,
  "idleTimeoutSeconds": 86400,
  "openSlot": "352114093",
  "transaction": "AQAB...base64..."
}
]]></sourcecode></figure>

<t>For <spanx style="verb">voucherSigner="operator"</spanx>, the relevant decoded <spanx style="verb">open</spanx> fields
include the operator key and bearer proof:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "action": "open",
  "channelId": "C4HnVjA7WMUtSQzAv4G6T3qBjLwK5jM7PvE2nQ5sZ3kP",
  "payer": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
  "authorizedSigner": "5fKb5cF22cFybZB1H4hLDydFhwoQy9JzKzRWaSbMkB6h",
  "authentication": {
    "type": "proof",
    "challengeId": "c_8d0e3b5a9f2c1d4e",
    "payer": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
    "signature": "4vJ9...base58 Ed25519 signature...Qd"
  },
  "transaction": "AQAB...base64..."
}
]]></sourcecode></figure>

<t>Subsequent requests reuse the same <spanx style="verb">authentication</spanx> field:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "action": "use",
  "channelId": "C4HnVjA7WMUtSQzAv4G6T3qBjLwK5jM7PvE2nQ5sZ3kP",
  "authentication": {
    "type": "proof",
    "challengeId": "c_8d0e3b5a9f2c1d4e",
    "payer": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
    "signature": "4vJ9...base58 Ed25519 signature...Qd"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="action-voucher"><name>Action: "voucher"</name>

<t>Submits a new voucher authorizing additional spend.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">action</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"voucher"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Existing channel identifier</c>
      <c><spanx style="verb">voucher</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Signed voucher (see <xref target="voucher-format"/>)</c>
</texttable>

<t>This action is entirely off-chain. No transaction
is broadcast. A <spanx style="verb">voucher</spanx> action directly authorizes service only for
<spanx style="verb">client</spanx>. In <spanx style="verb">operator</spanx> mode, vouchers are operator-generated
settlement artifacts and <bcp14>MUST NOT</bcp14> authenticate the caller.</t>

</section>
<section anchor="action-use"><name>Action: "use"</name>

<t>Authenticates a metered request under an operator-signed channel.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">action</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"use"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Existing operator-signed channel identifier</c>
      <c><spanx style="verb">authentication</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Reusable proof bound at open, as defined in <xref target="session-bearer-proof"/></c>
</texttable>

<t>This action is valid only when <spanx style="verb">voucherSigner</spanx> is <spanx style="verb">operator</spanx>.
After authenticating the request, the operator meters the delivered
service and signs the corresponding cumulative voucher.</t>

</section>
<section anchor="action-topup"><name>Action: "topUp"</name>

<t>Adds funds to an existing channel.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">action</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"topUp"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Existing channel identifier</c>
      <c><spanx style="verb">additionalAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Amount to add in base units</c>
      <c><spanx style="verb">transaction</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base64-encoded signed topUp transaction</c>
</texttable>

</section>
<section anchor="action-close"><name>Action: "close"</name>

<t>Requests cooperative close.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">action</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"close"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Existing channel identifier</c>
      <c><spanx style="verb">voucher</spanx></c>
      <c>object</c>
      <c>Conditionally <bcp14>REQUIRED</bcp14></c>
      <c><bcp14>REQUIRED</bcp14> for <spanx style="verb">client</spanx> and <bcp14>MUST</bcp14> be absent for <spanx style="verb">operator</spanx>; authenticates close and <bcp14>MAY</bcp14> advance settlement (see <xref target="voucher-format"/>)</c>
      <c><spanx style="verb">authentication</spanx></c>
      <c>object</c>
      <c>Conditionally <bcp14>REQUIRED</bcp14></c>
      <c>Reusable proof; <bcp14>REQUIRED</bcp14> for <spanx style="verb">operator</spanx> and <bcp14>MUST</bcp14> be absent for <spanx style="verb">client</spanx></c>
</texttable>

<t><spanx style="verb">Action: "close"</spanx> is a request for the server to
broadcast <spanx style="verb">settleAndSeal</spanx> (optionally bundled
with <spanx style="verb">distribute</spanx> in the same transaction). Unlike
<spanx style="verb">Action: "open"</spanx> and <spanx style="verb">Action: "topUp"</spanx>, the
close credential does NOT carry a pre-signed
transaction: cooperative close requires the payee
signature, which the server controls, and the
server constructs and broadcasts the transaction
itself.</t>

<t>For <spanx style="verb">operator</spanx>, the server <bcp14>MUST</bcp14> verify <spanx style="verb">authentication</spanx> against the
channel before initiating cooperative close. For <spanx style="verb">client</spanx>, the server
<bcp14>MUST</bcp14> verify the voucher signature and channel binding. A voucher with
<spanx style="verb">cumulativeAmount &gt; settled</spanx> advances settlement. A voucher at or below
<spanx style="verb">settled</spanx> <bcp14>MUST</bcp14> equal the server's <spanx style="verb">acceptedCumulative</spanx>, authenticates
close only, and <bcp14>MUST NOT</bcp14> be submitted as a settlement update. This
permits authenticated close when no additional payment is due.</t>

<t>See <xref target="close-cooperative"/> for the full settlement
procedure, including how <spanx style="verb">settleAndSeal</spanx> and
<spanx style="verb">distribute</spanx> are bundled.</t>

</section>
</section>
<section anchor="voucher-format"><name>Voucher Format</name>

<section anchor="voucher-data"><name>Voucher Data</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel this voucher authorizes</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Total authorized spend (base units)</c>
      <c><spanx style="verb">expiresAt</spanx></c>
      <c>integer</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Voucher expiration as a Unix timestamp in seconds (i64); <spanx style="verb">0</spanx> or omitted means no expiration. Encoded verbatim into the signed Borsh payload (see <xref target="on-chain-voucher-encoding"/>); no string/timezone conversion is performed at sign or verify time.</c>
</texttable>

<t>All other channel context (payer, recipient, token,
program, and signer policy) is established by the
on-chain channel state and the deterministic PDA
derivation defined above. The voucher only needs to
identify the channel — <spanx style="verb">channelId</spanx> — and authorize a
cumulative amount, because <spanx style="verb">channelId</spanx> is already
bound to that context and, since <spanx style="verb">openSlot</spanx> is a PDA
seed, the address itself pins the incarnation (see
<xref target="channel-closure"/>); no separate epoch field is
carried.
Implementations <bcp14>MUST NOT</bcp14> accept vouchers for channels
whose identity cannot be recomputed from the program ID
and channel open parameters.</t>

</section>
<section anchor="signed-voucher"><name>Signed Voucher</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">voucher</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Voucher data (above)</c>
      <c><spanx style="verb">signer</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 public key of the voucher signer</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58-encoded Ed25519 signature</c>
      <c><spanx style="verb">signatureType</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"ed25519"</spanx></c>
</texttable>

</section>
<section anchor="on-chain-voucher-encoding"><name>Voucher Signing</name>

<t>The signed voucher payload is 50 bytes in fixed
Borsh layout:</t>

<texttable>
      <ttcol align='left'>Offset</ttcol>
      <ttcol align='left'>Length</ttcol>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Encoding</ttcol>
      <c>0</c>
      <c>2</c>
      <c><spanx style="verb">magic</spanx></c>
      <c>The tag byte <spanx style="verb">0x56</spanx> (ASCII <spanx style="verb">V</spanx>) followed by the format-version byte <spanx style="verb">0x01</spanx></c>
      <c>2</c>
      <c>32</c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>Raw Solana address bytes</c>
      <c>34</c>
      <c>8</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>u64 little-endian</c>
      <c>42</c>
      <c>8</c>
      <c><spanx style="verb">expiresAt</spanx></c>
      <c>i64 little-endian; <spanx style="verb">0</spanx> = no expiration</c>
</texttable>

<t>The <spanx style="verb">magic</spanx> prefix is a domain-separation tag plus a
payload format version (<spanx style="verb">0x01</spanx>): it separates
voucher bytes from anything else the signing key
might sign and pins the format version inside the
signed bytes. The separation strength comes from the
exact 50-byte message-length pin plus the <spanx style="verb">channelId</spanx>
PDA binding, not from tag entropy: the tag byte only
needs to differ from the first byte of other
Ed25519-signable payloads (legacy transaction
messages start with a small signature count,
versioned transactions with <spanx style="verb">0x80</spanx>, offchain
messages with <spanx style="verb">0xff</spanx>). There is no epoch field:
<spanx style="verb">openSlot</spanx> is a PDA seed, so the <spanx style="verb">channelId</spanx> bytes
already bind the voucher to one incarnation of the
channel address (see <xref target="channel-closure"/>).</t>

<t>Signing:</t>

<t><list style="numbers" type="1">
  <t>Serialize the voucher data into the layout above.</t>
  <t>Sign with Ed25519 using <spanx style="verb">authorizedSigner</spanx>'s key.</t>
  <t>Encode the signature as base58 for the HTTP
<spanx style="verb">signature</spanx> field.</t>
</list></t>

<t>The Borsh bytes are authoritative for signature
verification. The HTTP JSON shape is a transport
view; clients and servers <bcp14>MUST NOT</bcp14> influence what
bytes are signed via the JSON. The same 50-byte
layout is the precompile message the channel program
reads back on-chain for <spanx style="verb">settle</spanx> and for
<spanx style="verb">settleAndSeal</spanx> when a voucher is applied.</t>

</section>
<section anchor="voucher-verification"><name>Voucher Verification</name>

<t>The server <bcp14>MUST</bcp14> verify each voucher:</t>

<t><list style="numbers" type="1">
  <t>Deserialize the voucher data and serialize it into
the 50-byte layout of <xref target="on-chain-voucher-encoding"/>,
including the fixed <spanx style="verb">magic</spanx> prefix. A payload whose
<spanx style="verb">magic</spanx> does not match exactly <bcp14>MUST</bcp14> be rejected.</t>
  <t>Verify the Ed25519 signature over the Borsh voucher
payload against the <spanx style="verb">signer</spanx> public key.</t>
  <t>Verify the <spanx style="verb">signer</spanx> matches the channel's
<spanx style="verb">authorizedSigner</spanx>.</t>
  <t>Verify <spanx style="verb">voucher.channelId</spanx> matches the active
channel PDA, re-derived from the decoded channel
open parameters — including <spanx style="verb">openSlot</spanx> — and the
channel program ID, never taken from the JSON
envelope alone. Because <spanx style="verb">openSlot</spanx> is a PDA seed,
this address binding also pins the channel
incarnation; no separate epoch-equality check
exists.</t>
  <t>Verify <spanx style="verb">cumulativeAmount &gt; acceptedCumulative</spanx>
using the server's durable watermark, even when
on-chain <spanx style="verb">settled</spanx> lags. Equal or lower amounts
<bcp14>MUST</bcp14> be rejected for metered voucher acceptance
unless they are exact idempotent replays handled
per "Concurrency and Idempotency". The accepted
increment <spanx style="verb">cumulativeAmount − acceptedCumulative</spanx>
<bcp14>MUST</bcp14> correspond to the resource cost charged for the
accompanying request, not merely be a positive
advance.</t>
  <t>Verify the channel account still exists, is owned
by the channel program, and carries the <spanx style="verb">Channel</spanx>
discriminator. A fully drained channel is <spanx style="verb">Distributed</spanx>
and then deallocated (see <xref target="channel-closure"/>);
its address never hosts another channel, because a
new incarnation carries a new <spanx style="verb">openSlot</spanx> seed and
therefore a new address.</t>
  <t>Verify <spanx style="verb">status == Open</spanx> (i.e., <spanx style="verb">closureStartedAt == 0</spanx>
and the channel has not yet been sealed).
Servers <bcp14>MUST</bcp14> reject new voucher acceptance on
channels with a pending forced close unless the
voucher is being used only to drive
<spanx style="verb">settleAndSeal</spanx>.</t>
  <t>Verify <spanx style="verb">cumulativeAmount &lt;= escrowedAmount</spanx> (does
not exceed deposit).</t>
  <t>If <spanx style="verb">expiresAt</spanx> is present and non-zero, verify
<spanx style="verb">now &lt; expiresAt</spanx> (with configurable clock skew
tolerance).</t>
  <t>Persist the new <spanx style="verb">acceptedCumulative</spanx> amount AND the
full <spanx style="verb">SignedVoucher</spanx> to durable storage BEFORE
serving the resource. The numeric watermark alone is
insufficient: on-chain <spanx style="verb">settle</spanx> / <spanx style="verb">settleAndSeal</spanx>
require the stored signed payload.</t>
</list></t>

</section>
<section anchor="on-chain-voucher-verification"><name>On-Chain Voucher Verification</name>

<t>When the channel program executes <spanx style="verb">settle</spanx> or
<spanx style="verb">settleAndSeal</spanx> (with a voucher), the voucher
signature <bcp14>MUST</bcp14> be verified on-chain. On Solana, this
can be done by:</t>

<t><list style="symbols">
  <t>Including an <spanx style="verb">ed25519</spanx> program instruction in the
same transaction that verifies the signature
immediately before the channel instruction
executes.</t>
  <t>Or implementing Ed25519 verification directly in
the channel program (higher compute cost).</t>
</list></t>

<t>The first approach is preferred as it uses Solana's
native signature verification at minimal compute
cost. The precompile instruction <bcp14>MUST</bcp14> immediately
precede the channel instruction in the same
transaction.</t>

<t>When using instruction introspection to consume a
native signature-verification instruction, channel
programs <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>validate the Instructions sysvar account address;</t>
  <t>use checked instruction-loading helpers provided by
the Solana SDK;</t>
  <t>decode the on-chain voucher payload directly from
the verified message bytes recorded by the precompile
in the same transaction
(see <xref target="on-chain-voucher-encoding"/>); the <spanx style="verb">magic</spanx>
prefix <bcp14>MUST</bcp14> match exactly (reference error
<spanx style="verb">VoucherBadMagic</spanx>, code 238), the voucher
<spanx style="verb">channelId</spanx> <bcp14>MUST</bcp14> equal the channel PDA address
(reference error <spanx style="verb">VoucherChannelMismatch</spanx>, code
232) — an address binding that subsumes the epoch
check, since <spanx style="verb">openSlot</spanx> is a PDA seed — and the
precompile-recorded signer
<bcp14>MUST</bcp14> equal <spanx style="verb">authorizedSigner</spanx>;</t>
  <t>reject signature-verification instructions that are
replayed, unrelated, or positioned such that the
channel program cannot unambiguously determine which
verified message they authorize.</t>
</list></t>

<t>For the single-signature case, the canonical
<spanx style="verb">ed25519</spanx> precompile instruction totals 162 bytes: a
112-byte prefix (header, public key, and signature)
followed by the 50-byte voucher message. Its
<spanx style="verb">message_data_size</spanx> <bcp14>MUST</bcp14> be exactly 50.</t>

</section>
</section>
<section anchor="splits-canonicalization"><name>Distribution Splits</name>

<t>Channels <bcp14>MAY</bcp14> commit a multi-recipient split of the
merchant-side pool at <spanx style="verb">open</spanx>. The split is a list
of <spanx style="verb">(recipient, shareBps)</spanx> entries; the payee
receives the implicit-remainder share
<spanx style="verb">10000 − Σ shareBps</spanx> and is NOT listed explicitly.</t>

<section anchor="canonical-preimage"><name>Canonical Preimage</name>

<t>The byte layout hashed at <spanx style="verb">open</spanx> and re-hashed at
<spanx style="verb">distribute</spanx>:</t>

<figure><artwork><![CDATA[
count (u32 LE) || [ recipient (32 bytes) || shareBps (u16 LE) ] × count
]]></artwork></figure>

<t><list style="symbols">
  <t><spanx style="verb">count == 0</spanx> is legal; the payee receives 100% of
the pool.</t>
  <t>Every active entry <bcp14>MUST</bcp14> have <spanx style="verb">shareBps &gt; 0</spanx>.</t>
  <t><spanx style="verb">0 ≤ Σ shareBps ≤ 10000</spanx>.</t>
  <t>Recipients <bcp14>MUST</bcp14> be unique and <bcp14>MUST NOT</bcp14> equal the
channel PDA itself.</t>
  <t>The list size is bounded by an
implementation-defined <spanx style="verb">MAX_DISTRIBUTION_RECIPIENTS</spanx>
(<bcp14>RECOMMENDED</bcp14>: 32).</t>
</list></t>

</section>
<section anchor="hash-algorithm"><name>Hash Algorithm</name>

<t>Implementations <bcp14>MUST</bcp14> use a collision-resistant hash
with a 32-byte digest. The chosen algorithm <bcp14>MUST</bcp14> be
fixed at deployment and documented for clients so
they can reproduce it. SHA-256 is <bcp14>RECOMMENDED</bcp14>; the
specific hash implementation (e.g., the <spanx style="verb">sol_sha256</spanx>
syscall versus a bundled library) is an
implementation detail that does not affect wire
compatibility.</t>

</section>
<section anchor="distribution-math"><name>Distribution Math</name>

<t><spanx style="verb">distribute</spanx> pays each beneficiary the cumulative
floor delta between <spanx style="verb">payoutWatermark</spanx> and <spanx style="verb">settled</spanx>:</t>

<t><list style="symbols">
  <t>recipient <spanx style="verb">i</spanx>:
<spanx style="verb">floor(settled * shareBps[i] / 10000) − floor(payoutWatermark * shareBps[i] / 10000)</spanx>;</t>
  <t>payee:
<spanx style="verb">floor(settled * (10000 − Σ shareBps) / 10000) − floor(payoutWatermark * (10000 − Σ shareBps) / 10000)</spanx>.</t>
</list></t>

<t>During <spanx style="verb">status == Open</spanx>, flooring-residual dust remains
in the escrow ATA while <spanx style="verb">payoutWatermark</spanx> advances to
<spanx style="verb">settled</spanx>; because later distributions compute deltas
from that watermark, previously residual value stays
claimable once a share's cumulative entitlement crosses
the next whole unit. At the <spanx style="verb">Sealed</spanx> branch of
<spanx style="verb">distribute</spanx>, the final cumulative delta runs once,
then the irreducible residual dust is swept to the
protocol treasury ATA before the escrow ATA is closed.
The treasury account is a deployment-level address
documented out of band by the channel program.</t>

</section>
</section>
<section anchor="authorized-signer"><name>Authorized Signer</name>

<t>By default, the payer signs vouchers directly. This
matches the default channel model: the funding key is
also the voucher-signing key, and the deposit is the
hard cap enforced by the channel.</t>

<t>Whether the voucher signer is the payer or a delegated
key, it <bcp14>MUST</bcp14> be a valid Ed25519 public-key point.
<spanx style="verb">open</spanx> <bcp14>MUST</bcp14> reject an <spanx style="verb">authorizedSigner</spanx> that is not a
curve point, since a non-curve value could never
produce a verifiable voucher signature.</t>

<t>Implementations <bcp14>MAY</bcp14> support delegated signing where
the payer authorizes a separate keypair (for example,
a session key) to sign vouchers on their behalf. The
<spanx style="verb">authorizedSigner</spanx> field in the channel state records
the delegated public key. The server verifies
vouchers against this key instead of the payer's.</t>

<t>This enables use cases like browser sessions where an
ephemeral key signs vouchers without repeated wallet
confirmations.</t>

<t>That client-controlled delegated voucher key still uses a
<spanx style="verb">voucherSigner</spanx> value of <spanx style="verb">client</spanx>. With <spanx style="verb">voucherSigner</spanx> set to
<spanx style="verb">operator</spanx>, <spanx style="verb">authorizedSigner</spanx> is the operator and the client
authenticates requests with the reusable payer proof.</t>

<t>Implementations <bcp14>MAY</bcp14> additionally support delegated
signers on other curves that Solana can verify
through native programs, such as <spanx style="verb">secp256r1</spanx> for
passkeys. Such extensions <bcp14>MUST</bcp14> define:</t>

<t><list style="symbols">
  <t>a distinct <spanx style="verb">signatureType</spanx> value;</t>
  <t>the exact signed message format;</t>
  <t>the exact Solana verification program used on-chain;
and</t>
  <t>how the delegated signer is bound into the channel's
PDA derivation and open transaction.</t>
</list></t>

</section>
<section anchor="fee-sponsorship"><name>Fee Sponsorship</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx> in the challenge:</t>

<t><list style="symbols">
  <t><strong>Open</strong>: The client builds the open transaction
with the server's <spanx style="verb">feePayerKey</spanx> as fee payer,
partially signs (deposit transfer authority only),
and sends via <spanx style="verb">transaction</spanx> in the open credential.
The server co-signs and broadcasts. The server's
<spanx style="verb">feePayerKey</spanx> is also the <spanx style="verb">open</spanx> instruction's
<spanx style="verb">rentPayer</spanx> (account index 1) and is recorded into
<spanx style="verb">Channel.rentPayer</spanx>: the same operator signature
covers the fee-payer and <spanx style="verb">rentPayer</spanx> signer roles, so
the operator funds both the transaction fee and the
channel PDA + escrow ATA rent. The operator recovers
that SOL rent after close — through the terminal
<spanx style="verb">distribute</spanx>'s fast path or its periodic <spanx style="verb">reclaim</spanx>
sweep (see <xref target="channel-closure"/>); the epoch window
floats only this rent, never the merchant payout or
the payer refund.</t>
  <t><strong>TopUp</strong>: Same pattern — client partially signs,
server co-signs.</t>
  <t><strong>Settle/Close</strong>: The server initiates these
operations and always pays the fee.</t>
</list></t>

<t>This ensures clients never need SOL — neither for
transaction fees nor for channel rent — during the
entire session lifecycle; the client transacts in
stablecoin only.</t>

</section>
<section anchor="server-state-management"><name>Server State Management</name>

<section anchor="per-channel-state"><name>Per-Channel State</name>

<t>The server <bcp14>MUST</bcp14> maintain the following state for
each open channel:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>Channel account address</c>
      <c><spanx style="verb">openSlot</spanx></c>
      <c>On-chain <spanx style="verb">Channel.openSlot</spanx> of the channel being metered; a PDA seed, needed to re-derive and validate <spanx style="verb">channelId</spanx> and to anticipate the reclaim gate</c>
      <c><spanx style="verb">status</spanx></c>
      <c><spanx style="verb">"open"</spanx> or <spanx style="verb">"closed"</spanx></c>
      <c><spanx style="verb">payer</spanx></c>
      <c>Payer public key</c>
      <c><spanx style="verb">voucherSigner</spanx></c>
      <c><spanx style="verb">client</spanx> or <spanx style="verb">operator</spanx></c>
      <c><spanx style="verb">authorizationPolicy</spanx></c>
      <c>Voucher signer policy</c>
      <c><spanx style="verb">authentication</spanx></c>
      <c>For <spanx style="verb">operator</spanx>, secure state sufficient to verify the proof, its opening session challenge, payer, and channel</c>
      <c><spanx style="verb">escrowedAmount</spanx></c>
      <c>Total deposited (from on-chain <spanx style="verb">Channel.deposit</spanx>)</c>
      <c><spanx style="verb">acceptedCumulative</spanx></c>
      <c>Highest voucher amount accepted</c>
      <c><spanx style="verb">highestVoucher</spanx></c>
      <c>Full highest accepted <spanx style="verb">SignedVoucher</spanx>, retained for on-chain settlement</c>
      <c><spanx style="verb">spentAmount</spanx></c>
      <c>Cumulative amount charged for delivered service</c>
      <c><spanx style="verb">settledOnChain</spanx></c>
      <c>Highest cumulative amount already settled on-chain</c>
      <c><spanx style="verb">closureStartedAt</spanx></c>
      <c>Pending forced-close timestamp, if any</c>
      <c><spanx style="verb">lastActivityAt</spanx></c>
      <c>Server timestamp of the most recent channel activity defined in <xref target="idle-timeout"/></c>
      <c><spanx style="verb">idleTimeoutSeconds</spanx></c>
      <c>Effective negotiated inactivity threshold</c>
</texttable>

<t>Server-side channel state — in particular
<spanx style="verb">acceptedCumulative</spanx> and the stored highest
<spanx style="verb">SignedVoucher</spanx> — <bcp14>MUST</bcp14> be keyed by <spanx style="verb">channelId</spanx>, not
by challenge id or HTTP session id. Because
<spanx style="verb">openSlot</spanx> is a PDA seed, the address is already
per-incarnation: reopening a closed relationship is
legal by design (see <xref target="channel-closure"/>) and
produces a new channel at a new address with its own
ledger, so <spanx style="verb">channelId</spanx> alone cannot conflate
incarnations and no <spanx style="verb">(channelId, openSlot)</spanx>
composite key is needed.</t>

<t>The channel program does not bind vouchers to a
cluster, so operators <bcp14>MUST</bcp14> pin each server and channel
to a single cluster and RPC endpoint and <bcp14>MUST NOT</bcp14> share
one metering ledger across clusters. A server <bcp14>SHOULD</bcp14>
verify the resolved channel matches the challenge's
<spanx style="verb">methodDetails.network</spanx> before metering.</t>

<t>For <spanx style="verb">client</spanx>, the available off-chain balance is:</t>

<figure><artwork><![CDATA[
available = acceptedCumulative - spentAmount
]]></artwork></figure>

<t>For <spanx style="verb">operator</spanx>, the operator creates authorization as service is
metered, so the available capacity is:</t>

<figure><artwork><![CDATA[
available = escrowedAmount - acceptedCumulative
]]></artwork></figure>

<t>The on-chain settlement watermark is distinct:</t>

<figure><artwork><![CDATA[
unsettled = spentAmount - settledOnChain
]]></artwork></figure>

</section>
<section anchor="mint-allow-list"><name>Mint Allow-List</name>

<t>Servers <bcp14>MUST</bcp14> restrict a channel's <spanx style="verb">mint</spanx> to an
explicit, server-controlled allow-list of vetted mints,
curated out of band and never derived from
client-supplied data. The server <bcp14>MUST</bcp14> set the 402
challenge <spanx style="verb">currency</spanx> only to an allow-listed mint and
<bcp14>MUST</bcp14> reject any <spanx style="verb">open</spanx> whose decoded <spanx style="verb">mint</spanx> is not on
the list. Because the open-validation binding in
<xref target="open-settlement"/> ties the decoded <spanx style="verb">open</spanx> mint to the
challenged <spanx style="verb">currency</spanx>, no off-list mint can enter a new
channel.</t>

<t>The server <bcp14>SHOULD</bcp14> refuse to resume or <spanx style="verb">topUp</spanx> a channel
whose <spanx style="verb">mint</spanx> has since been delisted.</t>

<t>This requirement exists because the channel program
does not inspect a mint's freeze or mint authority (see
<xref target="escrow-safety"/>); the server is the only gate that
keeps unvetted mints out of channels.</t>

</section>
<section anchor="debit-processing"><name>Debit Processing</name>

<t>For each request on an open channel:</t>

<t><list style="numbers" type="1">
  <t>Authenticate <spanx style="verb">client</spanx> mode with a valid voucher, or <spanx style="verb">operator</spanx>
mode with a valid <spanx style="verb">use</spanx> proof.</t>
  <t>Compute <spanx style="verb">cost</spanx> from the challenged <spanx style="verb">amount</spanx>,
<spanx style="verb">unitType</spanx>, and any implementation-specific metering
policy.</t>
  <t>Compute <spanx style="verb">available</spanx> using the formula for the channel's mode.</t>
  <t>If <spanx style="verb">available &lt; cost</spanx>, return 402 requesting a new voucher or
<spanx style="verb">topUp</spanx>, as applicable.</t>
  <t>For <spanx style="verb">client</spanx>, persist <spanx style="verb">spentAmount += cost</spanx>. For <spanx style="verb">operator</spanx>, sign a
voucher for <spanx style="verb">acceptedCumulative + cost</spanx> and
atomically persist that voucher, the new <spanx style="verb">acceptedCumulative</spanx>, and
<spanx style="verb">spentAmount += cost</spanx>.</t>
  <t>Persist the applicable transition atomically before releasing the
corresponding response bytes.</t>
  <t>Serve the resource with a receipt.</t>
</list></t>

<t>When cost is known only after generation begins, an operator-mode server
<bcp14>MUST</bcp14> reserve sufficient channel capacity before delivery and persist
the operator-signed voucher before releasing the response bytes whose
cost it authorizes. Failed delivery <bcp14>MUST</bcp14> release unused reservations.
Amounts already covered by a persisted voucher and released response
bytes remain committed; unused reserved capacity <bcp14>MUST NOT</bcp14> advance the
voucher.</t>

</section>
<section anchor="partial-settlement"><name>Partial Settlement</name>

<t>The server <bcp14>MAY</bcp14> call the channel program's settle
instruction at any time to claim accumulated funds
without closing the channel. This is useful for:</t>

<t><list style="symbols">
  <t>Reducing counterparty risk on long-running sessions</t>
  <t>Freeing up server working capital</t>
  <t>Periodic reconciliation</t>
</list></t>

<t>After settlement, the channel account's <spanx style="verb">settled</spanx>
field on-chain reflects
the claimed amount. The server <bcp14>MUST</bcp14> update
<spanx style="verb">settledOnChain</spanx> after confirmation and continues
accepting vouchers for amounts above the new settled
baseline.</t>

</section>
<section anchor="crash-safety"><name>Crash Safety</name>

<t>Servers <bcp14>MUST</bcp14> persist metering state increments
BEFORE delivering the response. Servers <bcp14>SHOULD</bcp14>
support idempotency keys for exactly-once delivery.
More precisely, servers <bcp14>MUST</bcp14> persist both:</t>

<t><list style="symbols">
  <t><spanx style="verb">acceptedCumulative</spanx> BEFORE relying on new voucher
balance; and</t>
  <t><spanx style="verb">spentAmount</spanx> BEFORE or atomically with delivering
the metered service.</t>
</list></t>

<t>Servers <bcp14>SHOULD</bcp14> use transactional storage or
write-ahead logging to ensure recovery after process
or machine crashes.</t>

</section>
<section anchor="concurrency-and-idempotency"><name>Concurrency and Idempotency</name>

<t>Servers <bcp14>MUST</bcp14> serialize proof verification, voucher creation or
acceptance, and debit processing per channel (<spanx style="verb">channelId</spanx>; the address is
per-incarnation by construction). Voucher updates
arriving on different HTTP connections or multiplexed
streams <bcp14>MUST</bcp14> be processed atomically with respect to:</t>

<t><list style="symbols">
  <t><spanx style="verb">acceptedCumulative</spanx>;</t>
  <t><spanx style="verb">spentAmount</spanx>; and</t>
  <t><spanx style="verb">closureStartedAt</spanx>.</t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> treat metered requests idempotently:</t>

<t><list style="symbols">
  <t>Replaying an already processed request <bcp14>MAY</bcp14> return
the cached receipt and <bcp14>MUST NOT</bcp14> change channel state
or deliver additional service.</t>
  <t>Voucher submissions with <spanx style="verb">cumulativeAmount &lt;=
acceptedCumulative</spanx> and no matching cached
idempotent response <bcp14>MUST</bcp14> be rejected and <bcp14>MUST NOT</bcp14>
reduce channel state.</t>
  <t>Clients <bcp14>MAY</bcp14> safely retry voucher submissions after
network failures using the same idempotency key.</t>
</list></t>

<t>Clients <bcp14>SHOULD</bcp14> include an <spanx style="verb">Idempotency-Key</spanx> header on
metered HTTP requests. Servers <bcp14>SHOULD</bcp14> cache
<spanx style="verb">(challengeId, idempotencyKey)</spanx> pairs and <bcp14>MUST NOT</bcp14>
increment <spanx style="verb">spentAmount</spanx> twice for a duplicate
idempotent request.</t>

<t>Repeated presentation of a session bearer proof is expected and is not, by
itself, a duplicate request. Idempotency keys and atomic channel
accounting provide request-level replay protection independently of the
bearer proof.</t>

</section>
</section>
<section anchor="settlement-procedure"><name>Settlement Procedure</name>

<section anchor="open-settlement"><name>Open</name>

<t><list style="numbers" type="1">
  <t>Decode the open transaction before signing, paying
fees, or broadcasting. Verify it contains the
expected channel program instruction and that the
instruction uses the <spanx style="verb">open</spanx> discriminator (the
reference implementation composes channel-PDA
creation, escrow ATA creation, deposit transfer,
and the <spanx style="verb">distributionHash</spanx> commitment in a single
instruction).</t>
  <t>Verify the instruction targets the challenged
channel program and encodes the challenged <spanx style="verb">payer</spanx>,
<spanx style="verb">payee</spanx>, <spanx style="verb">mint</spanx>, <spanx style="verb">authorizedSigner</spanx>, <spanx style="verb">salt</spanx>,
<spanx style="verb">deposit</spanx>, <spanx style="verb">grace_period</spanx>, <spanx style="verb">open_slot</spanx>, and
canonical <spanx style="verb">distributionSplits</spanx> preimage. The
decoded <spanx style="verb">authorizedSigner</spanx> <bcp14>MUST</bcp14> equal the
credential's <spanx style="verb">authorizedSigner</spanx> and <bcp14>MUST</bcp14> be a
valid Ed25519 public-key point; reject non-curve
values.</t>
  <t>Recompute the expected PDA from the decoded payer,
payee, mint, authorized signer, salt, and
<spanx style="verb">open_slot</spanx> plus the channel program ID. Verify it
equals both the decoded channel account and the
declared <spanx style="verb">channelId</spanx>.</t>
  <t>Verify the decoded escrow account is the associated
token account for <spanx style="verb">(channelId, mint, tokenProgram)</spanx>.
If the challenge supplied <spanx style="verb">tokenProgram</spanx>, the
decoded token program <bcp14>MUST</bcp14> match it; otherwise it
<bcp14>MUST</bcp14> be a supported token program for the mint.</t>
  <t>Verify the credential's <spanx style="verb">gracePeriodSeconds</spanx> equals
the challenge policy and is greater than zero.
Decode the open instruction and verify its
<spanx style="verb">grace_period</spanx> equals the same value.</t>
  <t>Resolve the effective idle timeout as defined in
<xref target="idle-timeout"/>. If the credential contains
<spanx style="verb">idleTimeoutSeconds</spanx>, verify that the challenge
advertises <spanx style="verb">idleTimeoutOptionsSeconds</spanx> and that the
selected value exactly matches one of its values.
Reject an unsupported selection before signing,
paying fees, or broadcasting. The server <bcp14>MUST NOT</bcp14>
silently clamp or replace the client's value. If the
credential omits the field, select an offered value
when options were advertised, or select any value
from 1 through 2592000 seconds at the server's
discretion when they were not.</t>
  <t>Verify the credential's <spanx style="verb">openSlot</spanx> equals the
decoded <spanx style="verb">open_slot</spanx> and satisfies the open-slot
window relative to both the challenged <spanx style="verb">recentSlot</spanx>
(<spanx style="verb">openSlot &lt;= recentSlot</spanx> and
<spanx style="verb">recentSlot - openSlot &lt;= OPEN_SLOT_WINDOW</spanx>) and the
window against the server's current view of the
cluster slot (<spanx style="verb">openSlot &lt;= slot</spanx> and
<spanx style="verb">slot - openSlot &lt;= OPEN_SLOT_WINDOW</spanx>); the
program enforces the same rule at execution (see
<xref target="channel-closure"/>).</t>
  <t>Verify the transaction's fee payer matches the
challenge policy:
  <list style="symbols">
      <t>if <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the fee payer <bcp14>MUST</bcp14> equal
<spanx style="verb">feePayerKey</spanx>;</t>
      <t>otherwise the payer funds the transaction.</t>
    </list>
Verifiers that read the <spanx style="verb">open</spanx> accounts by fixed
index <bcp14>MUST</bcp14> account for the <spanx style="verb">rentPayer</spanx> account at
index 1 (<spanx style="verb">payer=0</spanx>, <spanx style="verb">rentPayer=1</spanx>, <spanx style="verb">payee=2</spanx>,
<spanx style="verb">mint=3</spanx>, <spanx style="verb">authorizedSigner=4</spanx>, <spanx style="verb">channel=5</spanx>, with
every account after <spanx style="verb">payer</spanx> shifted by <spanx style="verb">+1</spanx>) and
<bcp14>MUST</bcp14> verify that <spanx style="verb">accounts[1]</spanx> equals the operator /
fee-payer key. <spanx style="verb">rentPayer</spanx> is derived from the
existing operator / fee payer and carries no separate
wire field; a single operator signature satisfies
both the fee-payer and <spanx style="verb">rentPayer</spanx> signer roles.</t>
  <t>Validate the complete compiled message — resolving
any version-0 address-lookup-table entries — not just
the channel instruction. Verify the transaction does
use the challenged <spanx style="verb">recentBlockhash</spanx> and does
not include unrelated writable accounts or
instructions that could redirect funds or mutate
channel parameters, and that the server fee payer is
never used as an authority, source, or writable
account by any instruction. The server <bcp14>SHOULD</bcp14> reject
transactions that route value through unexpected
external programs.</t>
  <t>Verify the decoded <spanx style="verb">deposit</spanx> equals
   <spanx style="verb">depositAmount</spanx>, satisfies
   <spanx style="verb">methodDetails.minimumDeposit</spanx> (when set), and that
   the resulting <spanx style="verb">distributionHash</spanx> matches the digest
   of the canonical preimage of the splits proposed in
   the 402 challenge.</t>
  <t>Reject any disagreement between the challenge,
   credential payload, decoded transaction, derived
   PDA, escrow ATA, or token program.</t>
  <t>Verify <spanx style="verb">voucherSigner</spanx>. For <spanx style="verb">operator</spanx>, verify the
   reusable proof as defined in
   <xref target="session-bearer-proof"/> and verify that decoded
   <spanx style="verb">authorizedSigner</spanx> equals the challenged <spanx style="verb">operator</spanx>. For
   <spanx style="verb">client</spanx>, reject an <spanx style="verb">authentication</spanx> field.</t>
  <t>If fee payer mode: co-sign and broadcast.
   Otherwise: broadcast as-is.</t>
  <t>Verify channel state on-chain after confirmation:
   - payer matches transaction signer;
   - payee matches the challenged recipient;
   - mint matches the challenge currency;
   - deposit matches the requested amount;
   - <spanx style="verb">gracePeriod</spanx> is non-zero and matches the
 challenge policy;
   - <spanx style="verb">openSlot</spanx> equals the credential's <spanx style="verb">openSlot</spanx>;
   - authorized signer matches the open parameters;
   - <spanx style="verb">distributionHash</spanx> matches the proposed splits;
   - <spanx style="verb">rentPayer</spanx> equals the operator / fee-payer key
 that funded the channel rent;
   - channel is not sealed; and
   - <spanx style="verb">closureStartedAt</spanx> is <spanx style="verb">0</spanx>.</t>
  <t>Create server-side channel state keyed by
   <spanx style="verb">channelId</spanx> (per-incarnation by construction, since
   <spanx style="verb">openSlot</spanx> is a PDA seed). Persist the effective idle timeout,
   voucher signer and any session proof verifier.
   Initialize <spanx style="verb">lastActivityAt</spanx> as part of the same state transition.</t>
  <t>Return 200 with receipt.</t>
</list></t>

</section>
<section anchor="resume"><name>Resume</name>

<t>When a challenge resumes an existing channel
(<spanx style="verb">methodDetails.channelId</spanx>), the server <bcp14>MUST</bcp14>
re-authenticate the on-chain account before metering
against it — decoding the account bytes is not
sufficient. The server <bcp14>MUST</bcp14> verify the account is owned
by the channel program and that its discriminator,
<spanx style="verb">version</spanx>, <spanx style="verb">status == Open</spanx>, PDA derivation
(re-derived over the stored open parameters,
including <spanx style="verb">openSlot</spanx>), <spanx style="verb">mint</spanx> (still allow-listed),
<spanx style="verb">payee</spanx>, <spanx style="verb">authorizedSigner</spanx>, <spanx style="verb">openSlot</spanx>, and
<spanx style="verb">distributionHash</spanx> all match the active challenge
and session. The challenged <spanx style="verb">idleTimeoutSeconds</spanx> <bcp14>MUST</bcp14>
equal the effective value stored for the channel.
Resume only ever applies to a live
channel: because <spanx style="verb">openSlot</spanx> is a PDA seed, a
deallocated address is never reoccupied — reopening
a closed relationship creates a new channel at a new
<spanx style="verb">channelId</spanx> with a fresh ledger. A resumed channel
shares one cumulative ledger across challenges,
keyed by <spanx style="verb">channelId</spanx>, so a single cumulative voucher
cannot be reused to buy multiple responses.</t>

<t>An operator-signed channel <bcp14>MUST NOT</bcp14> resume if its durable proof binding is
missing or inconsistent with its payer, original session
challenge, or channel ID. Public transaction or account data <bcp14>MUST NOT</bcp14>
be used to reconstruct that binding.</t>

</section>
<section anchor="voucher-update-no-settlement"><name>Voucher Update (No Settlement)</name>

<t>This procedure directly authorizes service only for
<spanx style="verb">client</spanx>.</t>

<t><list style="numbers" type="1">
  <t>Verify voucher signature and monotonicity.</t>
  <t>Verify the channel is open and has no pending
forced close.</t>
  <t>Persist <spanx style="verb">acceptedCumulative</spanx>.</t>
  <t>Debit <spanx style="verb">cost</spanx> from available balance by persisting
<spanx style="verb">spentAmount</spanx>.</t>
  <t>Return 200 with receipt.</t>
</list></t>

</section>
<section anchor="topup-1"><name>TopUp</name>

<t><list style="numbers" type="1">
  <t>If fee payer mode: co-sign and broadcast.
Otherwise: broadcast as-is.</t>
  <t>Verify the top-up transaction targets the expected
channel PDA and channel program and only increases
deposit for that channel.</t>
  <t>Verify the on-chain deposit increase after
confirmation.</t>
  <t>Increase <spanx style="verb">escrowedAmount</spanx> in server-side state.</t>
  <t>Return 200 with receipt.</t>
</list></t>

<t><spanx style="verb">topUp</spanx> is callable only while <spanx style="verb">status == Open</spanx> and
<bcp14>MUST NOT</bcp14> clear <spanx style="verb">closureStartedAt</spanx>. Once forced close
is requested, the paths forward are
<spanx style="verb">settleAndSeal</spanx> (within grace) or <spanx style="verb">seal</spanx>
(after grace).</t>

</section>
<section anchor="close-cooperative"><name>Close (Cooperative)</name>

<t><list style="numbers" type="1">
  <t>Authenticate close according to <spanx style="verb">voucherSigner</spanx>. For <spanx style="verb">client</spanx>,
verify the required voucher's channel, signer, signature, freshness,
and <spanx style="verb">cumulativeAmount &lt;= deposit</spanx>. For <spanx style="verb">operator</spanx>, verify the bound
session proof.</t>
  <t>Select the settlement voucher. In <spanx style="verb">client</spanx> mode, use the supplied
voucher only when <spanx style="verb">cumulativeAmount &gt; settled</spanx>; otherwise treat it
only as close authentication after verifying it equals
<spanx style="verb">acceptedCumulative</spanx>. In <spanx style="verb">operator</spanx> mode, use the stored
highest voucher when it advances <spanx style="verb">settled</spanx>. If no voucher advances
settlement, seal at the current on-chain watermark.</t>
  <t>Build and immediately broadcast
<spanx style="verb">settleAndSeal</spanx> bundled with <spanx style="verb">distribute</spanx> in
the same transaction, so the merchant-side payout,
payer refund, treasury sweep, and escrow-ATA
closure all land atomically. The bundle is never
slot-gated and <bcp14>MUST NOT</bcp14> be deferred waiting for
the epoch window. When
<spanx style="verb">clock.slot &gt; openSlot + OPEN_SLOT_WINDOW</spanx> already
holds, the same <spanx style="verb">distribute</spanx> also deallocates the
channel PDA in place; otherwise the channel is
left <spanx style="verb">Distributed</spanx> and the operator's periodic
<spanx style="verb">reclaim</spanx> sweep recovers the PDA rent after the
window (see <xref target="channel-closure"/>). A bundle whose
<spanx style="verb">distribute</spanx> carries many recipients may require a
version-0 transaction with an address lookup
table.</t>
  <t>Mark the channel as <spanx style="verb">"closed"</spanx> in server-side
state.</t>
  <t>Persist final <spanx style="verb">settledOnChain</spanx> and terminal
accounting state after confirmation.</t>
  <t>Return 200 with receipt containing <spanx style="verb">txHash</spanx> and
(if <spanx style="verb">distribute</spanx> ran) the refunded amount.</t>
</list></t>

<t>For deployments whose <spanx style="verb">payee</spanx> is a PDA, the server <bcp14>MUST</bcp14>
provide a working CPI signer-seed adapter for
<spanx style="verb">settleAndSeal</spanx> before opening channels, or else
refuse the channel before metering begins. A PDA payee
with no cooperative-close path can leave delivered
service uncollectible: the permissionless <spanx style="verb">settle</spanx> crank
cannot apply a new voucher once <spanx style="verb">requestClose</spanx> has moved
the channel to <spanx style="verb">Closing</spanx>.</t>

</section>
<section anchor="idle-timeout"><name>Server-Initiated Idle Close</name>

<t>For a new channel, the server advertises the supported
values in <spanx style="verb">methodDetails.idleTimeoutOptionsSeconds</spanx>. If
this field is absent, the server does not offer client
selection and chooses the effective timeout at its
discretion within the range from 1 through 2592000
seconds, inclusive.</t>

<t>For example, a server can offer 30 seconds, 10 minutes,
and 1 day:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "idleTimeoutOptionsSeconds": [30, 600, 86400]
}
]]></sourcecode></figure>

<t>The client selects an offered value by including
<spanx style="verb">idleTimeoutSeconds</spanx> in its <spanx style="verb">open</spanx> credential. The
client <bcp14>MUST NOT</bcp14> include this field when the challenge
omits <spanx style="verb">idleTimeoutOptionsSeconds</spanx>. If the client omits
its selection, the server selects an offered value when
options were advertised, or selects any value in the
permitted range at its discretion when they were not.</t>

<t>A client-selected value <bcp14>MUST</bcp14> exactly match an offered
value. The server <bcp14>MUST</bcp14> reject an unsupported selection
and <bcp14>MUST NOT</bcp14> silently clamp, replace, or otherwise
reinterpret it. A successful open commits the server to
the effective timeout for the lifetime of that channel.</t>

<t>A challenge that resumes a channel <bcp14>MUST</bcp14> include the
effective value as <spanx style="verb">methodDetails.idleTimeoutSeconds</spanx>,
so the client can recover the negotiated policy without
retaining the original open exchange. A resumed channel
does not renegotiate its idle timeout.</t>

<t>For this policy, channel activity is any of the
following events that completes successfully:</t>

<t><list style="symbols">
  <t>opening or resuming the channel;</t>
  <t>accepting a new voucher;</t>
  <t>confirming a top-up; or</t>
  <t>delivering a billable unit of service.</t>
</list></t>

<t>Rejected credentials, failed transactions, and replayed
requests that return a cached response are not channel
activity. Servers <bcp14>MUST</bcp14> update <spanx style="verb">lastActivityAt</spanx> atomically
with the state change or service delivery that constitutes
channel activity.</t>

<t>When no channel activity has occurred for the effective
idle timeout, the server <bcp14>SHOULD</bcp14> initiate cooperative close
promptly. It <bcp14>MUST NOT</bcp14> close a channel solely for inactivity
before that interval has elapsed. Other terminal conditions,
including operator shutdown or security intervention, <bcp14>MAY</bcp14>
close a channel earlier; clients therefore <bcp14>MUST NOT</bcp14> treat
the idle timeout as a guarantee that the channel remains
available until the threshold.</t>

<t>Before closing an idle channel, the server <bcp14>MUST</bcp14> atomically
stop voucher acceptance, top-up processing, debit
processing, and paid-service delivery for that channel.
It <bcp14>MUST</bcp14> serialize the close against those operations and
then follow <xref target="close-cooperative"/>, using the stored highest
accepted voucher when its cumulative amount exceeds the
on-chain settlement watermark. The mechanism that gates
work while close is in progress is implementation-specific
and does not define another server-side or on-chain channel
status. A later client request for the closed channel
receives the normal terminal-session error and a fresh
challenge.</t>

</section>
<section anchor="forced-close-client-initiated"><name>Forced Close (Client-Initiated)</name>

<t>If the server becomes unresponsive, the client can
force-close the channel:</t>

<t><list style="numbers" type="1">
  <t>The payer authorizes <spanx style="verb">requestClose</spanx> and submits it
directly to RPC. Because the operator funds channel
rent and the client transacts in stablecoin only, a
SOL-free client cannot pay the transaction fee for
this escape route on its own; such a client <bcp14>MUST</bcp14>
obtain SOL (or a fee-paying submitter) to drive
<spanx style="verb">requestClose</spanx>, while <spanx style="verb">seal</spanx> and <spanx style="verb">distribute</spanx> are
permissionless and <bcp14>MAY</bcp14> be cranked by any party.</t>
  <t>Grace period begins (per-channel <spanx style="verb">gracePeriod</spanx>).</t>
  <t>During the grace period, the server <bcp14>MAY</bcp14> still
call <spanx style="verb">settleAndSeal</spanx> with the latest
voucher.</t>
  <t>After the grace period, any party submits
<spanx style="verb">seal</spanx> (permissionless) to transition the
channel to <spanx style="verb">Sealed</spanx>.</t>
  <t>The payer <bcp14>MAY</bcp14> submit <spanx style="verb">withdrawPayer</spanx> to recover
<spanx style="verb">deposit - settled</spanx> immediately. Independently,
any party <bcp14>MAY</bcp14> submit <spanx style="verb">distribute</spanx> with the splits
preimage, also immediately — no token movement is
slot-gated: the merchant side is paid, any pending
payer refund is also paid, residual is swept to
treasury, and the escrow ATA is closed. The
channel PDA is deallocated in the same instruction
when the epoch window has already elapsed, or left
<spanx style="verb">Distributed</spanx> for a later permissionless <spanx style="verb">reclaim</spanx>; in
both cases all freed SOL goes to <spanx style="verb">rentPayer</spanx> (see
<xref target="channel-closure"/>).</t>
</list></t>

</section>
<section anchor="one-shot-session-example"><name>One-Shot Session Example</name>

<t>A metered API prices one request at 16 base units.
A client expecting to make a single call can still
use a session channel with no permanent on-chain
storage cost:</t>

<t><list style="numbers" type="1">
  <t>At build time the cluster slot is <spanx style="verb">S</spanx>. The client
opens with <spanx style="verb">openSlot = S − 1400</spanx>, leaving a
100-slot landing window (<spanx style="verb">OPEN_SLOT_WINDOW = 1500</spanx>)
while shortening the operator's post-close rent
float, and <spanx style="verb">depositAmount = "50000"</spanx>. Because <spanx style="verb">openSlot</spanx>
is a PDA seed, the client derives the channel
address from its chosen value up front and
pre-signs the voucher <spanx style="verb">{channelId,
cumulativeAmount: "16"}</spanx> before the open
transaction confirms.</t>
  <t>The client sends the metered request with the
voucher; the server verifies it per
<xref target="voucher-verification"/> and serves the resource.</t>
  <t>The client sends <spanx style="verb">Action: "close"</spanx> with the same
voucher as the final voucher; the server
immediately broadcasts <spanx style="verb">settleAndSeal</spanx>
bundled with <spanx style="verb">distribute</spanx>. In that one
transaction, seconds after the open, the merchant
side receives 16 and the payer is refunded 49984.
The window has not yet elapsed, so the drained
channel PDA is left <spanx style="verb">Distributed</spanx>.</t>
  <t>The reclaim gate unlocks at slot
<spanx style="verb">openSlot + 1501 = S + 101</spanx>, roughly 100 slots
(~40 seconds) after the open landed. The
operator's next periodic <spanx style="verb">reclaim</spanx> sweep
deallocates the PDA and returns 100% of the
channel rent to <spanx style="verb">rentPayer</spanx>. Nobody's payout or
refund waited on the window — it floated only the
operator's rent.</t>
</list></t>

</section>
</section>
<section anchor="receipt-format"><name>Receipt Format</name>

<t>Receipts are returned in the <spanx style="verb">Payment-Receipt</spanx> header.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">method</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"solana"</spanx></c>
      <c><spanx style="verb">intent</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"session"</spanx></c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel identifier</c>
      <c><spanx style="verb">status</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"success"</spanx></c>
      <c><spanx style="verb">timestamp</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>RFC 3339 timestamp</c>
      <c><spanx style="verb">challengeId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Challenge identifier for audit correlation</c>
      <c><spanx style="verb">acceptedCumulative</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Highest voucher amount accepted</c>
      <c><spanx style="verb">spent</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Total amount charged so far</c>
      <c><spanx style="verb">idleTimeoutSeconds</spanx></c>
      <c>integer</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Effective negotiated inactivity threshold for the channel</c>
</texttable>

<t>For close actions, the receipt <bcp14>MAY</bcp14> additionally
include:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">txHash</spanx></c>
      <c>string</c>
      <c>Settlement transaction signature</c>
      <c><spanx style="verb">spent</spanx></c>
      <c>string</c>
      <c>Total amount settled</c>
      <c><spanx style="verb">refunded</spanx></c>
      <c>string</c>
      <c>Amount refunded to client</c>
</texttable>

<t>For streaming responses, servers <bcp14>SHOULD</bcp14> include the
receipt in the initial response headers and <bcp14>SHOULD</bcp14>
emit a final receipt when the stream completes. When
balance is exhausted mid-stream, servers <bcp14>SHOULD</bcp14> pause
delivery and request a higher voucher or top-up
rather than serving beyond the authorized balance.</t>

<section anchor="voucher-submission-transport"><name>Voucher Submission Transport</name>

<t>Voucher updates and top-up requests <bcp14>SHOULD</bcp14> be
submitted to the same resource URI that requires
payment. This allows session payment to compose with
arbitrary protected endpoints without a dedicated
payment control plane route.</t>

<t>Operator-mode clients submit <spanx style="verb">use</spanx> credentials to the same URI with
<spanx style="verb">method="solana"</spanx> and <spanx style="verb">intent="session"</spanx>.</t>

<t>Clients <bcp14>MAY</bcp14> use <spanx style="verb">HEAD</spanx> for voucher-only or top-up-only
requests when no response body is required. Servers
<bcp14>SHOULD</bcp14> support such requests where practical.</t>

</section>
</section>
<section anchor="error-responses"><name>Error Responses</name>

<t>Servers <bcp14>MUST</bcp14> use the standard problem types defined
in <xref target="I-D.ryan-httpauth-payment-01"/>: <spanx style="verb">malformed-credential</spanx>,
<spanx style="verb">invalid-challenge</spanx>, and <spanx style="verb">verification-failed</spanx>. The
<spanx style="verb">detail</spanx> field <bcp14>SHOULD</bcp14> describe the specific failure
(e.g., "Amount exceeds
deposit", "Channel not found").</t>

<t>All error responses <bcp14>MUST</bcp14> include a fresh challenge in
<spanx style="verb">WWW-Authenticate</spanx>.</t>

<t>When a server rejects a client-selected
<spanx style="verb">idleTimeoutSeconds</spanx> that was not offered in the
challenge, it <bcp14>MUST</bcp14> use the <spanx style="verb">verification-failed</spanx> problem
type. Its <spanx style="verb">detail</spanx> <bcp14>SHOULD</bcp14> state that the requested idle
timeout was not one of the advertised options. The fresh
challenge conveys the currently supported options.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="transport-security"><name>Transport Security</name>

<t>All communication <bcp14>MUST</bcp14> use TLS 1.2 or higher.</t>

</section>
<section anchor="session-bearer-proofs"><name>Session Bearer Proofs</name>

<t>The channel-open transaction and account state are public. They prove
that the payer authorized the deposit and settlement signer, but not
that a later HTTP caller is the payer. Servers <bcp14>MUST NOT</bcp14> authenticate a
metered request using a transaction signature, serialized open
transaction, open credential, channel ID, or another value recoverable
from the ledger.</t>

<t>The session proof is not placed on-chain, but it is a bearer
credential: anyone who obtains it can request service against the
channel's remaining capacity. Clients and servers <bcp14>MUST</bcp14> keep it
confidential, transmit it only over TLS, and redact the proof,
signature, and Authorization header from logs and traces. Servers <bcp14>MUST</bcp14>
reject it once close begins or the channel becomes terminal. Temporary
insufficient capacity does not invalidate the proof; a successful
<spanx style="verb">topUp</spanx> can restore available capacity.</t>

<t>The proof is bound to one channel and opening session challenge, but
not to an individual HTTP method, target, body, or idempotency key.
Servers <bcp14>MUST</bcp14> enforce idempotency and atomic capacity reservation
independently. Applications requiring sender-constrained or per-request
integrity <bcp14>MAY</bcp14> define an extension that signs request context with a
client-held key.</t>

</section>
<section anchor="escrow-safety"><name>Escrow Safety</name>

<t>Funds are held by the channel program, not the
server. The server can only claim funds by presenting
valid voucher signatures to the program. The client
can always recover unspent funds via forced close
after the grace period.</t>

<t>The channel program intentionally does NOT inspect a
mint's freeze authority or mint authority.
Hard-rejecting any mint with a live freeze authority
would exclude most real-world stablecoins (USDC, USDT,
PYUSD, EURC), all of which retain an issuer-controlled
freeze authority. The cost of allowing them is that a
live freeze authority can freeze the escrow ATA at any
point in the channel lifecycle; once frozen, every
value-moving instruction (<spanx style="verb">topUp</spanx>, <spanx style="verb">distribute</spanx>,
<spanx style="verb">withdrawPayer</spanx>) rejects, wedging both the merchant
payout leg and the payer refund leg with no
permissionless crank to unwind it until the authority
thaws. The trust decision is therefore pushed
off-chain: a merchant accepting payments in mint <spanx style="verb">M</spanx>
implicitly accepts that <spanx style="verb">M</spanx>'s freeze authority can
wedge any channel denominated in <spanx style="verb">M</spanx>, and <bcp14>SHOULD</bcp14>
allow-list (see <xref target="mint-allow-list"/>) only mints whose
freeze and mint authorities it considers acceptably
governed. This mint-issuer trust model is distinct from
the Token-2022 <em>extension</em> allow-list in
<xref target="token-extension-policy"/>.</t>

</section>
<section anchor="payout-forfeiture"><name>Payout Forfeiture</name>

<t><spanx style="verb">distribute</spanx> never blocks on an unusable beneficiary
account. A nonzero share whose canonical ATA is
missing, frozen, closed, malformed, carries an
unsupported Token-2022 account extension, or has a
reassigned authority is redirected to the treasury ATA
and <spanx style="verb">payoutWatermark</spanx> advances regardless, so the
beneficiary permanently forfeits that share — later
repair cannot reclaim it. The same applies to the payer
refund ATA at <spanx style="verb">Sealed</spanx>. This removes a griefing
vector (a single poisoned ATA cannot stall payouts to
the rest of the channel) at the cost of forfeitable
funds. Operators <bcp14>SHOULD</bcp14> ensure recipient, payee, and
payer ATAs exist and are healthy (initialized,
unfrozen, canonical, extension-clean) — or withdraw the
payer headroom via <spanx style="verb">withdrawPayer</spanx> beforehand — before
cranking <spanx style="verb">distribute</spanx>.</t>

</section>
<section anchor="voucher-replay-protection"><name>Voucher Replay Protection</name>

<t>Vouchers are bound to a specific channel incarnation
via <spanx style="verb">channelId</spanx> — the address is per-incarnation,
because <spanx style="verb">openSlot</spanx> is a PDA seed — and ordered by
<spanx style="verb">cumulativeAmount</spanx>; there is no per-voucher nonce.
A voucher from one channel cannot be replayed in
another, and a voucher from a closed channel cannot
be replayed against a reopened relationship, whose
channel lives at a different address (see
<xref target="reincarnation-replay"/>).</t>

<t>This replay protection depends on deterministic PDA
derivation. The channel address <bcp14>MUST</bcp14> be bound to the
channel program ID and channel open parameters so that
vouchers cannot be replayed across different channel
program deployments.</t>

<t>Vouchers are not bound to a cluster; the same program
and seeds derive an identically-addressed channel on
another cluster, so a voucher could in principle be
replayed there. This residual cross-cluster replay is
an accepted operational risk, mitigated off-chain by
pinning each server and channel to a single cluster.</t>

</section>
<section anchor="reincarnation-replay"><name>Reincarnation Replay</name>

<t>Terminal closure ends with full deallocation of the
channel PDA — by <spanx style="verb">distribute</spanx>'s fast path or by
<spanx style="verb">reclaim</spanx> (see <xref target="channel-closure"/>) — and the same
participant relationship can legally be reopened.
Replay protection across incarnations is address
binding by construction: <spanx style="verb">openSlot</spanx> is a PDA seed,
so every incarnation derives its own address, every
voucher signs over <spanx style="verb">channelId</spanx>, and the program only
accepts vouchers whose <spanx style="verb">channelId</spanx> equals the live
channel's address.</t>

<t>The channel address never repeats. An address
encodes one fixed <spanx style="verb">openSlot</spanx> in its seeds, so <spanx style="verb">open</spanx>
can only ever derive it while
<spanx style="verb">clock.slot − openSlot &lt;= OPEN_SLOT_WINDOW</spanx>.
Incarnation N's address stays occupied — live, then
<spanx style="verb">Distributed</spanx> — until it is deallocated (by <spanx style="verb">distribute</spanx>'s
fast path or by <spanx style="verb">reclaim</spanx>) at some slot
<spanx style="verb">C &gt; openSlot_N + OPEN_SLOT_WINDOW</spanx>; from <spanx style="verb">C</spanx> onward
the open window has permanently closed over
<spanx style="verb">openSlot_N</spanx>, so no second channel can ever exist at
that address, for any client behavior inside the
window — including adversarial choices of
<spanx style="verb">openSlot</spanx>. An old voucher can never match a later
incarnation: the later incarnation lives at a
different address, so a stale voucher fails the
address binding (wrong <spanx style="verb">channelId</spanx>) or targets a
deallocated account.</t>

<t>Two rules keep this argument sound:</t>

<t><list style="symbols">
  <t><spanx style="verb">OPEN_SLOT_WINDOW</spanx> is consensus-critical and <bcp14>MAY</bcp14>
only ever be decreased in future program versions.
Increasing it would re-arm the addresses of channels
deallocated under the smaller window: an address
whose <spanx style="verb">openSlot</spanx> was already too stale to re-derive
could become derivable again, allowing a second
channel — and the old vouchers — to land at it.</t>
  <t>Future <spanx style="verb">openSlot</spanx> values <bcp14>MUST</bcp14> be strictly rejected
at <spanx style="verb">open</spanx>. Beyond breaking the inequality above, a
far-future <spanx style="verb">openSlot</spanx> would push the reclaim gate
arbitrarily far out, permanently stranding the
operator's PDA rent.</t>
</list></t>

</section>
<section anchor="open-transaction-binding"><name>Open Transaction Binding</name>

<t>Servers that sponsor or submit open transactions <bcp14>MUST</bcp14>
treat the decoded transaction contents as the
committed request. A malicious client can otherwise
present a benign HTTP envelope while embedding a
different payee, distribution split, deposit, signer,
channel PDA, or grace period. Such a mismatch can make
the server sponsor or meter a channel it did not
challenge.</t>

</section>
<section anchor="cumulative-amount-safety"><name>Cumulative Amount Safety</name>

<t>Vouchers authorize cumulative totals (not deltas).
A compromised voucher only authorizes up to its
stated amount. The channel program enforces that
settlements never exceed the deposit.</t>

</section>
<section anchor="grace-period-security"><name>Grace Period Security</name>

<t>The grace period prevents a race condition where the
payer withdraws before the server can settle. Without
it, a malicious payer could use the service, then
immediately withdraw. The server has the grace period
to submit any outstanding vouchers.</t>

<t>Servers <bcp14>MUST</bcp14> verify that a new channel uses the
challenged <spanx style="verb">gracePeriodSeconds</spanx>. If the transaction
sets a zero, shorter, or envelope-disagreeing
<spanx style="verb">grace_period</spanx>, the payer could request close and
recover funds before the server has time to settle
accepted vouchers.</t>

<t>Because <spanx style="verb">topUp</spanx> <bcp14>MUST NOT</bcp14> clear <spanx style="verb">closureStartedAt</spanx>,
servers <bcp14>MUST</bcp14> guard the equivalent grief vector at
the HTTP layer by rate-limiting <spanx style="verb">requestClose</spanx>
retries and refusing to extend service after a
forced-close broadcast.</t>

<t>Servers <bcp14>MUST</bcp14> stop accepting new service vouchers
once <spanx style="verb">closureStartedAt</spanx> is set. During the grace
period, the server <bcp14>MAY</bcp14> use the latest previously
accepted voucher to drive <spanx style="verb">settleAndSeal</spanx> (and,
optionally, <spanx style="verb">distribute</spanx>). Servers <bcp14>MUST NOT</bcp14> resume
metered service after <spanx style="verb">closureStartedAt</spanx> is set.</t>

</section>
<section anchor="delegated-signer-risks"><name>Delegated Signer Risks</name>

<t>If client-controlled delegated voucher signing is used, a compromised
delegated key can authorize spend up to the delegation's limit.
The <spanx style="verb">authorizedSigner</spanx> is bound into the PDA seed set
at open time and cannot be changed without closing and
reopening the channel. If a delegated signing key is
compromised, the payer's only recourse is to call
<spanx style="verb">requestClose</spanx>, but the attacker retains the ability
to sign vouchers up to the full deposit cap throughout
the entire grace period before funds can be recovered.
Implementations <bcp14>MUST</bcp14> treat delegated keys as
short-lived, single-session credentials with TTLs on
the order of minutes to bound exposure in the event
of a key compromise.</t>

<t>With <spanx style="verb">voucherSigner</spanx> set to <spanx style="verb">operator</spanx>, compromise of <spanx style="verb">operator</spanx> permits
voucher creation up to the deposit cap. Theft of the reusable proof
does not permit direct voucher creation, but lets the thief request
service that the operator can charge to the channel. Replacing a
compromised proof requires closing and reopening the channel.</t>

</section>
<section anchor="channel-program-trust"><name>Channel Program Trust</name>

<t>Clients <bcp14>MUST</bcp14> verify the <spanx style="verb">methodDetails.channelProgram</spanx>
in the challenge matches a known, audited program
before depositing funds. A malicious server could
specify a program that steals deposits.</t>

</section>
<section anchor="cpi-and-program-id-validation"><name>CPI and Program-ID Validation</name>

<t>Channel programs frequently rely on external Solana
programs, including the System Program, SPL Token or
Token-2022, Associated Token Program, and native
signature-verification programs. Implementations <bcp14>MUST</bcp14>
validate every external program account used in CPI
against the expected canonical program ID before
invocation. Implementations <bcp14>MUST NOT</bcp14> allow
user-controlled program accounts to influence escrow,
settlement, refund, or signature-verification CPIs.</t>

<t>If multiple token-program variants are supported,
implementations <bcp14>MUST</bcp14> bind the chosen token-program
variant into channel creation and subsequent account
validation. A channel opened for one token-program
variant <bcp14>MUST NOT</bcp14> be settled or refunded through a
different token-program account.</t>

</section>
<section anchor="token-extension-policy"><name>Token-2022 Extension Policy</name>

<t>Implementations <bcp14>MUST</bcp14> enforce a closed allow-list of
permitted Token-2022 extensions at <spanx style="verb">open</spanx> and
re-validate it on every token-touching instruction.
Extension presence alone is disqualifying;
unlisted, unknown, or malformed extensions <bcp14>MUST</bcp14> be
rejected before any token movement.</t>

<t>The <bcp14>RECOMMENDED</bcp14> mint allow-list:</t>

<t><list style="symbols">
  <t><spanx style="verb">MetadataPointer</spanx></t>
  <t><spanx style="verb">TokenMetadata</spanx></t>
  <t><spanx style="verb">GroupPointer</spanx></t>
  <t><spanx style="verb">TokenGroup</spanx></t>
  <t><spanx style="verb">GroupMemberPointer</spanx></t>
  <t><spanx style="verb">TokenGroupMember</spanx></t>
</list></t>

<t>The <bcp14>RECOMMENDED</bcp14> token-account allow-list:</t>

<t><list style="symbols">
  <t><spanx style="verb">ImmutableOwner</spanx></t>
</list></t>

<t>All other extensions <bcp14>MUST</bcp14> be rejected:</t>

<texttable>
      <ttcol align='left'>Extension</ttcol>
      <ttcol align='left'>Reason</ttcol>
      <c><spanx style="verb">NonTransferable</spanx></c>
      <c>No transfer from escrow can succeed</c>
      <c><spanx style="verb">PermanentDelegate</spanx></c>
      <c>Delegate can move escrow arbitrarily</c>
      <c><spanx style="verb">DefaultAccountState</spanx></c>
      <c>Destination ATAs may be born non-<spanx style="verb">Initialized</spanx></c>
      <c><spanx style="verb">ConfidentialTransferMint</spanx></c>
      <c>Channel program does not produce confidential-transfer proofs</c>
      <c><spanx style="verb">TransferFeeConfig</spanx></c>
      <c>Withheld fees desync <spanx style="verb">deposit</spanx> / <spanx style="verb">settled</spanx> from escrow</c>
      <c><spanx style="verb">TransferHook</spanx></c>
      <c>Hook program can revert any transfer</c>
      <c><spanx style="verb">InterestBearing</spanx></c>
      <c>Visible amount changes over time</c>
      <c><spanx style="verb">ScaledUiAmountConfig</spanx></c>
      <c>Display-vs-raw divergence breaks exact distribution</c>
      <c><spanx style="verb">Pausable</spanx></c>
      <c>Mint-level pause can block escrow release</c>
      <c><spanx style="verb">CpiGuard</spanx> / <spanx style="verb">MemoTransfer</spanx> (account)</c>
      <c>Distribution CPIs use neither delegate flow nor memos</c>
      <c><spanx style="verb">MintCloseAuthority</spanx></c>
      <c>Mint identity can be recreated while channels reference it</c>
</texttable>

<t>Implementations <bcp14>MUST NOT</bcp14> resolve transfer-hook extra
accounts, route through fee withholding, or honor
pause flags.</t>

</section>
<section anchor="account-ownership-validation"><name>Account Ownership Validation</name>

<t>Before deserializing or mutating any account,
implementations <bcp14>MUST</bcp14> validate the expected owner for:</t>

<t><list style="symbols">
  <t>the channel PDA account;</t>
  <t>any escrow SOL or token-holding account;</t>
  <t>any mint account referenced by the channel; and</t>
  <t>any payer or payee token account used for settlement
or refund.</t>
</list></t>

<t>Servers performing off-chain verification <bcp14>SHOULD</bcp14> also
verify account ownership and program ownership against
RPC state before accepting an open, top-up, settle, or
close flow as valid.</t>

</section>
<section anchor="channel-exhaustion"><name>Channel Exhaustion</name>

<t>A malicious client could open many channels with
small deposits. The on-chain storage cost is
transient: closure closes the escrow ATA immediately
and deallocates the channel PDA once the epoch
window has passed (fast path or <spanx style="verb">reclaim</spanx>), and the
operator (<spanx style="verb">rentPayer</spanx>) recovers all of the rent it
fronted (see <xref target="channel-closure"/>), so channel spam
does not strand rent permanently. It does, however,
tie up operator SOL while channels stay open — plus
a per-channel PDA-rent float of roughly 2.7 million
lamports for up to the window after close — and
consume server resources.</t>

<t>Servers <bcp14>SHOULD</bcp14> therefore still enforce a minimum
economically useful deposit to avoid channel spam
with balances too small to justify signature
verification and settlement overhead, and <bcp14>SHOULD</bcp14>
apply the advertised idle timeout to recycle the rent
float. Operators <bcp14>MAY</bcp14> use shorter advertised timeouts for
low-value channels, but <bcp14>MUST</bcp14> keep the effective timeout
stable after opening a channel as required by
<xref target="idle-timeout"/>.</t>

</section>
<section anchor="denial-of-service"><name>Denial of Service</name>

<t>To mitigate voucher flooding and channel griefing:</t>

<t><list style="symbols">
  <t>servers <bcp14>SHOULD</bcp14> rate-limit voucher submissions per
channel;</t>
  <t>servers <bcp14>SHOULD</bcp14> perform cheap format and monotonicity
checks before expensive signature verification;</t>
  <t>servers <bcp14>MAY</bcp14> enforce a minimum voucher delta; and</t>
  <t>servers <bcp14>SHOULD</bcp14> refuse channels with prolonged
inactivity or uneconomic deposit sizes.</t>
</list></t>

</section>
<section anchor="clock-skew"><name>Clock Skew</name>

<t>Voucher expiration depends on timestamp comparison.
Servers <bcp14>MUST</bcp14> allow configurable clock skew tolerance
(<bcp14>RECOMMENDED</bcp14>: 30 seconds).</t>

</section>
<section anchor="solana-verification-programs"><name>Solana Verification Programs</name>

<t>This specification uses Solana-native verification
primitives where possible. The base interoperable path
is Ed25519, using either:</t>

<t><list style="symbols">
  <t>an <spanx style="verb">ed25519</spanx> verification instruction in the same
transaction as <spanx style="verb">settle</spanx> or <spanx style="verb">settleAndSeal</spanx>, with
the channel program reading the Instructions sysvar
to confirm success; or</t>
  <t>direct in-program verification if compute budget and
implementation constraints permit.</t>
</list></t>

<t>Implementations that support delegated <spanx style="verb">secp256r1</spanx>
passkey signers <bcp14>SHOULD</bcp14> use Solana's native
<spanx style="verb">Secp256r1SigVerify1111111111111111111111111</spanx>
verification program and <bcp14>MUST</bcp14> define a distinct
<spanx style="verb">signatureType</spanx> and wire format for that extension.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="payment-intent-registration"><name>Payment Intent Registration</name>

<t>The <spanx style="verb">session</spanx> intent is registered by
<xref target="I-D.payment-intent-session"/>. This document does not
register a new payment intent; it defines how the
<spanx style="verb">solana</spanx> payment method implements the registered
<spanx style="verb">session</spanx> intent.</t>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC3339;
&RFC4648;
&RFC8174;
&RFC8259;
&RFC8785;
&RFC9457;
<reference anchor="I-D.ryan-httpauth-payment-01" target="https://datatracker.ietf.org/doc/draft-ryan-httpauth-payment/01/">
  <front>
    <title>The 'Payment' HTTP Authentication Scheme</title>
    <author initials="B." surname="Ryan" fullname="Brendan Ryan">
      <organization></organization>
    </author>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <date year="2026" month="January"/>
  </front>
</reference>
<reference anchor="I-D.payment-intent-session" target="https://datatracker.ietf.org/doc/draft-payment-intent-session/">
  <front>
    <title>Session Intent for HTTP Payment Authentication</title>
    <author initials="B." surname="Ryan" fullname="Brendan Ryan">
      <organization></organization>
    </author>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <author initials="T." surname="Meagher" fullname="Tom Meagher">
      <organization></organization>
    </author>
    <date year="2026" month="June"/>
  </front>
</reference>


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="SOLANA-DOCS" target="https://solana.com/docs">
  <front>
    <title>Solana Documentation</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="SPL-TOKEN" target="https://solana.com/docs/tokens">
  <front>
    <title>SPL Token Program</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="BASE58" target="https://datatracker.ietf.org/doc/html/draft-msporny-base58-03">
  <front>
    <title>Base58 Encoding Scheme</title>
    <author initials="M." surname="Sporny" fullname="Manu Sporny">
      <organization></organization>
    </author>
    <date year="2021"/>
  </front>
</reference>


    </references>

</references>


<?line 2717?>

<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors thank the Tempo team for their input on this 
specification.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA9y92XIc19UueL+fIg8UHUJJVUUAHEQBls4BJ4s2KdIEJbXt
cKiyqhJAmoXKcmUWQFjiH/9l922fjji3HdH9JH3u+yHOk/T61rCHzCyA8u+h
o3Vhg0AOO/ewxm99azQauaZsFsVhdlIt8mWenRR1XVbL7PmyKZZNdlqts2/e
vn2dvc6vL/CL401zTv9fzvKGLnP5dLouLtt3u3k1W+YX9NT5Oj9tRjX/dVTL
X0d7e+6yWOPHw4x+pkcVZ9X6+jArl6eVK1frw2xZvazm5am+5u16UzcHe3tf
7h24ejO9KPk5zfWqwD3zYlXQ/ywbN6uWdbGsN/Vhdpov6sK5nIZbrQ9dlo0y
GdGLzbzKfp0v8ul6Q7/O6AF0+Ytx8rviIi8Xh9mCrh2fye//i3zEuFqf8SX0
//6zn1Wb5VwmJLzoN1V4/JOirtYXRb55Hz/+z9V47v/wi5//spyd58UiO67r
/DS86uU4+o2+6EIu/S8XFU1QtTyjD6rHs+oivOil/iV7QX9ybkmDovddFpi5
N88eH+zvf6k/3r1713689+DeQ/3x4f4X9+zHg/t2wcMvHt7XH7+8d/8L/Ph8
9GS8vs6Xo/OmWWF1RivZWaO9/UMej+7HnbfnRfapbrtPZROmmy87mZ0XF8WO
3JWvz4rmMMNj68M7d2i68madz94V63FZNKeY1zu0Le/Ijuwdwp29/Tv8sLBr
8J9N+KM1bbN8mb2he1t/+k3+rqA5fF9c8x/o5fTLg72DB/RV+tH2mSUfLDsL
6Sf/ssP3N314/zD+Pp8d/vC2usheFvnZebHuTMgD53DOow128urF8bfHoyev
Hp+05kO2/5NqtsGgb/hqPTy0p/Gtde/nbD1R8fgwnNcvRm9f/fbpt63BvH5B
3/WuWGav19XZOr/4qJHcaXDLf2xAj45Pnt5/mI7mUV4X9x9mT5czkpN0bv+m
s3DeXCx0X1zUq2q9vB5N+bmjvbs37IiX+XKTnfD16WD33YgUCv4nIzGCVzbO
vT0v62yuS5jNi9NyWdQZbeRsR+ZqJ9NNmV0U9Lp5Vl6sFoVfcFed6tWyV3cy
2bvZujgr66ZYF/Nseu1++mn7KfvwYciHaVMX2VXZnJdLfqIdK5wx1ytbMnnq
NoH14cPYVF7timU+XRT4BgxpmNH3F/kFrc2QFpoGuypomuYjjCGfzeiurKno
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
x3bsgWikkCULGxWRu3RkWoVqc2pFvFytbA01rDA2tN3gPbWtSlsqWJmAN1Rg
O7M/OxXYQicU13Xblk3quluF1llfobXTim1ut5nWaVsmN8qWuqjW74YSbaPe
m4/do5vqgrNOXXBcc9ou4EaMdEuNsNtSI7x9ebRyeGtVEXc+F+oKtYIyCYEl
Fb6Zr/DlI5OdBvYTHMp8cYWCbx9o8EfzI0RINpluLlY+jfO2UxYeCoRwYdyl
3Z/VyzJ3k1OavR81jv+jbo1JiwvHd+Hhq+i0GSWtcfag9taTw6BffKDk0bej
wIZmJBcYQreagTdJsbwsFtWqEL5dZ4ZQ+rFZaJc08dTEoxCdQ5+7irTzRYbY
NL2tXAj+VqA/ZkXRXmbueHo6Buz0FSVv7GlJCnPpQz65nX+h4QsHDmTF083Z
2TWfNZN9uRDhyqdzGJCWAqweTCkF8uDaB/+jdYo75knJ+oX2xZMwrS1bMusW
mJnhunY/WCmrTvy4WA+HvDQXn9jsD82XNSUqMRo9xiy6LbEJicCxwRXTozI6
kPHtsQ71C+6S8pX2Dg8rWAeSGC+qh1Igo4nOof+g6HuGtsMd034HtthOb5bK
N+OMiZ7EYYRfTT4Et1PD2WeuiFDCEYg6AtEEj6VtnaNDklJSarTZLLvEhJlJ
DXM/EO9ZYjEOXY8R2/LXg2pLbmyZP3EEuWMB91lBliboaZQpoZGEBGrN/I6J
SjfqijiAECCGoUDmXXHNotWj6GJwoUSfXcvi4dYfgs7qwqjaiUUZ4o7tumEn
2fj43jfL7/98/MUPL79rTn731+PLe79+8PbuXx79+cXVb+//+eUXry+fHix/
d7/+w913r9PsIv7b+fL974ofLn/9cP/B9Lv3Xz59/edvLvK3B3evL79/efCH
H6br9eoP0y9fb+rvn5XLcHthtz/79vLZX36/vHf9/Rff1NUfrr95U0/rP+9/
Pz/45tnsu+Lg25dvfvOXu+vfvD/7Yia3I/qld2c79L5nP8zn9483p385OflL
8fLgL9/uv//r9TRfPX7463tXT3/963d/uLp++6TZv5Tb2xtqB91Gkv/+hk9C
GAtzee9AU7RxgAh/YHwK/Sd/7sZTdhipxH/sxlToj4yu4z+byYCn3r1/sL9/
b+/Lu/LYaEvir8e/O340Ho+n7C3RDz6By4csAdp+tWNbc0cP65pE92XOWfEk
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
5x49bwaxfgI1D2JtypQwYUhRNyDviucBTJ0jQ4jAvOaf7Bj6lTuHMgz7Bb0C
9pMsRDYb81kvXpX4DYpETU3YCCgtJg0CbpLbHdwa2+Ra2Aq2XKVL0NryZ2UI
nLebh2hhYUq8wDI11bqWFK3S7jwwMM15fhfKZFNjh0jZ1M8BXrgdBh34KP2b
Gr0NGbRU2h9wHd4hIuxRi1ZXayqYlHiqh9VD/sb8Fq3fFtdCpHM4RKF5Wt5o
5gpF/6Cw8N9GfyGOBg4iQbIh/Xqdu/PZEHJdj2NS/CvI0hAcfdtu5rd7b+PI
S1TA0vuOGJIXaR60E/ep3TSoNIl7WYKKvfE3pQouY2XUx4X1/yqE/H/kci75
P3plku8akHPW7Og0CaKRZzIZMJuxRwPI8CTi59xDLuTUuDjCiXi2+bIddmNA
i4cSNw0iIubfC7UJAryr/mm1zm1SbOLq4Xq15HESNrb6U5GTichf5/B3Dopo
WsBZrgKIzSXB59k755EjTRRIaAo4vTBmMFNDkUwev2W3RDZnUj4QpNQ0P2m6
RMUgtaxRLNrYCqAiW/Csllhv2/ENoKvDg9QUIQlX0VOEWgGhdhlQH4vcVa3R
NDXEA81wKzW4lqWyq5zZ1JjOYr8Ifie2PeTnriahWQkRsygu+zPyZy9S0qR1
cVHNKR0jAjMEoNm24+Z3LQOUyW3D4uJTeJ54epsJIb3KI4DR3lbFue8VBhl7
INqzukVQ87fbImceBaqmmjiRdrKmvDI9i0rY8gDzvBfUhs0mkyPDKDGmmYJ1
KaVoe2VuJJ+oDp7IOJRQqNHEaoaB2KNeyvsYg9fw/t4kYHRUC03V0qb1RyOq
tdQx11TRP+XLmaUq8yYFYwqE/59dvg6kTJZhnUZjOlprhnNijS5l00qYiOfr
7oFEG3UNiJSMakRtiUjwaEpUEkEp4t9ML7SpUuYOLEsTmSmpLSuhXOqR8UE2
HIk1/ge5F/MQ7teDpFfqQWxBs+ADu0oWvRvz4TiwUpi9qpGj3PuZVleLh1PH
298cyDCzgjZNRMCMtfrVXqmcqDhS0jDSCDWfsk86olxKs1hBNXfpX44ODenQ
QEYmWz2cfan8QHQ+bgoj8T8AEMlzylOQ5xa+S+JzrJBjnFMHaGA9V9n1+mMP
J+WOpdauSdkFZMO2sARrU5eOWSrFirKxLM8ZQorY4m3oufWYEtsp9DZs3u9G
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
swEA

-->

</rfc>

