<?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.5) -->


<!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="trust200902" 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="June" day="30"/>

    
    
    

    <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, authorizes incremental spend via signed vouchers, and
settles on-chain when the session closes.</t>



    </abstract>



  </front>

  <middle>


<?line 82?>

<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">settleAndFinalize</spanx> and <spanx style="verb">distribute</spanx> so
the merchant payout, payer refund, treasury sweep,
and PDA tombstone all land atomically.</t>
  <t><strong>Fee payer separation</strong>: The server can sponsor the
cooperative on-chain operations it submits (open,
topUp, settle, settleAndFinalize, distribute) so the
client never needs SOL for transaction fees during
the normal session lifecycle. Escape-route
instructions (requestClose, finalize, withdrawPayer)
are client-submitted and self-funded.</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-  |
     |                           | Finalize +       |
     |                           | 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>Step 11 typically bundles <spanx style="verb">settleAndFinalize</spanx> and
<spanx style="verb">distribute</spanx> in the same transaction so the
merchant payout, payer refund, treasury sweep, and
PDA tombstone all land atomically.</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>

</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>
</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, and a salt) with the following
logical fields. Field names use camelCase; tag and
enum-variant values (<spanx style="verb">Channel</spanx>, <spanx style="verb">ClosedChannel</spanx>,
<spanx style="verb">Open</spanx>, <spanx style="verb">Closing</spanx>, <spanx style="verb">Finalized</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 fields without colliding with <spanx style="verb">ClosedChannel</spanx></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">Finalized</spanx> enum value</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">Finalized</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">finalize</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 <spanx style="verb">distribute</spanx> can reclaim the freed SOL rent to this account at <spanx style="verb">finalize</spanx> 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>
</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; and</t>
  <t>the authorized signer public key (or payer if no
delegation is used).</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>

</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">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><spanx style="verb">open</spanx> <bcp14>MUST</bcp14> reject the instruction when the target
PDA already exists with the <spanx style="verb">ClosedChannel</spanx>
discriminator; reopening a previously finalized
channel PDA is forbidden regardless of seed inputs.
<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-finalize"/>).</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 refund
to <spanx style="verb">rentPayer</spanx> at tombstone, and surplus escrow tokens are
swept to the treasury at <spanx style="verb">finalize</spanx>.</t>

<t>Servers <bcp14>MUST</bcp14> use a <spanx style="verb">salt</spanx> unique per channel. Reusing
the <spanx style="verb">(payer, payee, mint, authorizedSigner, salt)</spanx> tuple
of an already-open channel reverts <spanx style="verb">open</spanx> (the PDA
already holds an initialized <spanx style="verb">Channel</spanx>); resume that
channel instead of reopening it.</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">channelId</spanx>, <spanx style="verb">cumulativeAmount</spanx>,
<spanx style="verb">expiresAt</spanx>) from them (see <xref target="on-chain-voucher-encoding"/>),
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>.</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="finalize"><name>finalize</name>

<t>Permissionless post-grace crank. Transitions
<spanx style="verb">Closing -&gt; Finalized</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-finalize"><name>settleAndFinalize</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">Finalized</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> finalizes 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 finalizing</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">finalize</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">settleAndFinalize</spanx>
via CPI with signer seeds. The permissionless
<spanx style="verb">settle</spanx>, <spanx style="verb">finalize</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>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">Finalized</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, closes the escrow
ATA, and tombstones the channel PDA (see
<xref target="tombstoning"/>). The freed SOL rent from closing the
escrow ATA and tombstoning the PDA is reclaimed 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>.</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">Finalized</spanx> (finalization tombstones the channel in the
same instruction, so there is no later crank to
reclaim). 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">Finalized</spanx> that does NOT
tombstone the PDA. The program requires
<spanx style="verb">status == Finalized</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="tombstoning"><name>Tombstoning</name>

<t>The <spanx style="verb">Finalized</spanx> branch of <spanx style="verb">distribute</spanx> performs
tombstoning. The program <bcp14>MUST NOT</bcp14> fully deallocate
the channel account; it <bcp14>MUST</bcp14> realloc the account
data to 1 byte and write the <spanx style="verb">ClosedChannel</spanx>
discriminator at offset 0. The rent difference
between the pre-tombstone balance and the 1-byte
tombstone rent-exempt minimum <bcp14>MUST</bcp14> be returned to
the channel's <spanx style="verb">rentPayer</spanx> (the operator that funded
the rent at <spanx style="verb">open</spanx>), not the payer. <spanx style="verb">withdrawPayer</spanx>
<bcp14>MUST NOT</bcp14> tombstone.</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">settleAndFinalize</spanx> (or to bundle a
voucher into <spanx style="verb">settleAndFinalize</spanx> directly).</t>

<t>Without a grace period, the payer could
<spanx style="verb">requestClose</spanx>, immediately call <spanx style="verb">finalize</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>finalize</c>
      <c>Anyone (permissionless crank)</c>
      <c><spanx style="verb">status == Closing</spanx> and elapsed grace period</c>
      <c>settleAndFinalize</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</c>
      <c>withdrawPayer</c>
      <c>Payer</c>
      <c>Payer signer equals channel <spanx style="verb">payer</spanx> and <spanx style="verb">status == Finalized</spanx></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 above the rent
cost of the channel account plus a minimum
economically useful balance to avoid spam.</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-beta", "devnet", "testnet", 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>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>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.</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. Four 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></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="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">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">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><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>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,
  "transaction": "AQAB...base64..."
}
]]></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.</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><bcp14>OPTIONAL</bcp14></c>
      <c>Final signed voucher (see <xref target="voucher-format"/>)</c>
</texttable>

<t><spanx style="verb">Action: "close"</spanx> is a request for the server to
broadcast <spanx style="verb">settleAndFinalize</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>When <spanx style="verb">voucher</spanx> is present, it <bcp14>MUST</bcp14> strictly advance
the on-chain watermark
(<spanx style="verb">settled &lt; voucher.cumulativeAmount</spanx>). A supplied
voucher at or below the current on-chain <spanx style="verb">settled</spanx>
is invalid and <bcp14>MUST</bcp14> cause <spanx style="verb">settleAndFinalize</spanx> to
reject; clients <bcp14>SHOULD</bcp14> omit <spanx style="verb">voucher</spanx> instead when
no additional settlement is needed. When <spanx style="verb">voucher</spanx>
is omitted, the server finalizes at the current
on-chain <spanx style="verb">settled</spanx> watermark.</t>

<t>See <xref target="close-cooperative"/> for the full settlement
procedure, including how <spanx style="verb">settleAndFinalize</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 and authorize a cumulative amount
because <spanx style="verb">channelId</spanx> is already bound to that context.
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 48 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>32</c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>Raw Solana address bytes</c>
      <c>32</c>
      <c>8</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>u64 little-endian</c>
      <c>40</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>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 layout is
the on-chain argument for <spanx style="verb">settle</spanx> and (without the
<spanx style="verb">hasVoucher</spanx> byte) for <spanx style="verb">settleAndFinalize</spanx>.</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 and canonicalize the voucher data.</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.</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 discriminator is not
<spanx style="verb">ClosedChannel</spanx> (i.e., the channel has not been
tombstoned by <spanx style="verb">distribute</spanx>).</t>
  <t>Verify <spanx style="verb">status == Open</spanx> (i.e., <spanx style="verb">closureStartedAt == 0</spanx>
and the channel has not yet been finalized).
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">settleAndFinalize</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">settleAndFinalize</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">settleAndFinalize</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 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>

</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">Finalized</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>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.</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">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">authorizationPolicy</spanx></c>
      <c>Voucher signer policy</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>
</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.</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>The available off-chain balance is computed as:</t>

<figure><artwork><![CDATA[
available = acceptedCumulative - spentAmount
]]></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>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 = acceptedCumulative - spentAmount</spanx>.</t>
  <t>If <spanx style="verb">available &lt; cost</spanx>: return 402 requesting a
new voucher or topUp.</t>
  <t>Persist <spanx style="verb">spentAmount += cost</spanx> BEFORE serving.</t>
  <t>Serve the resource with a receipt.</t>
</list></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 voucher acceptance and debit
processing per <spanx style="verb">channelId</spanx>. 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>

</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>, 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, and salt 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>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></t>
  <t>Validate the complete compiled message — resolving
any version-0 address-lookup-table entries — not just
the channel instruction. Verify the transaction 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>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;
   - 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 finalized; and
   - <spanx style="verb">closureStartedAt</spanx> is <spanx style="verb">0</spanx>.</t>
  <t>Create server-side channel state.</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, <spanx style="verb">mint</spanx>
(still allow-listed), <spanx style="verb">payee</spanx>, <spanx style="verb">authorizedSigner</spanx>, and
<spanx style="verb">distributionHash</spanx> all match the active challenge and
session. 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>

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

<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">settleAndFinalize</spanx> (within grace) or <spanx style="verb">finalize</spanx>
(after grace).</t>

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

<t><list style="numbers" type="1">
  <t>If a final voucher is provided, verify the
<spanx style="verb">SignedVoucher</spanx> against the active channel:
<spanx style="verb">voucher.channelId</spanx> equals the payload <spanx style="verb">channelId</spanx>,
<spanx style="verb">signer</spanx> equals the channel <spanx style="verb">authorizedSigner</spanx>, the
Ed25519 signature verifies over the Borsh payload,
freshness checks pass, and
<spanx style="verb">settled &lt; cumulativeAmount &lt;= deposit</spanx>.</t>
  <t>Build and broadcast <spanx style="verb">settleAndFinalize</spanx>. The
server <bcp14>SHOULD</bcp14> bundle <spanx style="verb">distribute</spanx> in the same
transaction so the merchant-side payout, payer
refund, treasury sweep, and PDA tombstone all
land atomically. 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">settleAndFinalize</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="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>Client submits <spanx style="verb">requestClose</spanx> directly to RPC.</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">settleAndFinalize</spanx> with the latest
voucher.</t>
  <t>After the grace period, any party submits
<spanx style="verb">finalize</spanx> (permissionless) to transition the
channel to <spanx style="verb">Finalized</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; the merchant side is paid, any
pending payer refund is also paid, residual is
swept to treasury, and the PDA is tombstoned.</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>
</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>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>

</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="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">Finalized</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 via
<spanx style="verb">channelId</spanx> and ordered by <spanx style="verb">cumulativeAmount</spanx>. A voucher
from one channel
cannot be replayed in another.</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="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">settleAndFinalize</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 delegated 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>

</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, consuming on-chain storage. Channel
programs <bcp14>SHOULD</bcp14> require a minimum deposit that
covers the rent cost of the channel account.</t>

<t>Servers <bcp14>SHOULD</bcp14> also enforce a minimum economically
useful deposit to avoid channel spam with balances too
small to justify signature verification, storage, and
settlement overhead.</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">settleAndFinalize</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 1830?>

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

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

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA82923IbR9YueJ9PUVuOCZP+AUjUwQex7b1pHWx2SxZbpO3p
7uhoFIAiWRZYha4qkELb+mNfztzOTMTcTsTMk8zcz0PsJ5n1rUMeCgVK7t39
9/jCAoE6ZK5cuXIdvzUej11XdsvicXZaL/Mqz06Lti3rKjuuuqLqsvO6yb49
OzvJTvLNFb44WneX9G85zzu6zOWzWVNc9+92i3pe5Vf01EWTn3fjln8dt/Lr
+N49d100+Pg4o8/0qOKibjaPs7I6r125ah5nXbNuu/v37n1x775r17Orku/s
NqsCVy2KVUH/qzo3r6u2qNp1+zg7z5dt4VxOA6ybxy7LxpmM4cV6UWff5Mt8
1qzp64weQJe/mCTfFVd5uXycLenayYV8/19k2JO6ueBL6F8/0ef1uloICcKL
fluHxz8t2rq5KvL12/jxP9WThf/hVz//ZTm/zItldtS2+Xl41ctJ9I2+6Eou
/S9XNRGori5oQu1kXl+FF73UX7IX9JNzFQ2K3nddgHKvnz+5f3DwhX588OCB
fXz46cPP9ePnB589tI/3H9kFn3/2+SP9+MXDR5/h4/H46aTZ5NX4sutWWJ3x
SnhpfO/gMY9HOfDO2WWRfayM9rGwXcpu2en8srgq7shdeXNRdI8zPLZ9fPcu
kSvvmnz+pmgmZdGdg653iRHvCg8ODuHuvYO7/LDANfjPCP51Q2yWV9lrurf3
02/zNwXR8G2x4R/o5fTl/Xv3P6VZ6aRtmiVvJeP+dMq/brv9XRMfHsY/Ztrh
h7P6KntZ5BeXRbNFkE+dw86OGOz01Yuj747GT189Oe3RQ9j/aT1fY9C3zFo3
D/E05toOTmfnjorHh+GcvBifvfrds+96gzl5QfN6U1TZSVNfNPnVB43kbodb
/vsG9PXR6bNHn6ej+Tpvi0efZ8+qeb0oad/+XXvhsrtaKl9ctau6qTbjGT93
fO/BLRzxMq/W2Slfnw72wI3pCMH/MhIjeGXn3Nll2WYLXcJsUZyXVdFmxMjZ
HaHVnUyZMrsq6HWLrLxaLQu/4K4+16uFV+9kwrtZU1yUbVc0xSKbbdzPP+/e
Ze/ejXgzrdsiuym7y7LiJ9q2wh5zg7Ilk6fuEljv3k3skGtdUeWzZYE5YEij
jOZf5Fe0NiNaaBrsqiAyLcYYQz6f011ZV9PXbb1u6C/XXTb1+uIyq8/PxySt
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
a+2Ka00jY+a2HfjpQ29b7DFIL7yY+XJ1mc8KbjqwoJ/2re6NY8UNeBxpKfJd
nOIpwjbqCLhryqmvMXQTjEqADX8mmYgvSdYAe2L37bWkjzHVvAHG+kps8ykg
TjqL1u356GNIPRKEooAKkvRE4DPc21uq7vieRCA1l5QibrLKUVlXqRRzCZAu
8eIKit0VrQBSM9OTdRqi+rvKIiWelEBc7yqLRGUkGrcL1HpnnQ9CF8xQeRDA
XpyWURahPZxiib7xuX28DkjaJ61mvm4F0M0eEcOdCjonPL0kVdYNg9v4PHVL
tlSUV0tZUOxxxjBzOlSi2k3ddJy9kuyzDyGhgTeqHngWQRYJnkcIqTG4CSO1
S0lEwKQtc4eQ++Iv6q74i2oKEoAMgFW+TIWv+rh1lq+ligVnWghOW7WhDd0U
PWgVCUmhKzWjaA34/5n6BjAtyWjOWlSmk81CWdHU5+2NgzaNus56RvsSLU1Q
TFYuxTcmjgBJ7SOZd1HVAkrDA3b6igTJwBBPPIq45B0GBBhk8s3WFxcbNh5s
7XNJCZOps++eloJEdcG1Gsisi2AYElgbT1Hu1ov4qxfagcUSqhvY6BzX9Suw
JYkmOaVjORQM2wTee2SaSoo1wytkzVtVVIDBuQmdAtbB28S+51iG+AV3ScCn
z+FhBVuPY+H8cTSSkJJaSiM/oWg+I+NwgBLE7UtHqVOOB7gtEJyoA9Ca6Pzn
KkQunaXRjUO4hewe8042ZgDwWIyvdNdw7ZB2g0DqvwQNTUsKcxVb8qeWeOln
+PZlKneMLIgy3vF6P75+8vDb6oefjj778eX33env/3Z0/fCbT88e/PXrn17c
/O7RTy8/O7l+dr/6/aP2jw/enMjtLNzpVvx354u3vy9+vP7m84NPZ9+//eLZ
yU/fXuVn9x9srn94ef+PP86aZvXH2Rcn6/aH52UVbi/s9uffXT//6x+qh5sf
Pvu2rf+4+fZ1O2t/Ovhhcf/b5/Pvi/vfvXz9278+aH779uKzudwO5Vvvzu7Q
+57/uFg8Olqf//X09K/Fy/t//e7g7d82s3z15PNvHt48++abN3+82Zw97Q6u
5fa+XnDHGsj7//6OKUGLBi0f3pe/E/0UP7AHhv6Tn7fVuTvsi+MfIwbEnUe/
P/p6MpkIaDx9uOPeqR8gMjj1iCOb81Sbv4rVaUdf0tMipO4w6NG/zhS1UX+o
NXpbKERQkEO9pdeuovtPk4bdVmxlFeyQ+3mn0DhnAjlooG8eR8CrDdwUK/aM
Q3CbjJqkq8OOgzvAVwBYsFWHc/5MOqF/3VLIEP9hCxF47HbL8Jba9b9XXTf1
mxPYUiU8WRT23NxBhZz28diuSv6XrYaM7Z+6LSKjg5PBet3sb90c0x4RNVhn
PWdCKJVNg652oSnpcKqoL/7WfNGF0+yM9/eF20daDRrfb2u4nP/U24Ri7miF
buQw7eOscG60kCQu1nu8zSWhztf7qENm8WigDYxkkWpLe64k8D+IRSDpd55m
Wn0UixqLFohR55c39kFbfjkIyCCLWrzh4sB5KNFyexGmhtlQW0AZROwjXzXq
U3pzRtmckap3ozVsjEo+gCADIVlWAl/pHSCiEQ8xBldNgF8P++FsRBXiiSuM
Dld0VXVyxIW8llIKlYuF+hD8/RhWEqfQFQml+qr06szcbdg4rDJj6zB3jCN+
CZqeRC3C0JxHnERCImwU63TwQS0TGaZKNg5nwpnj5Dlv2uznj3q7mAWhXfQ0
7/J/mqB7r+wymE5OpuhrK4UeAlt8uONhio0fobtyM5u9cKio6y9A2yQevwHf
E1+pYGCQcT1M9RDCzfbKTx8Csv4eu1st/H9V0LZFhkx40ETaKUHWFs2MvroK
vl0VwtIsxYI4HwC5c8g4EkySuxjd3zgHFu0zuOKYJYNUsEhGHffYqhufFlIi
hYQk+xGxpaDNRn6KDoWWhqYVRWbZBho5bwSxhzb21e2z6sR4yiWXrIvZH/k2
Ur+pupTS1jA9bFbrcSkVFhJ/1rXiQKsANZPk0EMw7fyTx53M0ippTQ41C70f
PVeUL3H68mpJMxgQZ7K76kRcBCkksKHKOzH+ZaDdxgxvrqZRy38RwXn6bBbG
0rAZqZPJgJ9F81RF15rc/bN293vUbdtDXM60xwum+6/9lREQDfekgY7wKD5q
b3+aVw+tCCJ40tLHSDR3l2KmSF93LOJnUzwVtwWJ2t27VCHFUjXL9jix2MPP
FcyLNgZ3nHJxzySOiL6S0q5fshdFdUEKUlhX36EtCoRuffglXb97dB+DoKZi
+nV+Y9mD5hiSceEevp6hbIaEMgJFy5IhgJAunIvn++E9uyeVu/2LRXh+mUpL
EFqpK63jTq27WsISzGNejGqXG63Cuj/h9REPma2/+Py2owQfw4O7mbgHJqa9
XPalYoLz7s9yuJG4CVrEiuJElRWXVQw9zrYBl/2NLm7qJcLN9wvTZmGlx5NB
Lq27LouboB1t4X5DBJXV+VJ6iN7ABxoGYqyo4D94ibyTdezQqivRGA1zjwfu
Mfrw4j3LzYeIT9CP8Mr9+IZYnZkkG+mHuKtZUFxiuthGEh0txh4vkDqjtwiz
kHDz7MJSMyCqbPOPtNr7IWRKbssKrj7u/KKG5pl+I1vrFMk9UTkXRBm940Hy
Dn9NlEkaqieZrwZA4d1D/5Cp19bDJo6fpXUvWciFYqR19yg8YQtD7yuf4xYa
BSH9KvKU++w6pLMhTzpCe0C9h+jiccO6oCsv8wtk+HPEl5iCe01aFTduCUWl
Wk8G1rGwjFcSeYRs0mBgvv+ndIKVyqQA24pGa0uAbFzmYmBm3Cc1u/Okrix8
zxxybLfMN3dkN0TpfpILyOy/TTSkh+0gm9g5yOdEUqUvofGp43NtNtNchExk
bkg5hx6QV9q7ReNRUBKuCoG1hBIjicSyxmrl0fp+mrBZP4MjLb2RBH1mtl5X
r71yUkzS5C1USYqeIgvsq2+3KoqQBvZZYLM+yqA+ewCWDyXi1pBz6NWbQl4f
wKOlneRQHChxg3qekfqRXoOf3MO9x/mUEW/hliiaKBn/GtlDH4M64+olOQ2G
JN3nt2y633zpu3jZiboHtwSehkkropG6lkHbLyR1NzpVgwdAepcoftxIJSQP
TPDWoptYcEv84kI38xywiFn7priRFWYc5XmBlx7c853SeG1A3+kA31sW29F3
T410YvZORTv1pwOopq9ttUPf18+ev3r9jG/hJDyVObZfZF9WAPEnqRpQabkb
hKQ1YquGPPbHW1KIe8gNoKRl3MmTlWMRc5IYm7a2lCPrVTV+wo8cOrvUN5Mk
Kfn6g2K+jiBJYS+6Qb+YMqVynCAZ+jMnHEomLn2hb4hIv6pUlRuxhe20c9CC
6/03DPl07P0N9FvcTtUg5SIc20pXsu+EE2vIgxQmGhOKC7bxb5NoengF15YJ
eSYY3KsmpKTGaIZJ81OrHJcisiGS712WF2zUajwV8nZf1TPJEchXdC3UB4UP
L4DIA2Wv7CSJ0rqGOAX9DeRPG7EqNAIyReVlDi8zqIhBDEZtG+pp5AS9cSeR
Yldo7Jw0h+Bam4vHN3RNjWQSxTWxHhhZvjWdRNVK8U2sWiTBgGcessA+D2sA
RLKfOAj4LwZNRMA5hU4YY4NJX90lul1iDa9LyVDW1VXj5PTp7/AcrQ1NlNS+
deU5BNa0PmUHkrLHJ46QNGXNpDptyAeNyrQP8dGkzxtzpnmKhhzj+W2pfYcM
0MaH2vuXS+F3pAO9KD/wbq4rLiXDRyQt1QKJigGs2U2dW156fwupc2JdSQag
9G4IBSvs5rbaqJiqopHZVNg9mTSD1Ly0nz/ahXnoW/lIeaqUySOVYb3sypBU
Lylo1tpkAF2yVwEgl7M1hYx4YBYn0IQeI25qRQeHkYP/gxrVuR11A5ItIuGG
pTQcTerh0DU45HAYyKJgLqFsWi0zg4G0eWnb67H/PnESa4q59h5D85MXz/az
X37J/hSB/u3R17wN+BdfQrC3PviUL/8zctIFo4ZD0GNSY/iBgplGc0KK6TKi
VEjXJ1r8D1JuyD9ylv44E3ABsVHeV/WA191a30AXvA4NDu1Y1EYBPt4Asvts
U5eYRb4OY7xVKpEWSvChNlQqcXuhBATFQKkELTi3gzxaXsAxcHm1A8ZGM4fQ
h5dxJAEVh+RE4QWn6sKD+1Zdj8Ij633BHdFye4FH92ZHE3goan8JSi3qOZv5
ao+Yg6FldJ+N9uzTfuJoWJCdfns0vv/oU1AqmqGAuvk0Rga6SAmX7RWTC7Uw
pm29/AstLD1nip4ZDOEChZ5rpjXCQasya/JGnMu0Er3HLTh3NQs4Vly8cX4O
qclpWWxRdSVnYupuSwTSSyTspfEVRmcs+libEhAyfddFKJuhY+kWkJrgcKgh
/K+B3PzXoGs+XbM/tW8EjnYhWio+pPVHiBAIFTZ6m7S+e0WEzXnoU+5uA7IU
hDmnvnaUxgdnRtSqKIWwRNRiQyq1B7CspSPg7RCWmUJYOrGdehCWR+o4GgIk
S3hSNoygR0YvEvZr1ii3odGM8BYhYAQxmaWUBlB/1IsF6l1Xk5BJ8ANjvT3t
PCOYh5JvG9q4qL5XCjiGiZbxsriGE0K0QBcJGcV+nnHkezOkxLPqcBRie6IU
Off1xqrPY3woSUb2YRdTACVH18X+Mb3Zvw4px8vHGqUVbwBCEOiUt9S+4Kbc
abJixqDOIXqlRQ7iMQBYH4nLleHG9KcnSntndce9EEfZRnNKqzgcv9XC/OwI
ksC6R3xnpyNDHK9qNJsdbpY1lCnPe0BRG3InoOj8jBEyjpnLK4+WLpuBAbm0
n5CdC7mqg7w7hnq8bJ1ypOApSkSvXIXbzqOy0gV6RGFiFNQhCEZ7meaLhNge
tEqouKPf9xlhCSEBzyBsw6KEH6WJpAFw/vMAZSRhuEwtewlfii4vGzsMPnL9
ZpHb2rcy8SMIjmNOIt/EvYH8nD8WoCDOSANVWzGjclioSIJB1shNy8jurZQL
MNFwTharSyJ1Q7seD+/tj9BAeFVIR2FkyXYubhbU7liwBFd3a/UUiZEprJFl
cI2aJ4ZSkVfmoeouG0b1VrvUbM2RGCjS2GG+Ig2hOZgyoPgqb1uaUYtSa1TO
hkoJbe8IvYxPWq6DlI7A/Xgf87B1sBXfsbp8zI6R1In0Eh19YoKZvaReQTEH
D12m7WcvNUdmqxirbPt1XnEQQJr/+iA4ZA0HflPr/6PsOWncp1q3f1mu3O6y
j4iHJR+aSfTJJziVP/nksWiNkqM+W5fLRVTSkFq+Pu/cRwTSMv88KsAfccFz
UmKS7W0B3fVKTUZCPOCoL6TTUZoVqBORZl0+o0sRSrbrU5LUqolM+gy5YZj1
aVyYgpT54boYDKn3YH3SKesdd9mLbmTUK0N3mg6FtAAqCMWxnJiwvIGi6bHA
iWxht8ND3no9PDSlZrgcjLRS9Arsidg1x3gNlWAERM3MKkG8X6wNlNdJjut2
De9hXCBkT+b2qlGnbKwUc6D2dz9lkfiStseFZDhBzz6hM9MSfviC7UgelD5U
MgkBuBiY26/y4zA1VsPjxmyP4/SGW5MZdiYmPekFR5LyVlFYp3HtLKNxid5j
SZq+CPak1y771qq3wQo3TVHqhQIsu0l3C2OHxVAgAazBul9Z3emAa/6X7Fs4
RKPaKHXW28Vy66VcFHWxeQ4Hvn4dLu559JEkhDVU29GPMErFE8oSNaPK0Sf9
XJwkIkYCk35hX7wCtMkzRM9/VbErPp7ZVmqPz+Exq8cPTDii3xcJi5mEg7RL
rM/+GqFDOOqTfrEqGXE3pWqB9JUQCTKnETVuOFpi9XQScFAau36wJG4sIb0c
EHML3CzRwdkm1LlkJdcnch6B7e3SchO28AbNYmYcDa8eID/bKYARV2UZhq8e
siuaIG9M3cpRghK6t1idmsdAwu+vT56QWFuwWpk6Z8R5hhAFx3yxALRcFxy/
g/Fkj2k5G1XlDeeFugTmqK2XcdPVXoDdil5dr+jVYJ/M4rExKMXya7pKzD1f
QWh4baW3KBE6UI9buOHLgfAwQK/DNhCv2lnsyo42TQh0ofZOVRl9C1l8vr9d
9MCAqa07xJeOoN1sdsQtZF/AzfXzR4xRFJrKvuuVfhE9OZU4YKhxwTDX0HM1
gzMn5kgXZaypzozRHprVkj57XUhyJFrejmBf5H0bkKOXfMhZkSG77rUlvK8F
5LSNrH+ICDQflx9H+yAq07doLff6tIHpgFhR2+onLJaTVetp6ZtMXu0kxdPA
k0JXKFNMxlERF7aWBGjcUDFYV3rDNKmD57Gpie4nlcJJVTUzJVOZL2cAkop3
HOK0LticEck0pRp48NwB2RqV4pRTyAu/5JqyqDNHOF7sQQ7GQ0S31lyYOxJw
HJV5V3tFzyK69GSP87KHDJ8VE54nAQAn7k3HYJS8QF4/1JYWclaO2/y86DY+
0mJql/V9oiW/kBhV3jmp0l1XMScaA1pSgDoHixkppydI0GbsWoGWYWlnBQ+s
kfeVkgPgyIp7aYoQ4DSkcsbLl1u/TYTmPZyMuBPAeeWOinATS5zIIpXxyF7y
r/w1YmfK6W5IJQh3/YaDpNPHiuzOpfw6X2n9iqyEKLWC4b6JWSZITbL8gPiI
z/7tS3mkRvctsj9BJhJLmjQnxne/mBek0MlanIganp2GzPlEg0R8CD7jAfYi
NtI2twlOu2xvA/2WFhRELiEUpA6qtZxHnQ09UULTYeb1sjXwTjo02JR6ze42
VOVg9kUjwEZN2b4BvyxreDzXFTs2zFinu54Tq3NSycomhcNIOj+vSlIA6Rop
HCQeSCEjnTviQvUgTdK8HdVuP456PDpxZ/jDhmTA0kPOWzMX4dBtKbteIeTr
tlSw7TbDog/UCOET/7hQNp2kRWsCWISnCv7SpzskXaLdn8bHGkQSTnnD986p
lfKe1x1EDfOZW61T/lONMkougeFchGpy1SnMpVGGzDCoXjJodgQsN2P2/eoT
aSe+hOaAUG9Jo97YgdgbITqLM6sMKoQ6SqR5Ce5uvN0YLJeVjkN1LKTatN7M
DSE8uizvqDBrjcRZXp2q1VHFtx4MLK+DQckox5Kmg0736Esxzi/hqFrWFxcK
5ir2KjOoBPiYJ1YiRNHW/IrkJ+LGcyxkoaL2lly83iKHrM6B1C6OX0Fqu5WX
2pzsF+nJE297CRsTVzakZyilrV9GJ2ozsW5VaFQdY0fkmaQyUrRbuLyvQrBR
38gxtZTw4C+Bc9y55of9dfSLu2WcDBfm96Ar2igBcrlRqYRMAM32MYMoDNpO
NEhSEfyWUUPrxb+zNE71dYHUSM0ewcZVZkvrsZTNxsH6RcmyuSu57m8gN07A
iwfNJlJ7WLcXKYlxIjwbp37Kzt7OK42nwWkS7LZOJoKBxvDYUDI4FIRQ9fXA
DJjVHQ5HtiMyNOph303avLYvTmhBn6Q1bh6sgmz7aCeM2auGDcclL87WnDnV
Fr4vxIQubrrnVY/jxSgeAj10H4FOIEkkVIkyXhMJ092Uc0MhWayh+GPVE6rz
UNQp5I2YE6t0kxw66Ew/f9TXgjV3OyT29NyO2TBaBHSSHYARmnVZdglUDm7w
mL19W7jsAbREyTHJb2vrxWaAVUlq7Z7eEcCeewFrWIyMXqnvH6PgCamp2NGc
dxXF28KXfa/pKM6XHegFGrWXKKuAHJPOZX/Sy4BPuz40F0XXs58XcWK5UY7b
bFSh6Xys74qjTNRd63gr5sRoIBI1UoAyud48WyMF7/rLyppbJ7n9cu0AMJaB
X4kuo/bVcIp9H5QsOJZ3JeXHTdP7sThW0nvhOGuX0o+ktayMv7YKMA03KI8i
DuDNCDMQvWtd4vujTNqpxnWQPESt0CN6Cgy9cmZ/9Y6fxttF+4lAV7Eb7L1b
qIA+AspNK4Sy0ZEbFS3Ew4/6/WrIGL/mbVvPuV24ZCBHLT6kkmTPP9km3Osb
i/uOz1MGDC1vp/HVWhUezS0FXY6A2kpaOI5j3ZSo3evieoU8QNz3UZu1VuiK
47CP0tT8iLWGUelkDZgOyWTUX6zpZAPAu3RHX4r2pdq1rbSwdbKvbPH9mcUM
OumVFkRyOQFbjvxtymbJsBl2ZQwX6m5UsvCwsB0FrSWJMR3Ko8KyhBixom2k
w5xwVUKcs4rNtiw6+VAuo7gfHK7iStQDBvaib+RroYKxNO0dS9NeQynmsEzd
ZT+t2y5avX4+7y5qZnH2v2kDPoGTW8JJ41TrfMM9AwaSQCU275siCk1YkVVV
LQLStELSUXLm+Yp4vyCSZS8uOo515tzZxftm4CaGHS+dLHWoVtOCTcx5dJuU
DkNeKchIJl7cTIjH1dSQj5J+YGHj0FpHznbpwODDyJOoAiPxsdnREu21Hrbl
SNEnS1mTntd4GH+SVJr9QEhjAfjXlmz/DpzTSWoKZ/BxEZXKMZ8WGnoWKdj5
FgCjvS3BYJygZuR18GsaNhXrBXFrwACTpbpID1n4PXhZGYesU8gs9hBFQnHC
pSQkoSORQU98bCHVNFTLwuyV7fDH4QdivHFJC3tw4Fc2DcCE0sUtx4TKoJ68
inagQqqGy4rhMMIipPHpxeypHLw2MxtXrzRNLr5YlWfvfdFL49NBHc9S4MO0
6gncbZGrT9lSDJJX9wrK7c23c6rnO+FDuylq/RgdJb4B5N3QjFGh+5lnfVfI
RGA2gbYBhpFFoy8CE3NZXr0dzsPZgiThA7hJ+ay0OMV21I6uYiWMXZ/3790z
Ez7yRb5mL7lmWOQRrcV93g7hO7m9ntgI2tF+gjzCsO5NMcZSYePN7aAKzGxi
NI1SOUsjKjW+b0hyrFN50ctl5lL0F6qktl18UTgtUs/qG6DiDGfphVMD4igx
hUZuqucmq/X9PNA0xcWMArenrYejMA2RKpgOAyZDio/i+RWO4YBYqynnYdm4
PaQ4YhFXlFUMSi4HJRk+OI4sS1zSWVzSHkan53BwFoCWzoKh4THmR4gRIPhQ
5Q6aG2ceJ+/KaNOq6e/Zh5XtfVdHpvY+W9EqErey70Ri1PQ6nCicCn1/sGI0
7gwj9ZdWJcnmdlQoyYaLd/0PeGvYApB4ShwSCUEHC6TONuYk1ddM02jFo/fs
Tc7n4en/w46XlDhdvRqvU3ix2DyOdZC4vCAG7og3DAenrM9IK3aIHArWQCik
i6bl414eBGxt7VZifqjkwOMVOLZLtpJMON4cRKKKwlupbSFCxL6t+TpPR9O0
+0W/PrrKnsNlkTdD3s3slbbFCl1NNKDIp6Jl+naX7IW/YXDmpthdRUkT46Nz
n6Oavims2xOdQH5TJzQneew9CbhN+9nPH22DORl75ZqFHdUFW8naKBKgzMW9
ZI4YKyDII4kf4vKByv7oGLXitljAOMOh6B25xnRD4lIHtw124Os5e6gHpgLy
/ieJdFl58Fhkr7ViO0RF0MAUGyp3Xvgue7S7vkaWYbopB4uoOTM3y3p2gvYZ
3oUY1zMgtFV71isT44qCkQgL9dnRY0chrZ3bB4tCj+0cWmMT5+OGJUdtveMf
54gOTOPm0fB4a2pLzCvo4qE/DP298VXIebA2+7OQEGnA7xUjNGNTiwXFSySL
JDHANs5cS7c7E1V2fBTCFebeDvLhmOfaP7HIVT0I8bZtZfs2QWJeWTaKurd6
YAsT7ZW9XuxEgX3VklVP1BClhOZDuUFrZNfuElyNwHZJX9XSHQugZQ23Pjk5
Vu14jGYLRON81Wl65ZCY6TUatBwCNnvoX5QMnvczH3q6mzaDAdeAu6TSkKlU
1THuoOahQfxxhgcJ0esiJMg5S5BbVygVQ+CK+EEqGnqtiH0FOvcktra1+WoF
vMA0vA953Gs1Dm3gqr7W7u02KbT3tobLIlGfixg3wSopPMeaDbsgNeU4btiF
HJEa+jM8Hazt0LQSkHoapuOjwRLyLiO5yXkXcl2rULi9YftiYBrp65MnLHyS
hlqyDNy32XfDSiyvfd5cT33q7ECX8igjgRVY2e2hgXrCOz6FGo4dMfg9jD1t
xSOPP5++B0JDsgp0pixyz8PJl642Vz2w+Ci1Zj9x/WDdQtkRb9Yz70aTwowZ
oy4mbainkjDEYd7YaRISz6ZxaTuUD+klyyHJkTnUZBrxW5LGxGVwPvcaYx8m
cjxjOY4TOC+FQOwV1yxOmYoIDcF0a2u90ldEiVsr1EOp5A/lPVwl2kagJ9p7
WMSYIC4CVJb/FpwlCaQWvmwEPZm5GkqvsmjePw9vVozO3bBmLRcyWC6ztGC4
5WqxkuxyH9l6H8ZjH5Y2ZFbveM96jrC0vcfn3e664/XzJ9mDBw++iPAZLdfb
Yp7JrRHc45MoW9YPkoOb/Q6styVVDw3qgxKt2bp5D6plmhJNnHueg4585Ikc
VOfoSM9G4ch+hY71QHg8wGwfymHGVnZQR+OOIr19P1qMtrc132SSpjUae/Eh
n1yuOqRXADh3q5TMcqaI5GUIbJKazCELpxdg7y61oH/V2Ra1biI+dUB2qMTG
NS+oEBwCUZDsft92SAbgAwvWDDNKFS7eXuZrTTtdjOX6rTGukC7pLLFIS/wl
RyPPFNUkTcEju9SRnnBpkSAD0JkVm1plWOQA1PGk7oRTn86QnXmkOddLmBGJ
KHawzzcxbbxwIsejfvEcQPLZfd+/PlYnvqInO22Qpvl07O9pfcK6dU9j6BKO
l/Oh4PJmVnaoBofN1UmM1JLKQ1UbqiYX7ENb2GsMhhmNaUl/51BClIKBXcMo
oN8+O3rKdWa+6JONW09q/tP5+fPyV3Xgm1m9QO2oTXMRWldYG3HNLuPytvg5
nECG7TNHMROdMc+ahl772ti5lwBkuqVvVhT3LGkNNhXl1NKEr9nk1fiy61Zg
hrG15Lt38O7d4x1dUEZuqtjNYy9RNfQ+jUvgxsh4gQohNZRSkG+Vkzpraaqt
jZl9TqumyjiFBLiju1yAr1qnqgXaUtuRwu5flM3dgfUO9NqCqeQ3vYLr+L4v
bK9GXr+yctMff/xxfBQ5WqeaszJfc5LxE6igC6vUEv+S7Qp/lbwcSRbrykoB
/bqcvTjNDib3wTWyZWW7PZPgiGQxZj9/lKYxkxzjOB00iEuQbtjhGlquiORI
nLiwDqT9KCe2SuAPzjXBCINzTfIUttyDrW1bC9ZEBYGMIqXFaqr6kbLOMl1f
gSK9xHmTD6qwO4pQRP+wilKPzO7Twl2aFh6VC/YTxCfuW9oKYwkiStLbRi7R
7OIlQ3D2nuNuOF5KbMdMc1UzHEG+HJNtSN+HqjeyEb4/ffpklNH/z0bu5A/0
7yh79v3rJ4j6AUr5XPHfpSCK+1S17TopjXD91yupaymVyK0Ejoh3JckRSFp2
gyPnBdcv2Q8ZMock09lJuU2vfjkq9WM777yp/4bezgjubhwHWMdk6PVRpfbU
9zdKtHUSE6mFsK9BXDqAb4oFZ4haNolX3J34XgAf4zXtRF3HD2oKu54Ry7Yr
2HVd3XD3X6AUdeUyPuo6FBbnN63QlmbQdtya3MCxO9+0d7UGeo7zxT2PUYZg
5kXIXFaByWC9zFDTl1NnQEC+NZSuFv02xK6wY0GRgtnSFoPEbW2dWlHW91Jl
rGodUSGNYk7163be7cuel5oG9oB4HqsW6Q6B80ly4ljEtZZGO6ND7QIbGwaO
nMj8GuFeJSAjJcS1SFKjA7JHvTI/8RXZn8RVQFz9wvHgsb9gLGHKd+8s2595
gtS586Jk5fHnj4RPAGSv373rYbVIRsIM+IWtFmasq3Ur4YWA3uKsFXh2hCAq
x1Cl2bO4jEKkXWAuHHMcUg1tc4gXbZT5s3Lk3Xm0riQPfSpQRAyLovkps38I
jpTcwdTUovPAI6w6iMciqFIxMAeDgd8ChtIUFyQCsVFG6vV0MYgN9hIpQNzO
TImqTCvUQAyRkVNoeAyroD6ippAjpbSoIbS7nHOrwtHBflTdwCqDYhdDplVC
8CHBM3dBxDvnM4lmi9RJXzdIUqtllDLOgZQRkBheLtVny5gvmlrR9ZrD7vvm
DSpRdZqcj8LH1UQbDNdB7Q7564YHpql18EmKYKKhtBLglVodPqbzZXe5yfbU
fMA0R8QKnmWMqUaBAcaIgVT7TGhkyqjo5IWSF8H0aOr6Skrfe94XcSEC1Jaf
IH86FolpgkkfaFkSwZGO20lqu1fwReXwQPd50M9MRHGbvygowSEs7eE+G4A2
nWKXWeWCVi379XFx0FNg6jhDteJ0rlBLxsNd+eFm4kbiPX5bwwDDv1L/t3rK
LWMvgvMP7Q5DImQSsOslRshuyruA4DEwEQ0Mh3qCHoZi7Kye9FaAnxVWQYte
D4MxZYVzAo6AtgeSfsNqxkK0WdKgxjrpKJhNq630zeKq3jwEolkDQtkyGdxz
Dj3PYCTrtPi49PtXXWc81bGV+OqCATanCt4Oj3gAk7ls3yB1sysFCCOqpyU9
pZTSqB1VxdlAVfEkZJSfRa6Hr6XcMphLIt0EJANbTj2O/RxzYRK33fEw9mtw
AwguWtImppxl3YVKCnA+nRAkbet1GzmwQ7Ki84C9OJ8QmE56J2octbiaFQtB
aXWBm1QoxbkO4iD1+eEjy/2Nm3nyoZMo4oKdEvWHxBCv8jcCt6P0j2jGWyCU
hUKHWJQLzieJcs04nBqyHNScs6qtwOy+IUeUEtHBIUQKNnaBwHORhXfE1j8J
kLKNkMBZ24nAgNbcmB7+cA5FpRVs/U2usEzaIDTUIBjGhqIuCwMwSWVeEjGQ
gEBkBZ71TByGDxMOyfhrpPSK/11s/CDnTbK3MdZWZMjJ2CbZj+LVcFjcPGIu
eYrsXO8NkFAQuwQBlRdweO1tib14qX064xmggF+3CNRUnLZwMcTle/1iJB/1
htHBYSSjutVKJBXMAynPE8vcjrFmuH93ngmgdXsJ5aqR+JrulbGlM2K/90sE
gklh6bDiRlPfKZ3rZsuqmby1CEwdrRTVWlIv2CJSWO23ZUa8N9th5JLywIs1
3Ddsvv11TacYms2KbpSpYkSMip9ZTiyl0fImQw09qdaQpzj4k5iXQ7lSqT47
DkRanR7UkACpIWZ67hK8i7irYVqERxOMTCKp1pQHGTmcxA0Hk/GIhNtBNLcj
iGYMLRGyCJRvawk8CvtwrzmiwMiFhnOjHmB9CiGPVZNEMNcrk1RS7Z6Z1o4b
ypNkW2Sv6cxrOeC5DW8mJcQIWyVSLgF8Y0EQ5KX0txJ5JxKKr5VMfOYFweUb
qFbZxptCZItD3TR8l9uBCH7X6hpVbqTcb5H1i6JlC1kAPNLANU1me8aKqxfN
NtqmH7ci2LEr101bSNSNg6gu5e5RNltrEk3X5fM3rH2EdujSdH3jtjDfAt0Y
l94ilwDr03RyiFneiAKNdJFGiVk+iLBQXHWVIAgKDgK4ijIRCMFlxDmdUxBm
Y7h0FiPVasbm+k66GMMDcnb2ojW0Cda6YdSQ9suY8kgY5GUt3q6YM83Xw6cQ
UI5zJnuguR7Tph3osXgGCz/yh/eyQYfTWK2axvWxxXyuML28qm+qkcTVioXX
YZWaugaMuSOmWaw+ecgtkt8KKiutGmXMoth1BSilD7LC4pNjSdqRK8ek2f/g
ATk8wLSvEoCrhnvBM/vB3V+FUgIBffMg6HHDPsz5dEMjuLI3jbLTkxfiAEB1
RvAEjLIjX+Ckv/tbuKZVQGV34Hz7coZsiM2ch2NnB95WFYT3QqylUgDkcXEu
WiiJjOoNvE2kNmZZXdfWqGh3+zM4fBy9JwGD6Y2DuTZ0KRKn5cjFOAaWiRU3
S0pJQnNggMJzX54t1QZje9l13pR5pSF575wZ9fCDzTQsfecRBk5OHuX0USI6
TbWx0kwpslvPpFd3Z5N0AQEGTB0blR4nq9jxHk/OWRHAq8w1ysqpFL/EpkE6
efN2aXas90c9MzdEJqBk2c8f7fDJ7YCkVvWZ7VMuAEiAfsRV2/WcYBFEYwJe
joR3z7olw6oIA8uQOsjtng964sIMxI7CWLQNCOwipECSlKDbDt26kvxxoOCr
GGIkAvXfbUFHssWrleIqnxgshHcrnFYcrxSdP8K8Vg+rp4OU+78kUQm0ohM4
4NFzlL5jmtgP/M03tJCrrUv42/D7SxiDzfBV8tt0e1BCQ1+q2Rvd8RVqwWbL
4tVNxbeHRpDbVPH185xDEBYA2Sp5m+QOpG3oEM7/rq7OtGQZ70NU3xppA/uR
vUMatmCjBzkglgpwYs5K06umnLQgn8VkBXSIFZRqbLhcKqTeU0H6PRIaMACh
PADea9m77NRD9iX7hpqKC2ymx8Gdp7koT5DXqMeyTedlqTh2uzDVDBZ3Ht08
9jOnX+tzxRy0Rz4vCn7TBZ4Lu48DgYzouCjaTTWPCtfuBliXhIrJA7+t6zcM
kkf/xq0dMlipjYLh2Ij4zmMwGVHoa7JdkNIH1MKyZRjpkJKCkgfNEoa+yDee
0rFRLL4vxeoP03hatvAMja/bMfycCyQ2XPC+nZEEfdMqtmri05DVz8WNj4eA
1gomzRkSooBx0yKdNp3bnOMuy7Uqv4FVxVSiLVIbPWAQCDvsy9DCO3GgsNlh
wJqmtgGx/IYRNa/oSbpiGBBro0fmurdhJv09VUlsFGSXXTuWKhpDBHAey85T
VaHt/EqNL7GctFGb3OIapJdIeaSdDaiCgPp4WS8XHMdA3KGuGEAXszznpmza
Il2EBMsCwMgmytLXpqkZBgtjpmgxqcVYdRQ7TtekXYxXNlBW1Hj4pDg+yaUT
8kRApOAFusoAP7W6wrFOrX+piGOdk6dxP55uUCuSjahw21Lxlxafs9LEXRsD
CFUWjuPISNaOu0wf79tMlBaNNiAR0aAL7TW1Jz70Cduq0beirznAKErGtR1R
3iBXTLKRpqqMdMRYem2Azpyct7IgqSHwTLKTBFdqwIXJPhQ2Ea+i6KWYKK69
yoNBRawo7YYEXMdwDQVDaGIvDF2FfOWv5b9rbW2AvICnjg0tK5bkAW1FfiKt
p4eGwpmfQXWxF8D5ZLn7TuG8/EvrLL+uy6ggbEXrwQaZ5lBBja116nQ1ir6x
oMONokZGgJEWnvm0OcwLIR/zIFTIQ6OJnYrjgU722jvNvc8DTRS0h1cYocXT
eD/18sqCt2gQxGbF2by2NbZvV9ZG0QdZy4KNvVVRxk/gohBlTWx1TufeQZT4
RXD6bK+Qb9cJj7Bt2f7UJNE+4UhsIECuCTRQxcU2mjGyrmzZ/Vqj5YtZjnym
nKIRnk+Ai5rTRkGokHTKHUYaRCwnqcOMta5djfZClz3X6xFzz3qMa4WSwo7/
EEsSNR5bDZdZyC4PCDVy11hx1WOy09ZjtyGisJp4Vrd8xItzmNuns7LJ4RsM
G7UHqMjSoqGRghvJSSlg63EzuUTo7epklta25El/vCFf3khkzXDHNwBbmUk+
0JAMd9VWnZJpovEhBONY6wNoaMF0TIZ/7tuGzNaLi6LTOpUtWB+8NeccDLGC
BuDzxWOx1fAggrg3ePvMYPQjUDZrSWfOgump3XZaXkiN4MGu/6ZuyKEQMGwk
XzCCzHd9yHxcioY6tvt9paI3GDiN7vjou6OhFDrNgc+OOYBGlsMFlC/VMdhn
qQ6wqeaDSSoErtI4s5NERktdlKvMbfbunYYnrceIV8OdPURDE5YQKvcfciiL
J98aWL+bSn781F8r3q+w5HYO2ehcf/BAhx+PaSfN33AbkznsTy4eFkhCgRZm
1ZG5opKyrTOgaWVdERBkSuDIr9adNKyg+blkq0/c/wcfFKG7Jw8BAA==

-->

</rfc>

