<?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 RFC9110 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
<!ENTITY RFC9111 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9111.xml">
<!ENTITY RFC9457 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9457.xml">
]>


<rfc ipr="trust200902" docName="draft-evm-session-00" category="info" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="EVM Session">EVM Session Intent for HTTP Payment Authentication</title>

    <author initials="X." surname="Tian" fullname="Xin Tian">
      <organization>OKG</organization>
      <address>
        <email>xin.tian@okg.com</email>
      </address>
    </author>
    <author initials="E." surname="Wang" fullname="Eason Wang">
      <organization>OKG</organization>
      <address>
        <email>wangyuxin@okg.com</email>
      </address>
    </author>
    <author initials="M." surname="Wong" fullname="Michael Wong">
      <organization>OKG</organization>
      <address>
        <email>michael.wong@okg.com</email>
      </address>
    </author>
    <author initials="A." surname="Zhou" fullname="Aaron Zhou">
      <organization>OKG</organization>
      <address>
        <email>guoliang.zhou@okg.com</email>
      </address>
    </author>

    <date year="2026" month="July" day="03"/>

    
    
    

    <abstract>


<?line 122?>

<t>This document defines the "evm" payment method implementation of the
"session" intent for the Payment HTTP Authentication Scheme. It specifies
unidirectional streaming payment channels for incremental, voucher-based
payments on any EVM-compatible blockchain, suitable for metered services
such as LLM inference.</t>



    </abstract>



  </front>

  <middle>


<?line 130?>

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

<t>This document is published as Informational but contains normative
requirements using BCP 14 keywords <xref target="RFC2119"/> <xref target="RFC8174"/> to ensure
interoperability between implementations.</t>

<t>This document defines the "evm" payment method implementation of the
"session" intent registered by <xref target="I-D.payment-intent-session"/>.</t>

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

<t>Unlike the <spanx style="verb">charge</spanx> intent which requires the full payment amount
upfront, the <spanx style="verb">session</spanx> intent allows clients to pay incrementally as
they consume services, paying exactly for resources received.</t>

<t>This specification adapts the streaming payment channel mechanism
defined in <xref target="I-D.tempo-session"/>: on-chain escrow holds deposited
funds; the client signs cumulative EIP-712 vouchers authorizing
increasing payment amounts off-chain; the server settles periodically
or at session close. This document extends the mechanism for any
EVM-compatible chain, with EVM-specific transaction formats, gas
models, and domain separators.</t>

<section anchor="use-case-llm-token-streaming"><name>Use Case: LLM Token Streaming</name>

<t>Consider an LLM inference API that charges per output token:</t>

<t><list style="numbers" type="1">
  <t>Client requests a streaming completion (SSE response)</t>
  <t>Server returns 402 with a <spanx style="verb">session</spanx> challenge</t>
  <t>Client opens a payment channel on-chain, depositing funds</t>
  <t>Server begins streaming response</t>
  <t>As response streams, or over incremental requests, client signs vouchers with increasing amounts</t>
  <t>Server settles periodically or at stream completion</t>
</list></t>

<t>The client pays exactly for tokens received, with no worst-case reservation.</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>Streaming Payment Channel</dt>
  <dd>
    <t>A unidirectional off-chain payment mechanism where the
payer deposits funds into an escrow contract and signs
cumulative vouchers authorizing increasing amounts.</t>
  </dd>
  <dt>Voucher</dt>
  <dd>
    <t>An <xref target="EIP-712"/> signed message authorizing a cumulative
payment amount for a specific channel. Vouchers are
monotonically increasing in amount.</t>
  </dd>
  <dt>Channel</dt>
  <dd>
    <t>A payment relationship between a payer and payee, identified by a
unique <spanx style="verb">channelId</spanx>. The channel holds deposited funds and tracks
cumulative settlements.</t>
  </dd>
  <dt>Settlement</dt>
  <dd>
    <t>The on-chain <xref target="ERC-20"/> transfer that converts off-chain voucher
authorizations into actual token movement.</t>
  </dd>
  <dt>Authorized Signer</dt>
  <dd>
    <t>An address delegated to sign vouchers on behalf of the payer. Defaults
to the payer if not specified.
In this specification, voucher signatures are verified either as
ECDSA secp256k1 signatures (for EOA signers) or via ERC-1271
<spanx style="verb">isValidSignature</spanx> (for smart-contract wallets such as Safe or
ERC-4337 accounts). The <spanx style="verb">authorizedSigner</spanx> field <bcp14>MAY</bcp14> be an EOA
or an ERC-1271-compliant contract wallet.</t>
  </dd>
  <dt>Base Units</dt>
  <dd>
    <t>The smallest indivisible unit of an ERC-20 token, determined by the
token's decimal precision. For example, USDC (6 decimals) uses
1,000,000 base units per 1 USDC.</t>
  </dd>
</dl>

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

<t>The following diagrams illustrate the two open modes.</t>

<t><strong>Client-broadcast open (feePayer: false):</strong></t>

<figure><artwork><![CDATA[
   Client                        Server                     EVM Chain
      |                             |                             |
      |  (1) GET /api/resource      |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (2) 402 Payment Required   |                             |
      |      intent="session"       |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  (3) approve + open()       |                             |
      |-------------------------------------------------------------->|
      |  txHash                     |                             |
      |<--------------------------------------------------------------|
      |                             |                             |
      |  (4) Sign initial voucher   |                             |
      |                             |                             |
      |  (5) Authorization: Payment |                             |
      |      action="open"          |                             |
      |      type="hash"            |                             |
      |      hash=txHash            |                             |
      |-------------------------->  |                             |
      |                             |  (6) verify deposit         |
      |                             |-------------------------->  |
      |                             |                             |
      |  (7) 200 OK + Receipt       |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  ... voucher / close flow (same for both modes) ...       |
]]></artwork></figure>

<t><strong>Server-submitted open (feePayer: true):</strong></t>

<figure><artwork><![CDATA[
   Client                        Server                     EVM Chain
      |                             |                             |
      |  (1) GET /api/resource      |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (2) 402 Payment Required   |                             |
      |      intent="session"       |                             |
      |      feePayer=true          |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  (3) Sign EIP-3009 authz    |                             |
      |      Sign initial voucher   |                             |
      |                             |                             |
      |  (4) Authorization: Payment |                             |
      |      action="open"          |                             |
      |      type="authorization"   |                             |
      |-------------------------->  |                             |
      |                             |  (5) openWithAuthz(...)     |
      |                             |-------------------------->  |
      |                             |                             |
      |  (6) 200 OK + Receipt       |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  ... voucher / close flow (same for both modes) ...       |
]]></artwork></figure>

<t><strong>Voucher and close flow (common to both modes):</strong></t>

<figure><artwork><![CDATA[
   Client                        Server                     EVM Chain
      |                             |                             |
      |  (7) HEAD /api/resource     |                             |
      |      action="voucher"       |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |  (8) 200 OK + Receipt       |                             |
      |<--------------------------  |                             |
      |                             |                             |
      |  (9) GET /api/resource      |                             |
      |      action="close"         |                             |
      |-------------------------->  |                             |
      |                             |  (10) close(voucher)        |
      |                             |-------------------------->  |
      |                             |                             |
      |  (11) 200 OK + Receipt      |                             |
      |       (includes txHash)     |                             |
      |<--------------------------  |                             |
      |                             |                             |
]]></artwork></figure>

<t>Voucher updates and close requests are submitted to the <strong>same resource
URI</strong> that requires payment. Servers <bcp14>SHOULD</bcp14> support voucher updates via
any HTTP method <xref target="RFC9110"/>; clients <bcp14>MAY</bcp14> use <spanx style="verb">HEAD</spanx> for pure voucher
top-ups when no response body is needed.</t>

</section>
<section anchor="concurrency"><name>Concurrency Model</name>

<t>A channel supports one active session at a time. The cumulative voucher
semantics ensure correctness — each voucher advances a single
monotonic counter. The channel is the unit of concurrency;
no additional session locking is required.</t>

<t>When a client sends a new streaming request on a channel that already
has an active session, servers <bcp14>SHOULD</bcp14> terminate the previous session and
start a new one. Voucher updates <bcp14>MAY</bcp14> arrive on separate HTTP connections
(including HTTP/2 streams) and <bcp14>MUST</bcp14> be processed atomically with respect
to balance updates.</t>

<t>Servers <bcp14>MUST</bcp14> ensure that voucher acceptance and balance deduction are
serialized per channel to prevent race conditions.</t>

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

<t>This section defines normative encoding rules for interoperability.</t>

<section anchor="hexadecimal-values"><name>Hexadecimal Values</name>

<t>All byte arrays (addresses, hashes, signatures, channelId) use:</t>

<t><list style="symbols">
  <t>Lowercase hexadecimal encoding</t>
  <t><spanx style="verb">0x</spanx> prefix</t>
  <t>No padding or truncation</t>
</list></t>

<texttable>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Length</ttcol>
      <ttcol align='left'>Example</ttcol>
      <c>address</c>
      <c>42 chars (0x + 40 hex)</c>
      <c><spanx style="verb">0x742d35cc6634c0532925a3b844bc9e7595f8fe00</spanx></c>
      <c>bytes32</c>
      <c>66 chars (0x + 64 hex)</c>
      <c><spanx style="verb">0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f</spanx></c>
      <c>signature (bytes)</c>
      <c>132 chars (0x + 130 hex)</c>
      <c>65-byte ECDSA signature</c>
</texttable>

<t>All signatures in this specification are 65 bytes, encoded as
<spanx style="verb">r (32 bytes) || s (32 bytes) || v (1 byte)</spanx> and passed as a single
<spanx style="verb">bytes</spanx> parameter. Implementations <bcp14>MUST NOT</bcp14> produce EIP-2098 compact
64-byte signatures <xref target="EIP-2098"/>. Implementations <bcp14>MAY</bcp14> accept them
(e.g., when using a standard signature-verification library such as
OpenZeppelin SignatureChecker that transparently handles both
formats), but <bcp14>MUST NOT</bcp14> require clients to produce them.</t>

<t>Implementations <bcp14>MUST</bcp14> use lowercase hex for channelId, signatures, and
hashes. Address fields in the request schema (currency, recipient,
escrowContract) <bcp14>SHOULD</bcp14> use <xref target="EIP-55"/> mixed-case encoding for display but
<bcp14>MUST</bcp14> be compared by decoded 20-byte value, not string form.</t>

</section>
<section anchor="numeric-values"><name>Numeric Values</name>

<t>Integer values (amounts, timestamps) are encoded as decimal strings in
JSON to avoid precision loss with large numbers:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Encoding</ttcol>
      <ttcol align='left'>Example</ttcol>
      <ttcol align='left'>Rationale</ttcol>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>Decimal string</c>
      <c><spanx style="verb">"250000"</spanx></c>
      <c>May exceed Number.MAX_SAFE_INTEGER</c>
      <c><spanx style="verb">validAfter</spanx>, <spanx style="verb">validBefore</spanx></c>
      <c>Decimal string</c>
      <c><spanx style="verb">"1743523500"</spanx></c>
      <c>uint256 on-chain; string for consistency</c>
      <c><spanx style="verb">chainId</spanx></c>
      <c>JSON number</c>
      <c><spanx style="verb">196</spanx></c>
      <c>Small values; no precision risk</c>
</texttable>

<t>The <spanx style="verb">chainId</spanx> uses JSON number encoding because EVM chain IDs are
small enough to avoid precision issues. All other large integers
use decimal strings. In EIP-712 typed data, <spanx style="verb">chainId</spanx> is a
<spanx style="verb">uint256</spanx> — implementations <bcp14>MUST</bcp14> convert the JSON number to
<spanx style="verb">uint256</spanx> when constructing the domain separator.</t>

</section>
<section anchor="timestamp-format"><name>Timestamp Format</name>

<t>HTTP headers and receipt fields use <xref target="RFC3339"/> formatted timestamps.
Timestamps in EIP-712 signed data use Unix seconds as decimal strings.</t>

</section>
</section>
<section anchor="channel-escrow-contract"><name>Channel Escrow Contract</name>

<t>Streaming payment channels require an on-chain escrow contract that
holds user deposits and enforces voucher-based withdrawals.</t>

<t>The escrow's deposit accounting assumes the <spanx style="verb">currency</spanx> token transfers
exactly the requested amount. Implementations <bcp14>MUST</bcp14> restrict the escrow
to well-behaved ERC-20 tokens and <bcp14>MUST NOT</bcp14> use it with fee-on-transfer
or rebasing tokens: those would make <spanx style="verb">channel.deposit</spanx> over-record the
balance actually held, letting a payee settle more than was escrowed.</t>

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

<t>Each channel is identified by a unique <spanx style="verb">channelId</spanx> and stores:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">payer</spanx></c>
      <c>address</c>
      <c>User who deposited funds</c>
      <c><spanx style="verb">payee</spanx></c>
      <c>address</c>
      <c>Server authorized to withdraw</c>
      <c><spanx style="verb">token</spanx></c>
      <c>address</c>
      <c><xref target="ERC-20"/> token address</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>address</c>
      <c>Authorized signer (0 = payer)</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>uint128</c>
      <c>Total amount deposited</c>
      <c><spanx style="verb">settled</spanx></c>
      <c>uint128</c>
      <c>Cumulative amount already withdrawn by payee</c>
      <c><spanx style="verb">closeRequestedAt</spanx></c>
      <c>uint64</c>
      <c>Timestamp when close was requested (0 if not)</c>
      <c><spanx style="verb">finalized</spanx></c>
      <c>bool</c>
      <c>Whether channel is closed. Sticky: set once and never cleared; the record is never deleted (see <xref target="channel-reuse"/>)</c>
</texttable>

<t>The <spanx style="verb">channelId</spanx> <bcp14>MUST</bcp14> be computed deterministically using the escrow
contract's <spanx style="verb">computeChannelId()</spanx> function or equivalent logic:</t>

<figure><artwork><![CDATA[
channelId = keccak256(abi.encode(
    payer,
    payee,
    token,
    salt,
    authorizedSigner,
    address(this),
    block.chainid
))
]]></artwork></figure>

<t>Note: The <spanx style="verb">channelId</spanx> includes <spanx style="verb">address(this)</spanx> (the escrow contract
address) and <spanx style="verb">block.chainid</spanx>, explicitly binding the channel to a
specific contract deployment and chain. This computation is identical
to the Tempo escrow specification. For the relayed open functions
(<spanx style="verb">openWithAuthorization</spanx>, <spanx style="verb">openWithPermit2</spanx>), <spanx style="verb">payer</spanx> in this
computation is the <spanx style="verb">from</spanx> argument (the depositor), not the relayer
that submits the transaction.</t>

</section>
<section anchor="channel-lifecycle"><name>Channel Lifecycle</name>

<t>Channels have no expiry — they remain open until explicitly closed.</t>

<figure><artwork><![CDATA[
+---------------------------------------------------------------+
|                          CHANNEL OPEN                          |
|    Client deposits tokens, channel created with unique ID      |
+---------------------------------------------------------------+
                              |
                              v
+---------------------------------------------------------------+
|                       SESSION PAYMENTS                         |
|      Client signs vouchers, server provides service            |
|      Server may periodically settle() to claim funds           |
+---------------------------------------------------------------+
                              |
              +---------------+---------------+
              v                               v
+-------------------------+   +-------------------------------+
|   COOPERATIVE CLOSE     |   |          FORCED CLOSE         |
|  Server calls close()   |   |  1. Client calls requestClose |
|   with final voucher    |   |  2. Wait grace period         |
|                         |   |  3. Client calls withdraw()   |
+-------------------------+   +-------------------------------+
              |                               |
              +---------------+---------------+
                              v
+---------------------------------------------------------------+
|                        CHANNEL CLOSED                          |
|           Funds distributed, channel finalized                 |
+---------------------------------------------------------------+
]]></artwork></figure>

</section>
<section anchor="contract-functions"><name>Contract Functions</name>

<t>The escrow surface is split into a <strong>mandatory core</strong> that every
compliant contract <bcp14>MUST</bcp14> implement, and an <strong>optional Relayed / Gasless
Operations profile</strong> (<xref target="relayed-profile"/>) that an implementation <bcp14>MAY</bcp14>
omit in whole.</t>

<t>Mandatory core:</t>

<t><list style="symbols">
  <t><spanx style="verb">open</spanx>, <spanx style="verb">settle</spanx>, <spanx style="verb">topUp</spanx>, <spanx style="verb">close</spanx>, <spanx style="verb">requestClose</spanx>, <spanx style="verb">withdraw</spanx></t>
</list></t>

<t>Optional Relayed / Gasless Operations profile (<xref target="relayed-profile"/>):</t>

<t><list style="symbols">
  <t>Payer-funded via EIP-3009, relayer-submitted:
<spanx style="verb">openWithAuthorization</spanx>, <spanx style="verb">topUpWithAuthorization</spanx></t>
  <t>Payer-funded via Permit2, relayer-submitted: <spanx style="verb">openWithPermit2</spanx>,
<spanx style="verb">topUpWithPermit2</spanx></t>
  <t>Payee-initiated via EIP-712 payee authorization, relayer-submitted:
<spanx style="verb">settleWithAuthorization</spanx>, <spanx style="verb">closeWithAuthorization</spanx></t>
</list></t>

<t>The two payer-funded paths are alternatives, not both required: EIP-3009
suits tokens that ship <spanx style="verb">receiveWithAuthorization</spanx> (e.g. USDC), while
Permit2 covers any ERC-20 the payer has approved to the Permit2
contract. An implementation <bcp14>MAY</bcp14> offer either or both.</t>

<t>All six relayed functions share one shape: an off-chain authorization
(EIP-3009 or Permit2 from the payer, or an EIP-712 payee authorization
from the seller) plus submission by any relayer that pays gas. An
implementation <bcp14>MAY</bcp14> support any subset, but a server <bcp14>MUST NOT</bcp14> advertise a
capability (<spanx style="verb">feePayer: true</spanx>, or relayed settle/close) whose underlying
function its escrow does not implement. Each function below that belongs
to the profile is tagged accordingly; all others are mandatory.</t>

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

<t>Opens a new channel with escrowed funds. The caller becomes the payer.
Requires prior <spanx style="verb">approve(escrow, deposit)</spanx> on the ERC-20 token; the
contract pulls funds via <spanx style="verb">transferFrom</spanx>. The contract <bcp14>MUST</bcp14> revert if
a channel with the computed <spanx style="verb">channelId</spanx> already exists.</t>

<t>Channel records <bcp14>MUST</bcp14> be retained permanently: the <spanx style="verb">finalized</spanx> flag is
sticky (set once at close/withdraw and never cleared) and the channel
record <bcp14>MUST NOT</bcp14> be deleted. Because <spanx style="verb">channelId</spanx> is derived only from
stable inputs (<spanx style="verb">payer, payee, token, salt, authorizedSigner</spanx>,
contract, chain) with no epoch component, deleting a finalized record
would let the same inputs re-derive an identical <spanx style="verb">channelId</spanx> and EIP-712
voucher digest, replaying old-epoch vouchers against a freshly funded
channel. Retaining the record makes the "already exists" check above
reject any re-open. See <xref target="channel-reuse"/>.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">payee</spanx></c>
      <c>address</c>
      <c>Server's address authorized to withdraw</c>
      <c><spanx style="verb">token</spanx></c>
      <c>address</c>
      <c>ERC-20 token contract address</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>uint128</c>
      <c>Amount to deposit in base units</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>bytes32</c>
      <c>Random value for channelId computation</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>address</c>
      <c>Delegated signer; <spanx style="verb">address(0)</spanx> = payer</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function open(
    address payee,
    address token,
    uint128 deposit,
    bytes32 salt,
    address authorizedSigner
) external returns (bytes32 channelId);
]]></sourcecode></figure>

</section>
<section anchor="openwithauthorization"><name>openWithAuthorization</name>

<t><em>Part of the optional Relayed / Gasless Operations profile
(<xref target="relayed-profile"/>).</em></t>

<t>Opens a channel using EIP-3009 <xref target="EIP-3009"/> authorization. The server
(or any relayer) submits the transaction, pulling funds from the payer
via <spanx style="verb">receiveWithAuthorization</spanx> inside the contract.</t>

<ul empty="true"><li>
  <t><strong>Note:</strong> The escrow contract <bcp14>MUST</bcp14> use <spanx style="verb">receiveWithAuthorization</spanx>
(not <spanx style="verb">transferWithAuthorization</spanx>) to pull funds from the token.
<spanx style="verb">receiveWithAuthorization</spanx> enforces <spanx style="verb">msg.sender == to</spanx>, preventing
front-running attacks where an attacker extracts the EIP-3009
signature from the mempool and calls the token directly (see
<xref target="front-running-protection"/>). This specification targets tokens
that support the USDC v2.2 <spanx style="verb">bytes signature</spanx> overload of
<spanx style="verb">receiveWithAuthorization</spanx> and calls it directly with the packed
65-byte signature. Tokens that only expose the canonical
<spanx style="verb">(uint8 v, bytes32 r, bytes32 s)</spanx> interface are NOT supported by
this escrow design.</t>
</li></ul>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">payee</spanx></c>
      <c>address</c>
      <c>Server's address</c>
      <c><spanx style="verb">token</spanx></c>
      <c>address</c>
      <c>ERC-20 token contract</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>uint128</c>
      <c>Amount to deposit</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>bytes32</c>
      <c>Random value</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>address</c>
      <c>Delegated signer; <spanx style="verb">address(0)</spanx> = payer</c>
      <c><spanx style="verb">from</spanx></c>
      <c>address</c>
      <c>Payer address (EIP-3009 <spanx style="verb">from</spanx>)</c>
      <c><spanx style="verb">validAfter</spanx></c>
      <c>uint256</c>
      <c>EIP-3009 validity start</c>
      <c><spanx style="verb">validBefore</spanx></c>
      <c>uint256</c>
      <c>EIP-3009 validity end</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>bytes32</c>
      <c>EIP-3009 nonce; <bcp14>MUST</bcp14> equal the value derived per <xref target="front-running-protection"/></c>
      <c><spanx style="verb">signature</spanx></c>
      <c>bytes</c>
      <c>Packed EIP-3009 authorization signature (65 bytes)</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function openWithAuthorization(
    address payee,
    address token,
    uint128 deposit,
    bytes32 salt,
    address authorizedSigner,
    address from,
    uint256 validAfter,
    uint256 validBefore,
    bytes32 nonce,
    bytes calldata signature
) external returns (bytes32 channelId);
]]></sourcecode></figure>

<t>The <spanx style="verb">nonce</spanx> parameter is supplied by the caller for transparency,
but the contract <bcp14>MUST</bcp14> recompute the expected nonce as
<spanx style="verb">keccak256(abi.encode(from, payee, token, salt, authorizedSigner))</spanx>
and revert if the supplied value does not match. Compliant
implementations <bcp14>SHOULD</bcp14> revert with a dedicated error such as
<spanx style="verb">NonceMismatch()</spanx> so callers can distinguish this failure mode.
See <xref target="front-running-protection"/> for the threat model.</t>

</section>
<section anchor="openwithpermit2"><name>openWithPermit2</name>

<t><em>Part of the optional Relayed / Gasless Operations profile
(<xref target="relayed-profile"/>).</em></t>

<t>Opens a channel using <xref target="Permit2"/> <spanx style="verb">SignatureTransfer</spanx> with a witness.
The server (or any relayer) submits the transaction, pulling funds
from the payer via the canonical Permit2 contract. This path supports
any ERC-20 token that the payer has previously approved for the
Permit2 contract (typically a one-time, unlimited approval).</t>

<ul empty="true"><li>
  <t><strong>Note:</strong> The escrow contract <bcp14>MUST</bcp14> use <spanx style="verb">permitWitnessTransferFrom</spanx>
(not <spanx style="verb">permitTransferFrom</spanx>) to bind the channel intent (<spanx style="verb">payee</spanx>,
<spanx style="verb">salt</spanx>, <spanx style="verb">authorizedSigner</spanx>) into the EIP-712 signature as a named
witness struct. This serves two purposes: (1) wallets that render
EIP-712 typed data display the channel parameters as labeled fields
at signing time, instead of leaving them to be hashed opaquely into
the nonce; (2) the contract enforces channel-parameter integrity
via the Permit2 signature itself, so an attacker cannot front-run
with a different <spanx style="verb">payee</spanx>. The Permit2 <spanx style="verb">spender</spanx> is fixed to
<spanx style="verb">msg.sender</spanx> by the contract, so only the escrow can spend the
signature.</t>
</li></ul>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">payee</spanx></c>
      <c>address</c>
      <c>Server's address</c>
      <c><spanx style="verb">token</spanx></c>
      <c>address</c>
      <c>ERC-20 token contract</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>uint128</c>
      <c>Amount to deposit</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>bytes32</c>
      <c>Random value</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>address</c>
      <c>Delegated signer; <spanx style="verb">address(0)</spanx> = payer</c>
      <c><spanx style="verb">from</spanx></c>
      <c>address</c>
      <c>Payer address (Permit2 <spanx style="verb">owner</spanx>)</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>uint256</c>
      <c>Permit2 nonce (any unused value; bitmap-based replay protection)</c>
      <c><spanx style="verb">deadline</spanx></c>
      <c>uint256</c>
      <c>Permit2 signature deadline (Unix seconds)</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>bytes</c>
      <c>Permit2 EIP-712 signature (65 bytes)</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function openWithPermit2(
    address payee,
    address token,
    uint128 deposit,
    bytes32 salt,
    address authorizedSigner,
    address from,
    uint256 nonce,
    uint256 deadline,
    bytes calldata signature
) external returns (bytes32 channelId);
]]></sourcecode></figure>

<t>The escrow contract <bcp14>MUST</bcp14> construct the Permit2 <spanx style="verb">PermitTransferFrom</spanx>
struct, <spanx style="verb">SignatureTransferDetails</spanx>, and the <spanx style="verb">ChannelOpenWitness</spanx>
witness struct from these parameters with <spanx style="verb">permitted.token = token</spanx>,
<spanx style="verb">permitted.amount = deposit</spanx>, <spanx style="verb">transferDetails.to = address(this)</spanx>,
<spanx style="verb">transferDetails.requestedAmount = deposit</spanx>, and witness fields
<spanx style="verb">(payee, salt, authorizedSigner)</spanx>. It then computes
<spanx style="verb">witnessHash = keccak256(abi.encode(CHANNEL_OPEN_WITNESS_TYPEHASH, payee, salt, authorizedSigner))</spanx>
and calls
<spanx style="verb">IPermit2(PERMIT2).permitWitnessTransferFrom(permit, transferDetails, from, witnessHash, WITNESS_TYPE_STRING, signature)</spanx>
on the canonical Permit2 deployment. If the payer signed a different
<spanx style="verb">payee</spanx>, <spanx style="verb">salt</spanx>, or <spanx style="verb">authorizedSigner</spanx> than the function arguments,
the Permit2 signature verification reverts.</t>

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

<t>Server withdraws funds using a signed voucher without closing the
channel. The contract <bcp14>MUST</bcp14> revert if <spanx style="verb">msg.sender != channel.payee</spanx>.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Unique channel identifier</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>uint128</c>
      <c>Cumulative total authorized</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>bytes</c>
      <c>EIP-712 signature from authorized signer</c>
</texttable>

<t>The contract <bcp14>MUST</bcp14> revert (e.g., with <spanx style="verb">AmountNotIncreasing()</spanx>) if
<spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx>, and (e.g., with
<spanx style="verb">AmountExceedsDeposit()</spanx>) if <spanx style="verb">cumulativeAmount &gt; channel.deposit</spanx>; only
a strictly increasing cumulative amount within the deposited balance
advances settlement. Otherwise the contract computes
<spanx style="verb">delta = cumulativeAmount - channel.settled</spanx>, sets
<spanx style="verb">channel.settled = cumulativeAmount</spanx>, and transfers <spanx style="verb">delta</spanx> to the
payee. This on-chain check is the last line of defense for the
rollback prevention described in <xref target="rollback-prevention"/>; a server-side
check alone does not constrain a payee calling the contract directly.</t>

<figure><sourcecode type="solidity"><![CDATA[
function settle(
    bytes32 channelId,
    uint128 cumulativeAmount,
    bytes calldata signature
) external;
]]></sourcecode></figure>

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

<t>User adds more funds to an existing channel. Requires prior
<spanx style="verb">approve(escrow, additionalDeposit)</spanx>. The contract <bcp14>MUST</bcp14> revert if
<spanx style="verb">msg.sender != channel.payer</spanx>. If a close request is pending
(<spanx style="verb">channel.closeRequestedAt != 0</spanx>), calling <spanx style="verb">topUp()</spanx> <bcp14>MUST</bcp14> reset
<spanx style="verb">closeRequestedAt</spanx> to <spanx style="verb">0</spanx>, cancelling the pending close.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Existing channel identifier</c>
      <c><spanx style="verb">additionalDeposit</spanx></c>
      <c>uint128</c>
      <c>Additional amount in base units</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function topUp(
    bytes32 channelId,
    uint128 additionalDeposit
) external;
]]></sourcecode></figure>

</section>
<section anchor="topupwithauthorization"><name>topUpWithAuthorization</name>

<t><em>Part of the optional Relayed / Gasless Operations profile
(<xref target="relayed-profile"/>).</em></t>

<t>Adds funds using EIP-3009 authorization. The server calls this on
behalf of the payer.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Existing channel identifier</c>
      <c><spanx style="verb">additionalDeposit</spanx></c>
      <c>uint128</c>
      <c>Additional amount</c>
      <c><spanx style="verb">from</spanx></c>
      <c>address</c>
      <c>Payer address</c>
      <c><spanx style="verb">topUpSalt</spanx></c>
      <c>bytes32</c>
      <c>Random value for nonce derivation</c>
      <c><spanx style="verb">validAfter</spanx></c>
      <c>uint256</c>
      <c>EIP-3009 validity start</c>
      <c><spanx style="verb">validBefore</spanx></c>
      <c>uint256</c>
      <c>EIP-3009 validity end</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>bytes32</c>
      <c>EIP-3009 nonce; <bcp14>MUST</bcp14> equal the value derived per <xref target="front-running-protection"/></c>
      <c><spanx style="verb">signature</spanx></c>
      <c>bytes</c>
      <c>Packed EIP-3009 authorization signature (65 bytes)</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function topUpWithAuthorization(
    bytes32 channelId,
    uint128 additionalDeposit,
    address from,
    bytes32 topUpSalt,
    uint256 validAfter,
    uint256 validBefore,
    bytes32 nonce,
    bytes calldata signature
) external;
]]></sourcecode></figure>

<t>As with <spanx style="verb">openWithAuthorization</spanx>, the contract <bcp14>MUST</bcp14> recompute the
expected nonce as
<spanx style="verb">keccak256(abi.encode(channelId, additionalDeposit, from, topUpSalt))</spanx>
and revert (e.g., with <spanx style="verb">NonceMismatch()</spanx>) if the supplied <spanx style="verb">nonce</spanx>
does not match. Clients <bcp14>MUST</bcp14> use the same derivation when signing.</t>

</section>
<section anchor="topupwithpermit2"><name>topUpWithPermit2</name>

<t><em>Part of the optional Relayed / Gasless Operations profile
(<xref target="relayed-profile"/>).</em></t>

<t>Adds funds using <xref target="Permit2"/> <spanx style="verb">SignatureTransfer</spanx> with a witness.
Mirrors <spanx style="verb">openWithPermit2</spanx> for an existing channel. The escrow <bcp14>MUST</bcp14>
call <spanx style="verb">permitWitnessTransferFrom</spanx> with a <spanx style="verb">ChannelTopUpWitness</spanx>
binding <spanx style="verb">channelId</spanx>, so the payer's wallet shows the target channel
and the contract enforces that the signature cannot be redirected to
a different channel. Unlike the EIP-3009 path, no <spanx style="verb">topUpSalt</spanx> is
required: Permit2's unordered nonce already provides replay
protection for repeated top-ups, and <spanx style="verb">channelId</spanx> alone binds the
deposit to the channel. Because this function takes no <spanx style="verb">token</spanx>
argument, the escrow sets <spanx style="verb">permitted.token = channel.token</spanx> from the
existing channel record when reconstructing the Permit2 permit.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Existing channel identifier</c>
      <c><spanx style="verb">additionalDeposit</spanx></c>
      <c>uint128</c>
      <c>Additional amount</c>
      <c><spanx style="verb">from</spanx></c>
      <c>address</c>
      <c>Payer address</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>uint256</c>
      <c>Permit2 nonce (any unused value; bitmap-based replay protection)</c>
      <c><spanx style="verb">deadline</spanx></c>
      <c>uint256</c>
      <c>Permit2 signature deadline (Unix seconds)</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>bytes</c>
      <c>Permit2 EIP-712 signature (65 bytes)</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function topUpWithPermit2(
    bytes32 channelId,
    uint128 additionalDeposit,
    address from,
    uint256 nonce,
    uint256 deadline,
    bytes calldata signature
) external;
]]></sourcecode></figure>

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

<t>Server closes the channel, settling outstanding voucher and refunding
remainder to payer. The contract <bcp14>MUST</bcp14> revert if
<spanx style="verb">msg.sender != channel.payee</spanx>.</t>

<t>If <spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx>, the payee is forfeiting
any uncollected amount (e.g., to cleanly close an exhausted or
abandoned channel). In this case the contract <bcp14>MAY</bcp14> skip voucher
signature verification and <spanx style="verb">signature</spanx> <bcp14>MAY</bcp14> be empty.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Channel to close</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>uint128</c>
      <c>Final cumulative amount</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>bytes</c>
      <c>EIP-712 voucher signature; <bcp14>MAY</bcp14> be empty when <spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx> (forfeit path)</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function close(
    bytes32 channelId,
    uint128 cumulativeAmount,
    bytes calldata signature
) external;
]]></sourcecode></figure>

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

<t>User requests channel closure, starting a grace period. The contract
<bcp14>MUST</bcp14> revert if <spanx style="verb">msg.sender != channel.payer</spanx>, if no channel exists for
<spanx style="verb">channelId</spanx>, or if the channel is already finalized.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Channel to request closure</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function requestClose(bytes32 channelId) external;
]]></sourcecode></figure>

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

<t>User withdraws the unsettled remainder after the forced-close grace
period expires. The contract <bcp14>MUST</bcp14> revert if
<spanx style="verb">msg.sender != channel.payer</spanx>, if the channel is already finalized, if
no close has been requested (<spanx style="verb">channel.closeRequestedAt == 0</spanx>), or if the
grace period has not elapsed
(<spanx style="verb">block.timestamp &lt; channel.closeRequestedAt + CLOSE_GRACE_PERIOD</spanx>). On
success it transfers <spanx style="verb">channel.deposit - channel.settled</spanx> to the payer
and sets <spanx style="verb">finalized</spanx> atomically with the payout.</t>

<t>The <spanx style="verb">closeRequestedAt == 0</spanx> check is essential: without it,
<spanx style="verb">block.timestamp &gt;= 0 + CLOSE_GRACE_PERIOD</spanx> is trivially true, so a
payer could call <spanx style="verb">withdraw</spanx> without ever calling <spanx style="verb">requestClose</spanx>,
draining the channel before the payee settles outstanding vouchers and
bypassing the grace period entirely. The <spanx style="verb">finalized</spanx> check prevents a
second payout (a cooperative <spanx style="verb">close</spanx> followed by <spanx style="verb">requestClose</spanx> +
<spanx style="verb">withdraw</spanx>) from drawing on the contract's pooled balance.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Channel to withdraw from</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function withdraw(bytes32 channelId) external;
]]></sourcecode></figure>

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

<texttable>
      <ttcol align='left'>Function</ttcol>
      <ttcol align='left'>Caller</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">open</spanx></c>
      <c>Anyone</c>
      <c>Creates channel; caller becomes payer</c>
      <c><spanx style="verb">openWithAuthorization</spanx></c>
      <c>Anyone (typically server)</c>
      <c>Creates channel via EIP-3009; <spanx style="verb">from</spanx> becomes payer</c>
      <c><spanx style="verb">openWithPermit2</spanx></c>
      <c>Anyone (typically server)</c>
      <c>Creates channel via Permit2 SignatureTransfer; <spanx style="verb">from</spanx> becomes payer</c>
      <c><spanx style="verb">settle</spanx></c>
      <c>Payee only</c>
      <c>Withdraws funds using voucher</c>
      <c><spanx style="verb">topUp</spanx></c>
      <c>Payer only</c>
      <c>Adds funds (approve + pull)</c>
      <c><spanx style="verb">topUpWithAuthorization</spanx></c>
      <c>Anyone (typically server)</c>
      <c>Adds funds via EIP-3009; no caller restriction because the EIP-3009 signature provides authorization</c>
      <c><spanx style="verb">topUpWithPermit2</spanx></c>
      <c>Anyone (typically server)</c>
      <c>Adds funds via Permit2; no caller restriction because the Permit2 signature provides authorization</c>
      <c><spanx style="verb">close</spanx></c>
      <c>Payee only</c>
      <c>Closes with final voucher</c>
      <c><spanx style="verb">settleWithAuthorization</spanx></c>
      <c>Anyone (typically relayer)</c>
      <c>Settles via payee EIP-712 authorization; payee signature, not <spanx style="verb">msg.sender</spanx>, authorizes</c>
      <c><spanx style="verb">closeWithAuthorization</spanx></c>
      <c>Anyone (typically relayer)</c>
      <c>Closes via payee EIP-712 authorization; payee signature, not <spanx style="verb">msg.sender</spanx>, authorizes</c>
      <c><spanx style="verb">requestClose</spanx></c>
      <c>Payer only</c>
      <c>Initiates forced close</c>
      <c><spanx style="verb">withdraw</spanx></c>
      <c>Payer only</c>
      <c>Withdraws after grace period</c>
</texttable>

</section>
<section anchor="signature-verification"><name>Signature Verification</name>

<t>The escrow contract <bcp14>MUST</bcp14> perform the following verification for all
functions that accept voucher signatures (<spanx style="verb">settle</spanx>, <spanx style="verb">close</spanx>):</t>

<t><list style="numbers" type="1">
  <t><strong>Canonical signatures</strong>: The contract <bcp14>MUST</bcp14> reject ECDSA signatures
with non-canonical (high-s) values. Signatures <bcp14>MUST</bcp14> have
<spanx style="verb">s &lt;= secp256k1_order / 2</spanx> where the half-order is
<spanx style="verb">0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0</spanx>.
See <xref target="signature-malleability"/> for rationale.</t>
  <t><strong>Authorized signer verification</strong>: The contract <bcp14>MUST</bcp14> recover the
signer address from the EIP-712 signature and verify it matches:
  <list style="symbols">
      <t><spanx style="verb">channel.authorizedSigner</spanx> if non-zero</t>
      <t>Otherwise <spanx style="verb">channel.payer</spanx>
The signer may be an EOA (verified via ECDSA) or an ERC-1271
contract wallet (verified via <spanx style="verb">isValidSignature</spanx>).</t>
    </list></t>
  <t><strong>Domain binding</strong>: The contract <bcp14>MUST</bcp14> use its own address as
<spanx style="verb">verifyingContract</spanx> in the EIP-712 domain separator, ensuring
vouchers cannot be replayed across different escrow deployments.</t>
</list></t>

<t>Failure to enforce these requirements on-chain would allow attackers to
bypass server-side validation by submitting transactions directly to
the contract.</t>

</section>
<section anchor="contract-errors"><name>Contract Errors</name>

<t>This subsection is informative. The normative requirement is that the
escrow reverts under each condition below, as stated in the relevant
function and security sections; the error names are a <bcp14>RECOMMENDED</bcp14> common
vocabulary for implementers, tooling, and diagnostics. Implementations
<bcp14>MAY</bcp14> use different names or revert representations. On-the-wire, a
reverted transaction is reported to clients as the
<spanx style="verb">transaction-reverted</spanx> problem type (<xref target="error-responses"/>), not as a raw
Solidity selector.</t>

<texttable>
      <ttcol align='left'>Suggested error</ttcol>
      <ttcol align='left'>Revert condition</ttcol>
      <ttcol align='left'>Functions</ttcol>
      <c><spanx style="verb">ChannelAlreadyExists</spanx></c>
      <c>A channel with the computed <spanx style="verb">channelId</spanx> already exists, including a finalized one (<xref target="channel-reuse"/>)</c>
      <c><spanx style="verb">open</spanx>, <spanx style="verb">openWithAuthorization</spanx>, <spanx style="verb">openWithPermit2</spanx></c>
      <c><spanx style="verb">ChannelNotFound</spanx></c>
      <c>No channel for the given <spanx style="verb">channelId</spanx></c>
      <c><spanx style="verb">settle</spanx>, <spanx style="verb">topUp*</spanx>, <spanx style="verb">close*</spanx>, <spanx style="verb">requestClose</spanx>, <spanx style="verb">withdraw</spanx></c>
      <c><spanx style="verb">ChannelFinalized</spanx></c>
      <c>Channel is already finalized</c>
      <c><spanx style="verb">settle</spanx>, <spanx style="verb">topUp*</spanx>, <spanx style="verb">close*</spanx>, <spanx style="verb">requestClose</spanx>, <spanx style="verb">withdraw</spanx></c>
      <c><spanx style="verb">NotPayee</spanx></c>
      <c><spanx style="verb">msg.sender != channel.payee</spanx></c>
      <c><spanx style="verb">settle</spanx>, <spanx style="verb">close</spanx></c>
      <c><spanx style="verb">NotPayer</spanx></c>
      <c><spanx style="verb">msg.sender != channel.payer</spanx></c>
      <c><spanx style="verb">topUp</spanx>, <spanx style="verb">requestClose</spanx>, <spanx style="verb">withdraw</spanx></c>
      <c><spanx style="verb">AmountNotIncreasing</spanx></c>
      <c><spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx> on a non-forfeit path (<xref target="rollback-prevention"/>)</c>
      <c><spanx style="verb">settle*</spanx>, <spanx style="verb">close*</spanx></c>
      <c><spanx style="verb">AmountExceedsDeposit</spanx></c>
      <c><spanx style="verb">cumulativeAmount &gt; channel.deposit</spanx></c>
      <c><spanx style="verb">settle*</spanx>, <spanx style="verb">close*</spanx></c>
      <c><spanx style="verb">InvalidSignature</spanx></c>
      <c>Voucher or payee signature fails recovery, signer mismatch, or non-canonical high-s (<xref target="signature-verification"/>)</c>
      <c><spanx style="verb">settle*</spanx>, <spanx style="verb">close*</spanx></c>
      <c><spanx style="verb">NonceMismatch</spanx></c>
      <c>Supplied EIP-3009 <spanx style="verb">nonce</spanx> ≠ value derived from channel parameters (<xref target="front-running-protection"/>)</c>
      <c><spanx style="verb">openWithAuthorization</spanx>, <spanx style="verb">topUpWithAuthorization</spanx></c>
      <c><spanx style="verb">NonceAlreadyUsed</spanx></c>
      <c><spanx style="verb">(channel.payee, channelId, nonce)</spanx> already consumed (<xref target="payee-relayed"/>)</c>
      <c><spanx style="verb">settleWithAuthorization</spanx>, <spanx style="verb">closeWithAuthorization</spanx></c>
      <c><spanx style="verb">AuthorizationExpired</spanx></c>
      <c><spanx style="verb">block.timestamp &gt; deadline</spanx> on a payee authorization (<xref target="payee-relayed"/>)</c>
      <c><spanx style="verb">settleWithAuthorization</spanx>, <spanx style="verb">closeWithAuthorization</spanx></c>
      <c><spanx style="verb">CloseNotReady</spanx></c>
      <c><spanx style="verb">withdraw</spanx> called with no pending close (<spanx style="verb">closeRequestedAt == 0</spanx>) or before the close grace period elapsed</c>
      <c><spanx style="verb">withdraw</spanx></c>
      <c><spanx style="verb">ZeroDeposit</spanx></c>
      <c>Deposit amount is <spanx style="verb">0</spanx></c>
      <c><spanx style="verb">open*</spanx>, <spanx style="verb">topUp*</spanx></c>
      <c><spanx style="verb">DepositOverflow</spanx></c>
      <c>Deposit would exceed the <spanx style="verb">uint128</spanx> bound</c>
      <c><spanx style="verb">open*</spanx>, <spanx style="verb">topUp*</spanx></c>
</texttable>

<t>In the table, a trailing <spanx style="verb">*</spanx> denotes the base function plus its
<spanx style="verb">WithAuthorization</spanx> and <spanx style="verb">WithPermit2</spanx> variants where they exist.</t>

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

<t>The <spanx style="verb">request</spanx> parameter in the <spanx style="verb">WWW-Authenticate</spanx> challenge contains a
JSON <xref target="RFC8259"/> object, serialized using JCS <xref target="RFC8785"/> and then
base64url-encoded <xref target="RFC4648"/>.</t>

<section anchor="fields"><name>Fields</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">amount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Price per unit of service in base units (not total charge)</c>
      <c><spanx style="verb">unitType</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Unit being priced (e.g., <spanx style="verb">"llm_token"</spanx>, <spanx style="verb">"byte"</spanx>, <spanx style="verb">"request"</spanx>)</c>
      <c><spanx style="verb">suggestedDeposit</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Suggested channel deposit amount in base units</c>
      <c><spanx style="verb">currency</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>ERC-20 token contract address (EIP-55 checksummed)</c>
      <c><spanx style="verb">recipient</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Payee address (server's withdrawal address)</c>
      <c><spanx style="verb">description</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Human-readable payment description</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Merchant's reference (order ID, invoice number, etc.)</c>
</texttable>

<t>For the <spanx style="verb">session</spanx> intent, <spanx style="verb">amount</spanx> specifies the price per unit of
service in base units, not a total charge. The total cost depends on
consumption: <spanx style="verb">total = amount * units_consumed</spanx>.</t>

</section>
<section anchor="method-details"><name>Method Details</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">methodDetails.chainId</spanx></c>
      <c>number</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>EVM chain ID</c>
      <c><spanx style="verb">methodDetails.escrowContract</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Address of the channel escrow contract</c>
      <c><spanx style="verb">methodDetails.channelId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Channel ID if resuming an existing channel</c>
      <c><spanx style="verb">methodDetails.minVoucherDelta</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Minimum amount increase between vouchers (base units). Default: <spanx style="verb">"0"</spanx> (any positive increment accepted). See <xref target="dos-mitigation"/></c>
      <c><spanx style="verb">methodDetails.feePayer</spanx></c>
      <c>boolean</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>If <spanx style="verb">true</spanx>, server pays gas for open/topUp (default: <spanx style="verb">false</spanx>)</c>
      <c><spanx style="verb">methodDetails.credentialTypes</spanx></c>
      <c>array</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Credential formats the server accepts, as an ordered list of top-level <spanx style="verb">payload.type</spanx> values. EVM session uses the shared EVM values <spanx style="verb">"permit2"</spanx>, <spanx style="verb">"authorization"</spanx>, and <spanx style="verb">"hash"</spanx>; it omits the charge-only full signed transaction path. Order expresses server preference</c>
      <c><spanx style="verb">methodDetails.permit2Contract</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Permit2 contract address used as the EIP-712 <spanx style="verb">verifyingContract</spanx> on the <spanx style="verb">permit2</spanx> authorization path. Defaults to the canonical deterministic Permit2 deployment; <bcp14>REQUIRED</bcp14> when the target chain's Permit2 is not at the canonical address. The client <bcp14>MUST</bcp14> use this value (or the canonical default when omitted) as <spanx style="verb">verifyingContract</spanx> when signing, and it <bcp14>MUST</bcp14> match the escrow's configured Permit2 address</c>
</texttable>

<t>Servers <bcp14>MAY</bcp14> advertise <spanx style="verb">credentialTypes</spanx> listing every credential format
they accept for this challenge. The list uses the same ordered
preference semantics as the EVM charge intent: clients select the first
listed type they can produce unless local policy chooses otherwise, and
<bcp14>MUST NOT</bcp14> submit a format absent from the list. If <spanx style="verb">credentialTypes</spanx> is omitted, it defaults to <spanx style="verb">["hash"]</spanx>.</t>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, servers that want clients to use a
server-submitted open/topUp format <bcp14>MUST</bcp14> include at least one such type
backed by the escrow (<spanx style="verb">openWithAuthorization</spanx> deployed ⇒ include
<spanx style="verb">"authorization"</spanx>; <spanx style="verb">openWithPermit2</spanx> deployed ⇒ include <spanx style="verb">"permit2"</spanx>).
They <bcp14>MAY</bcp14> also include <spanx style="verb">"hash"</spanx> as a client-broadcast fallback. This
makes the supported paths discoverable in-band rather than relying on
out-of-band documentation. A contract <bcp14>MAY</bcp14> additionally expose its
relayed-path support on-chain (e.g. via an introspection view) for
clients that verify the escrow directly, but the challenge field is the
authoritative signal for the session flow.</t>

<t>Channel reuse is <bcp14>OPTIONAL</bcp14>. Servers <bcp14>MAY</bcp14> include <spanx style="verb">channelId</spanx> to suggest
resuming an existing channel:</t>

<t><list style="symbols">
  <t><strong>New channel</strong> (no <spanx style="verb">channelId</spanx>): Client generates a random salt,
computes <spanx style="verb">channelId</spanx> using the formula in <xref target="channel-state"/>, opens
the channel on-chain, and returns the <spanx style="verb">channelId</spanx> in the credential.</t>
  <t><strong>Existing channel</strong> (<spanx style="verb">channelId</spanx> provided): Client <bcp14>MUST</bcp14> verify
<spanx style="verb">channel.deposit - channel.settled &gt;= amount</spanx> before resuming.</t>
</list></t>

<t><strong>Example (new channel):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "100",
  "unitType": "llm_token",
  "suggestedDeposit": "5000000",
  "currency": "0x74b7F16337b8972027F6196A17a631ac6dE26d22",
  "recipient": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
  "methodDetails": {
    "escrowContract": "0x1234567890abcdef1234567890abcdef12345678",
    "chainId": 196,
    "minVoucherDelta": "10000"
  }
}
]]></sourcecode></figure>

<t>This requests a price of 0.0001 USDC per LLM token on X Layer, with
a suggested deposit of 5.00 USDC (approximately 50,000 tokens). The
minVoucherDelta of 10,000 base units (0.01 USDC) means vouchers cover
at least 100 tokens each.</t>

<t><strong>Example (existing channel):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "25",
  "unitType": "llm_token",
  "currency": "0xA8CE8aee21bC2A48a5EF670afCc9274C7bbbC035",
  "recipient": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
  "methodDetails": {
    "escrowContract": "0x1234567890abcdef1234567890abcdef12345678",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "chainId": 196
  }
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="fee-payment"><name>Fee Payment</name>

<t>The <spanx style="verb">feePayer</spanx> field affects only the client-originated channel funding
transactions (<spanx style="verb">open</spanx> and <spanx style="verb">topUp</spanx>). Settlement and close are always
server-initiated and server-funded.</t>

<section anchor="server-paid-fees-feepayer-true"><name>Server-Paid Fees (feePayer: true)</name>

<t>When <spanx style="verb">feePayer: true</spanx>, the client submits a token-pull authorization
signature instead of broadcasting an on-chain transaction. The server
submits the on-chain transaction and pays gas from its own balance.</t>

<t>This specification supports two authorization formats, distinguished
by the credential's top-level <spanx style="verb">payload.type</spanx>:</t>

<t><list style="symbols">
  <t><strong>EIP-3009</strong> (<xref target="EIP-3009"/>, <spanx style="verb">type="authorization"</spanx>): the token itself
implements <spanx style="verb">receiveWithAuthorization</spanx>. Suitable for stablecoins
such as USDC and EURC that ship EIP-3009. No prior approval
is required from the payer.</t>
  <t><strong>Permit2</strong> (<xref target="Permit2"/>, <spanx style="verb">type="permit2"</spanx>): the canonical Permit2
contract (deployed at the same deterministic address on most major
EVM chains) brokers the transfer via <spanx style="verb">permitWitnessTransferFrom</spanx>,
with the channel parameters carried as a named EIP-712 witness so
they appear as labeled fields in the payer's wallet at signing
time. Suitable for any ERC-20 token, including tokens without
native EIP-3009 support. The payer <bcp14>MUST</bcp14> have previously approved
the Permit2 contract for the token (typically a one-time, unlimited
approval).</t>
</list></t>

<t>Selection rules:</t>

<t><list style="numbers" type="1">
  <t>The server advertises accepted credential formats in the challenge's
<spanx style="verb">methodDetails.credentialTypes</spanx>, or defaults to <spanx style="verb">"hash"</spanx> when that
field is omitted. For <spanx style="verb">feePayer: true</spanx>, the client selects one
advertised server-submitted format (<spanx style="verb">"authorization"</spanx> or <spanx style="verb">"permit2"</spanx>)
that it can produce; the credential's top-level <spanx style="verb">payload.type</spanx> is
the on-the-wire discriminator for the choice.</t>
  <t><strong>EIP-3009 path</strong>: The client signs the EIP-712 typed data for
<spanx style="verb">receiveWithAuthorization</spanx>. The server calls
<spanx style="verb">openWithAuthorization()</spanx> or <spanx style="verb">topUpWithAuthorization()</spanx>. The
escrow contract internally calls <spanx style="verb">receiveWithAuthorization</spanx> on
the token.</t>
  <t><strong>Permit2 path</strong>: The client signs the EIP-712 typed data for
Permit2 <spanx style="verb">PermitWitnessTransferFrom</spanx> with a channel-parameter
witness (<spanx style="verb">ChannelOpenWitness</spanx> for <spanx style="verb">open</spanx>, <spanx style="verb">ChannelTopUpWitness</spanx>
for <spanx style="verb">topUp</spanx>). The server calls <spanx style="verb">openWithPermit2()</spanx> or
<spanx style="verb">topUpWithPermit2()</spanx>. The escrow contract internally calls
<spanx style="verb">permitWitnessTransferFrom</spanx> on the canonical Permit2 contract,
which verifies the witness against the function arguments and
pulls tokens via the prior Permit2 approval.</t>
</list></t>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the <spanx style="verb">currency</spanx> token <bcp14>MUST</bcp14> support at
least one of the two server-submitted paths advertised by the server.
Servers <bcp14>MUST
NOT</bcp14> advertise <spanx style="verb">feePayer: true</spanx> for tokens whose authorization paths
they cannot service.</t>

</section>
<section anchor="client-paid-fees-feepayer-false"><name>Client-Paid Fees (feePayer: false)</name>

<t>When <spanx style="verb">feePayer: false</spanx> or omitted:</t>

<t><list style="symbols">
  <t><strong>EOA clients</strong>: Client calls <spanx style="verb">approve(escrow, deposit)</spanx> and then
<spanx style="verb">open()</spanx> on the escrow contract, paying gas from their own balance.</t>
  <t><strong>Smart Wallet clients</strong>: Client batches <spanx style="verb">approve + open</spanx> in a
UserOperation (ERC-4337 <xref target="ERC-4337"/>). A Paymaster <bcp14>MAY</bcp14> sponsor gas
for this client-submitted transaction path.</t>
</list></t>

<t>Servers that accept this client-broadcast path either omit
<spanx style="verb">methodDetails.credentialTypes</spanx> (defaulting to <spanx style="verb">"hash"</spanx>) or include
<spanx style="verb">"hash"</spanx> in the list; clients <bcp14>MUST NOT</bcp14> submit <spanx style="verb">type="hash"</spanx> when
<spanx style="verb">credentialTypes</spanx> is present and omits <spanx style="verb">"hash"</spanx>.</t>

</section>
<section anchor="server-initiated-operations"><name>Server-Initiated Operations</name>

<t><spanx style="verb">settle</spanx> and <spanx style="verb">close</spanx> are server-originated on-chain transactions. The
server pays gas for these regardless of the <spanx style="verb">feePayer</spanx> setting.</t>

<t>By default the payee (merchant) holds the native token of the target
chain to pay gas for <spanx style="verb">settle()</spanx> and <spanx style="verb">close()</spanx>. Merchants that prefer
not to maintain a native-token gas balance <bcp14>MAY</bcp14> instead use the
relayed payee-side functions defined in the Relayed / Gasless
Operations profile (<xref target="relayed-profile"/>): <spanx style="verb">settleWithAuthorization</spanx>
and <spanx style="verb">closeWithAuthorization</spanx>. These let the payee sign an EIP-712
authorization off-chain and have any relayer submit and pay gas.</t>

</section>
<section anchor="relayed-profile"><name>Relayed / Gasless Operations Profile</name>

<t>This profile is <bcp14>OPTIONAL</bcp14>. An implementation <bcp14>MAY</bcp14> omit it entirely, or
implement any subset of its functions. The mandatory core
(<xref target="contract-functions"/>) is sufficient to operate a channel when the
party initiating each transaction pays its own gas. The profile exists
only to let a relayer submit and fund a transaction on behalf of a
party that authorized it off-chain.</t>

<t>A server <bcp14>MUST NOT</bcp14> advertise a capability whose backing function its
escrow does not implement: <spanx style="verb">feePayer: true</spanx> requires at least one of
the payer-funded functions for the offered top-level <spanx style="verb">type</spanx>, and
relayed settlement requires the corresponding payee-side function.</t>

<section anchor="payer-funded-functions"><name>Payer-funded functions</name>

<t><spanx style="verb">openWithAuthorization</spanx>, <spanx style="verb">openWithPermit2</spanx>, <spanx style="verb">topUpWithAuthorization</spanx>,
and <spanx style="verb">topUpWithPermit2</spanx> are specified in <xref target="contract-functions"/>. They
are callable by anyone; the payer's funds move only under the payer's
own EIP-3009 or Permit2 signature, and the channel parameters the
contract trusts are bound into that signature as required by
<xref target="front-running-protection"/> (deterministic nonce for EIP-3009, named
witness for Permit2). On the top-up paths the funding <spanx style="verb">from</spanx> need not
equal <spanx style="verb">channel.payer</spanx>: the contract credits the existing channel, and
any refund on close or withdraw is still paid to <spanx style="verb">channel.payer</spanx>, so a
third-party top-up can only add funds, never redirect them.</t>

</section>
<section anchor="payee-relayed"><name>Payee-initiated functions</name>

<t><spanx style="verb">settleWithAuthorization</spanx> and <spanx style="verb">closeWithAuthorization</spanx> let the payee
authorize a settlement or close off-chain and have any relayer submit
it. Each requires <strong>two</strong> signatures: the payer/<spanx style="verb">authorizedSigner</spanx>
<spanx style="verb">Voucher</spanx> (<xref target="voucher-format"/>) that authorizes the amount, and an
EIP-712 authorization from <spanx style="verb">channel.payee</spanx> that authorizes this
specific relayed call.</t>

<texttable>
      <ttcol align='left'>Parameter</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">channelId</spanx></c>
      <c>bytes32</c>
      <c>Channel identifier</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>uint128</c>
      <c>Cumulative amount to settle/finalize</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>uint256</c>
      <c>Payee-chosen, unused value in the <spanx style="verb">(payee, channelId)</spanx> scope</c>
      <c><spanx style="verb">deadline</spanx></c>
      <c>uint256</c>
      <c>Unix seconds; contract <bcp14>MUST</bcp14> revert after this</c>
      <c><spanx style="verb">payeeSignature</spanx></c>
      <c>bytes</c>
      <c>EIP-712 payee authorization (65 bytes)</c>
      <c><spanx style="verb">voucherSignature</spanx></c>
      <c>bytes</c>
      <c>EIP-712 <spanx style="verb">Voucher</spanx> signature; <bcp14>MAY</bcp14> be empty on the <spanx style="verb">close</spanx> forfeit path (<spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx>)</c>
</texttable>

<figure><sourcecode type="solidity"><![CDATA[
function settleWithAuthorization(
    bytes32 channelId,
    uint128 cumulativeAmount,
    uint256 nonce,
    uint256 deadline,
    bytes calldata payeeSignature,
    bytes calldata voucherSignature
) external;

function closeWithAuthorization(
    bytes32 channelId,
    uint128 cumulativeAmount,
    uint256 nonce,
    uint256 deadline,
    bytes calldata payeeSignature,
    bytes calldata voucherSignature
) external;
]]></sourcecode></figure>

<t>The payee authorization uses these EIP-712 types under the same domain
separator as the <spanx style="verb">Voucher</spanx> (<xref target="voucher-format"/>):</t>

<figure><artwork><![CDATA[
SettleAuthorization(bytes32 channelId,uint128 cumulativeAmount,uint256 nonce,uint256 deadline)
CloseAuthorization(bytes32 channelId,uint128 cumulativeAmount,uint256 nonce,uint256 deadline)
]]></artwork></figure>

<t>Requirements for these functions:</t>

<t><list style="numbers" type="1">
  <t>The contract <bcp14>MUST</bcp14> recover the <spanx style="verb">payeeSignature</spanx> signer and verify it
equals <spanx style="verb">channel.payee</spanx> (EOA via ECDSA, contract wallet via
ERC-1271).</t>
  <t>The contract <bcp14>MUST</bcp14> verify the <spanx style="verb">Voucher</spanx> signature exactly as <spanx style="verb">settle</spanx>
/ <spanx style="verb">close</spanx> do (<xref target="signature-verification"/>), including the strictly
increasing rule (<xref target="rollback-prevention"/>); the <spanx style="verb">close</spanx> forfeit path
(<spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx>) <bcp14>MAY</bcp14> omit <spanx style="verb">voucherSignature</spanx>.</t>
  <t>Replay protection: the contract <bcp14>MUST</bcp14> maintain a used-set keyed by
<spanx style="verb">(channel.payee, channelId, nonce)</spanx> and revert (e.g.,
<spanx style="verb">NonceAlreadyUsed()</spanx>) if the nonce was already consumed; <spanx style="verb">settle</spanx>
and <spanx style="verb">close</spanx> authorizations <bcp14>MUST</bcp14> share the same used-set so a nonce
cannot be reused across the two. Any caller <bcp14>MAY</bcp14> submit; the payee
signature — not <spanx style="verb">msg.sender</spanx> — provides authorization.</t>
  <t>The contract <bcp14>MUST</bcp14> revert (e.g., <spanx style="verb">AuthorizationExpired()</spanx>) when
<spanx style="verb">block.timestamp &gt; deadline</spanx>.</t>
</list></t>

<t>The nonce is an arbitrary unused <spanx style="verb">uint256</spanx> (no ordering requirement),
mirroring the Permit2 unordered-nonce model rather than a sequential
counter. Payees <bcp14>SHOULD</bcp14> set a short <spanx style="verb">deadline</spanx> to bound the lifetime of
an unsubmitted authorization.</t>

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

<t>The credential in the <spanx style="verb">Authorization</spanx> header contains a
base64url-encoded JSON object per <xref target="I-D.httpauth-payment"/>.</t>

<section anchor="credential-structure"><name>Credential Structure</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">challenge</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Echo of the challenge parameters</c>
      <c><spanx style="verb">payload</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Session-specific payload object</c>
      <c><spanx style="verb">source</spanx></c>
      <c>string</c>
      <c>CONDITIONAL</c>
      <c>Payer identifier as a DID. <bcp14>REQUIRED</bcp14> when payload <spanx style="verb">type="hash"</spanx>; NOT <bcp14>REQUIRED</bcp14> when <spanx style="verb">type="authorization"</spanx> or <spanx style="verb">type="permit2"</spanx></c>
</texttable>

<t>The <spanx style="verb">source</spanx> field <bcp14>SHOULD</bcp14> use the <spanx style="verb">did:pkh</spanx> method <xref target="DID-PKH"/> with
the chain ID from the challenge and the payer's Ethereum address
(e.g., <spanx style="verb">did:pkh:eip155:196:0xConsumer...</spanx>). When <spanx style="verb">type="authorization"</spanx>
or <spanx style="verb">type="permit2"</spanx>, the payer is identified via <spanx style="verb">authorization.from</spanx>.</t>

</section>
<section anchor="payload-actions"><name>Payload Actions</name>

<t>The <spanx style="verb">payload</spanx> object uses an <spanx style="verb">action</spanx> discriminator:</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>One of <spanx style="verb">"open"</spanx>, <spanx style="verb">"topUp"</spanx>, <spanx style="verb">"voucher"</spanx>, <spanx style="verb">"close"</spanx></c>
</texttable>

<texttable>
      <ttcol align='left'>Action</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">open</spanx></c>
      <c>Confirms channel open; begins streaming</c>
      <c><spanx style="verb">topUp</spanx></c>
      <c>Adds funds to an existing channel</c>
      <c><spanx style="verb">voucher</spanx></c>
      <c>Submits an updated cumulative voucher</c>
      <c><spanx style="verb">close</spanx></c>
      <c>Requests server to close the channel</c>
</texttable>

<section anchor="open-hash"><name>Open Payload (feePayer: false)</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx>, the client broadcasts the <spanx style="verb">open()</spanx> or
<spanx style="verb">approve + open()</spanx> transaction themselves and submits the txHash.
For smart wallets, this <bcp14>MAY</bcp14> be an ERC-4337 UserOperation whose
outer transaction targets an EntryPoint while the inner execution
opens the escrow 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">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"hash"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel identifier (hex bytes32)</c>
      <c><spanx style="verb">hash</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Tx hash of the on-chain open, direct or via ERC-4337 EntryPoint</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Initial cumulative amount (typically <spanx style="verb">"0"</spanx>)</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>EIP-712 voucher signature for the initial amount</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Address delegated to sign vouchers (defaults to payer if omitted)</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Random bytes32 hex for channelId computation</c>
</texttable>

<t>The initial voucher (with <spanx style="verb">cumulativeAmount</spanx> typically <spanx style="verb">"0"</spanx>) is
<bcp14>REQUIRED</bcp14> so that the server holds a signed voucher from the start of
the session. This ensures the server can call <spanx style="verb">settle()</spanx> or <spanx style="verb">close()</spanx>
at any time, even if the client disconnects immediately after opening.</t>

<t>When <spanx style="verb">type="hash"</spanx>, the <spanx style="verb">source</spanx> field in the credential structure is
<bcp14>REQUIRED</bcp14>. The server needs the payer identity to verify the on-chain
deposit. This is consistent with the <spanx style="verb">charge</spanx> intent's requirement for
hash credentials.</t>

<t><strong>Example:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.llm-service.com",
    "method": "evm",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-04-01T12:05:00Z"
  },
  "source": "did:pkh:eip155:196:0xaabbccddee11223344556677889900aabbccddee",
  "payload": {
    "action": "open",
    "type": "hash",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "hash": "0x9f8e7d6c5b4a39281700abcdef1234567890abcdef1234567890abcdef123456",
    "cumulativeAmount": "0",
    "signature": "0xabcdef1234567890...",
    "authorizedSigner": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
    "salt": "0xaaaa1234bbbb5678cccc9012dddd3456eeee7890ffff1234aaaa5678bbbb9012"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="open-server-submitted"><name>Open Payload (feePayer: true)</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the client submits a token-pull
authorization for the server to call the corresponding
<spanx style="verb">openWith…()</spanx> function on the escrow contract. The
top-level <spanx style="verb">type</spanx> field selects the format.</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">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"authorization"</spanx> for EIP-3009, or <spanx style="verb">"permit2"</spanx> for Permit2</c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel identifier (hex bytes32)</c>
      <c><spanx style="verb">authorization</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Token-pull authorization parameters; shape determined by the top-level <spanx style="verb">type</spanx></c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Authorization signature (65 bytes hex). EIP-3009 signature if <spanx style="verb">type="authorization"</spanx>; Permit2 EIP-712 signature if <spanx style="verb">type="permit2"</spanx></c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Initial cumulative amount (typically <spanx style="verb">"0"</spanx>)</c>
      <c><spanx style="verb">voucherSignature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>EIP-712 voucher signature for the initial amount</c>
      <c><spanx style="verb">authorizedSigner</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Address delegated to sign vouchers (defaults to payer if omitted)</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Random bytes32 hex for channelId computation</c>
</texttable>

<t>The <spanx style="verb">authorization</spanx> object takes one of two shapes.</t>

<t><strong>EIP-3009 shape</strong> (<spanx style="verb">type="authorization"</spanx>):</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">from</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Payer address</c>
      <c><spanx style="verb">to</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Escrow contract address (= <spanx style="verb">methodDetails.escrowContract</spanx>)</c>
      <c><spanx style="verb">value</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Deposit amount in base units</c>
      <c><spanx style="verb">validAfter</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Unix timestamp, valid from. <spanx style="verb">"0"</spanx> = immediately</c>
      <c><spanx style="verb">validBefore</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Unix timestamp, expires</c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">bytes32</spanx> hex. EIP-3009 nonce; <bcp14>MUST</bcp14> be derived from channel parameters per <xref target="front-running-protection"/></c>
</texttable>

<t>The <spanx style="verb">nonce</spanx> <bcp14>MUST</bcp14> be derived from the surrounding payload's channel
parameters: for <spanx style="verb">action="open"</spanx>,
<spanx style="verb">nonce = keccak256(abi.encode(from, payee, token, salt, authorizedSigner))</spanx>;
for <spanx style="verb">action="topUp"</spanx>,
<spanx style="verb">nonce = keccak256(abi.encode(channelId, additionalDeposit, from, topUpSalt))</spanx>.
The client <bcp14>MUST</bcp14> sign the EIP-3009 typed data with this derived nonce
and <bcp14>MUST</bcp14> transmit it in the credential. The escrow contract recomputes
the expected nonce from its own function arguments and reverts if the
caller-supplied value does not match.</t>

<t><strong>Permit2 shape</strong> (<spanx style="verb">type="permit2"</spanx>):</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">from</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Payer address (Permit2 <spanx style="verb">owner</spanx>); the Permit2 signature is verified against this address</c>
      <c><spanx style="verb">permitted</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Permit2 <spanx style="verb">TokenPermissions</spanx>: <spanx style="verb">{ "token": &lt;ERC-20 address = request.currency&gt;, "amount": &lt;deposit in base units&gt; }</spanx></c>
      <c><spanx style="verb">nonce</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Decimal string. uint256 Permit2 unordered nonce (any unused value)</c>
      <c><spanx style="verb">deadline</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Decimal string. Unix timestamp after which the signature is invalid</c>
      <c><spanx style="verb">witness</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel-parameter witness. For <spanx style="verb">open</spanx>: <spanx style="verb">{ "payee", "salt", "authorizedSigner" }</spanx>. For <spanx style="verb">topUp</spanx>: <spanx style="verb">{ "channelId" }</spanx></c>
</texttable>

<t>The <spanx style="verb">authorization</spanx> object carries every field the Permit2 signature
covers, so the signed digest is reconstructable from the object alone
(plus the domain below). This mirrors the EIP-3009 shape, whose fields
are likewise exactly what that scheme signs.</t>

<t>The <spanx style="verb">spender</spanx> is the one signed field deliberately omitted: Permit2
fixes <spanx style="verb">spender = msg.sender</spanx> inside <spanx style="verb">permitWitnessTransferFrom</spanx>, so it
is always the escrow contract. Clients <bcp14>MUST</bcp14> set
<spanx style="verb">spender = methodDetails.escrowContract</spanx> when constructing the EIP-712
hash; the escrow supplies it implicitly on-chain.</t>

<t>The <spanx style="verb">witness</spanx> object <bcp14>MUST</bcp14> carry the channel parameters:</t>

<t><list style="symbols">
  <t>For <spanx style="verb">open</spanx>: <spanx style="verb">payee</spanx>, <spanx style="verb">salt</spanx>, <spanx style="verb">authorizedSigner</spanx>. <spanx style="verb">payee</spanx> <bcp14>MUST</bcp14> equal
the challenge <spanx style="verb">request.recipient</spanx>; <spanx style="verb">salt</spanx> and <spanx style="verb">authorizedSigner</spanx>
<bcp14>MUST</bcp14> equal the corresponding open-payload fields (an omitted
<spanx style="verb">authorizedSigner</spanx> is the zero address).</t>
  <t>For <spanx style="verb">topUp</spanx>: <spanx style="verb">channelId</spanx>, which <bcp14>MUST</bcp14> equal the payload <spanx style="verb">channelId</spanx>.</t>
</list></t>

<t>The channel parameters the server passes to the escrow are
authoritative: the escrow reconstructs the witness from them and the
Permit2 verification reverts on any mismatch. A server <bcp14>MUST</bcp14> reject the
credential if <spanx style="verb">authorization.witness</spanx> disagrees with those
authoritative values rather than forwarding a signature that will
revert on-chain.</t>

<t>The Permit2 EIP-712 domain and struct types are:</t>

<figure><artwork><![CDATA[
EIP712Domain(string name,uint256 chainId,address verifyingContract)
  name              = "Permit2"
  chainId           = methodDetails.chainId
  verifyingContract = canonical Permit2 contract address

// For open (action="open"):
PermitWitnessTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline,ChannelOpenWitness witness)
ChannelOpenWitness(address payee,bytes32 salt,address authorizedSigner)
TokenPermissions(address token,uint256 amount)

// For topUp (action="topUp"):
PermitWitnessTransferFrom(TokenPermissions permitted,address spender,uint256 nonce,uint256 deadline,ChannelTopUpWitness witness)
ChannelTopUpWitness(bytes32 channelId)
TokenPermissions(address token,uint256 amount)
]]></artwork></figure>

<t>The <spanx style="verb">witnessTypeString</spanx> passed to <spanx style="verb">permitWitnessTransferFrom</spanx> is
the suffix beginning at <spanx style="verb">ChannelOpenWitness witness)</spanx> (or
<spanx style="verb">ChannelTopUpWitness witness)</spanx>) followed by the witness struct
definition and the <spanx style="verb">TokenPermissions</spanx> definition, per the Permit2
encoding rules.</t>

<t>Note that the Permit2 domain omits the <spanx style="verb">version</spanx> field. The
canonical Permit2 contract is deployed at the same deterministic
address on most major EVM chains. The client uses
<spanx style="verb">methodDetails.permit2Contract</spanx> when present, and otherwise the
canonical deterministic address, as <spanx style="verb">verifyingContract</spanx>. The escrow's
configured Permit2 address <bcp14>MUST</bcp14> be the same one the client signed
against; a mismatch makes the Permit2 signature fail verification
on-chain. Servers <bcp14>MUST</bcp14> advertise <spanx style="verb">methodDetails.permit2Contract</spanx> on
any chain whose Permit2 is not at the canonical address.</t>

<t><strong>Example (EIP-3009):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.llm-service.com",
    "method": "evm",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-04-01T12:05:00Z"
  },
  "payload": {
    "action": "open",
    "type": "authorization",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "authorization": {
      "from": "0xaabbccddee11223344556677889900aabbccddee",
      "to": "0x1234567890abcdef1234567890abcdef12345678",
      "value": "10000000",
      "validAfter": "0",
      "validBefore": "1743523500",
      "nonce": "0xaaaa...aaaa"
    },
    "signature": "0xabcdef...eip3009sig",
    "cumulativeAmount": "0",
    "voucherSignature": "0x123456...vouchersig",
    "authorizedSigner": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
    "salt": "0xaaaa1234bbbb5678cccc9012dddd3456eeee7890ffff1234aaaa5678bbbb9012"
  }
}
]]></sourcecode></figure>

<t><strong>Example (Permit2):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.llm-service.com",
    "method": "evm",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-04-01T12:05:00Z"
  },
  "payload": {
    "action": "open",
    "type": "permit2",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "authorization": {
      "from": "0xaabbccddee11223344556677889900aabbccddee",
      "permitted": {
        "token": "0x74b7F16337b8972027F6196A17a631ac6dE26d22",
        "amount": "10000000"
      },
      "nonce": "1",
      "deadline": "1743523500",
      "witness": {
        "payee": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
        "salt": "0xaaaa1234bbbb5678cccc9012dddd3456eeee7890ffff1234aaaa5678bbbb9012",
        "authorizedSigner": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00"
      }
    },
    "signature": "0xfedcba...permit2sig",
    "cumulativeAmount": "0",
    "voucherSignature": "0x123456...vouchersig",
    "authorizedSigner": "0x742d35cc6634c0532925a3b844bc9e7595f8fe00",
    "salt": "0xaaaa1234bbbb5678cccc9012dddd3456eeee7890ffff1234aaaa5678bbbb9012"
  }
}
]]></sourcecode></figure>

<t>The <spanx style="verb">authorization.witness.payee</spanx> equals the challenge
<spanx style="verb">request.recipient</spanx>, and <spanx style="verb">witness.salt</spanx> / <spanx style="verb">witness.authorizedSigner</spanx>
equal the top-level <spanx style="verb">salt</spanx> / <spanx style="verb">authorizedSigner</spanx> (they appear in both
places because the witness is a faithful copy of what was signed,
while the top-level fields are what the server passes to the escrow).
The server treats the top-level channel parameters as authoritative
when calling <spanx style="verb">openWithPermit2</spanx>; the Permit2 signature reverts on-chain
if the witness it reconstructs disagrees. <spanx style="verb">spender</spanx> is not shown
because Permit2 fixes it to the escrow (<spanx style="verb">msg.sender</spanx>).</t>

</section>
<section anchor="topup-payload"><name>TopUp Payload</name>

<t>The <spanx style="verb">topUp</spanx> action adds funds to an existing channel. It resets any
pending close timer.</t>

<t><strong>When feePayer: false</strong> (client broadcasts):</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">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"hash"</spanx></c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel ID</c>
      <c><spanx style="verb">hash</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Tx hash of the on-chain topUp, direct or via ERC-4337 EntryPoint</c>
      <c><spanx style="verb">additionalDeposit</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Additional amount deposited</c>
</texttable>

<t>When <spanx style="verb">type="hash"</spanx>, the credential-level <spanx style="verb">source</spanx> field is
<bcp14>REQUIRED</bcp14>, as described in the Credential Structure section.</t>

<t><strong>When feePayer: true</strong> (server submits via EIP-3009 or Permit2):</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">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"authorization"</spanx> for EIP-3009, or <spanx style="verb">"permit2"</spanx> for Permit2</c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel ID</c>
      <c><spanx style="verb">salt</spanx></c>
      <c>string</c>
      <c>CONDITIONAL</c>
      <c>Random bytes32 hex; passed as <spanx style="verb">topUpSalt</spanx> for EIP-3009 nonce derivation. <bcp14>REQUIRED</bcp14> when <spanx style="verb">type="authorization"</spanx>; omitted for <spanx style="verb">"permit2"</spanx> (the Permit2 path uses no <spanx style="verb">topUpSalt</spanx>)</c>
      <c><spanx style="verb">authorization</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Token-pull authorization parameters; shape determined by the top-level <spanx style="verb">type</spanx>, using the same shapes defined in <xref target="open-server-submitted"/></c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Authorization signature</c>
      <c><spanx style="verb">additionalDeposit</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Additional amount to deposit. <bcp14>MUST</bcp14> equal the authorization amount (<spanx style="verb">authorization.value</spanx> for <spanx style="verb">"authorization"</spanx>, <spanx style="verb">authorization.permitted.amount</spanx> for <spanx style="verb">"permit2"</spanx>)</c>
</texttable>

<t>The top-level <spanx style="verb">additionalDeposit</spanx> and the authorization amount <bcp14>MUST</bcp14> be
equal: the server passes this value as the <spanx style="verb">additionalDeposit</spanx> argument
to <spanx style="verb">topUpWithAuthorization</spanx> / <spanx style="verb">topUpWithPermit2</spanx>, and the escrow binds
it into the token-pull signature (EIP-3009 <spanx style="verb">value</spanx>, or Permit2
<spanx style="verb">permitted.amount</spanx>). A server <bcp14>MUST</bcp14> reject the credential if the two
disagree.</t>

</section>
<section anchor="voucher-payload"><name>Voucher Payload</name>

<t>The <spanx style="verb">voucher</spanx> action submits an updated cumulative voucher. For
<spanx style="verb">action="voucher"</spanx> and <spanx style="verb">action="close"</spanx>, the <spanx style="verb">source</spanx> field is
<bcp14>OPTIONAL</bcp14>; the server identifies the payer from the established
channel state.</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>Channel identifier</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Cumulative amount authorized</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>EIP-712 voucher signature</c>
</texttable>

<t>Vouchers <bcp14>MAY</bcp14> carry an optional <spanx style="verb">deposit</spanx> field to merge a deposit
authorization with the voucher update in a single round-trip. This
allows the server to process both the funding and the new voucher
atomically.</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">deposit</spanx></c>
      <c>object</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Deposit extension</c>
      <c><spanx style="verb">deposit.action</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"open"</spanx> or <spanx style="verb">"topUp"</spanx></c>
      <c><spanx style="verb">deposit.type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"authorization"</spanx> for EIP-3009, or <spanx style="verb">"permit2"</spanx> for Permit2</c>
      <c><spanx style="verb">deposit.authorization</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Token-pull authorization parameters; shape determined by <spanx style="verb">deposit.type</spanx>, using the same shapes defined in <xref target="open-server-submitted"/></c>
      <c><spanx style="verb">deposit.signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Authorization signature (65 bytes, hex-encoded)</c>
      <c><spanx style="verb">deposit.salt</spanx></c>
      <c>string</c>
      <c>CONDITIONAL</c>
      <c>Random bytes32 hex. Used for channelId computation when <spanx style="verb">deposit.action</spanx> is <spanx style="verb">"open"</spanx> (<bcp14>REQUIRED</bcp14>). When <spanx style="verb">deposit.action</spanx> is <spanx style="verb">"topUp"</spanx>, passed as <spanx style="verb">topUpSalt</spanx> for EIP-3009 nonce derivation (<bcp14>REQUIRED</bcp14> for <spanx style="verb">type="authorization"</spanx>; unused by <spanx style="verb">"permit2"</spanx>)</c>
      <c><spanx style="verb">deposit.authorizedSigner</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Address delegated to sign vouchers. Omitted ⇒ the zero address, which the contract treats as the payer; clients <bcp14>MUST</bcp14> use the zero address (not <spanx style="verb">authorization.from</spanx>) when deriving the EIP-3009 nonce or constructing the Permit2 witness. Only applicable when <spanx style="verb">deposit.action</spanx> is <spanx style="verb">"open"</spanx></c>
</texttable>

<t>When <spanx style="verb">deposit</spanx> is present, the server processes the deposit first by
calling the matching escrow function (<spanx style="verb">openWithAuthorization</spanx> /
<spanx style="verb">topUpWithAuthorization</spanx> for <spanx style="verb">deposit.type="authorization"</spanx>, or
<spanx style="verb">openWithPermit2</spanx> / <spanx style="verb">topUpWithPermit2</spanx> for <spanx style="verb">deposit.type="permit2"</spanx>),
then validates and accepts the voucher. If the deposit fails, the
server <bcp14>MUST</bcp14> reject the entire credential.</t>

<t><spanx style="verb">deposit.action: "open"</spanx> is an optimization pattern that allows the
client to pre-compute the <spanx style="verb">channelId</spanx> deterministically (per the
formula in the Channel State section) and bundle channel creation
with the initial voucher in a single round-trip. Despite using
<spanx style="verb">action="voucher"</spanx> in the payload, the server creates the channel
as part of processing. The server <bcp14>MUST</bcp14> process the deposit first
(calling <spanx style="verb">openWithAuthorization</spanx> or <spanx style="verb">openWithPermit2</spanx>), then validate
the voucher against the newly created channel. For already-existing
channels, <spanx style="verb">deposit.action</spanx> <bcp14>MUST</bcp14> be <spanx style="verb">"topUp"</spanx>. The escrow contract will
revert if <spanx style="verb">open</spanx> is called on an existing <spanx style="verb">channelId</spanx>.</t>

<t><strong>Example (voucher only):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.llm-service.com",
    "method": "evm",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-04-01T12:05:00Z"
  },
  "payload": {
    "action": "voucher",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "cumulativeAmount": "250000",
    "signature": "0xabcdef1234567890..."
  }
}
]]></sourcecode></figure>

<t><strong>Example (voucher + deposit merge):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.llm-service.com",
    "method": "evm",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-04-01T12:05:00Z"
  },
  "payload": {
    "action": "voucher",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "cumulativeAmount": "15000000",
    "signature": "0xabcdef...vouchersig",
    "deposit": {
      "action": "topUp",
      "type": "authorization",
      "salt": "0xcccc5678dddd9012eeee3456ffff7890aaaa1234bbbb5678cccc9012dddd3456",
      "authorization": {
        "from": "0xaabbccddee11223344556677889900aabbccddee",
        "to": "0x1234567890abcdef1234567890abcdef12345678",
        "value": "5000000",
        "validAfter": "0",
        "validBefore": "1743523500",
        "nonce": "0xbbbb...bbbb"
      },
      "signature": "0x789abc...eip3009sig"
    }
  }
}
]]></sourcecode></figure>

</section>
<section anchor="close-payload"><name>Close Payload</name>

<t>The <spanx style="verb">close</spanx> action requests the server to close the channel and settle
on-chain.</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>Channel identifier</c>
      <c><spanx style="verb">cumulativeAmount</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Final cumulative amount</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>EIP-712 voucher signature</c>
</texttable>

<t>The server calls <spanx style="verb">close(channelId, cumulativeAmount, signature)</spanx> on the
escrow contract.</t>

<t><strong>Example:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.llm-service.com",
    "method": "evm",
    "intent": "session",
    "request": "eyJ...",
    "expires": "2026-04-01T12:05:00Z"
  },
  "payload": {
    "action": "close",
    "channelId": "0x6d0f4fdf1f2f6a1f6c1b0fbd6a7d5c2c0a8d3d7b1f6a9c1b3e2d4a5b6c7d8e9f",
    "cumulativeAmount": "500000",
    "signature": "0xabcdef1234567890..."
  }
}
]]></sourcecode></figure>

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

<t>Vouchers use <xref target="EIP-712"/> typed structured data signing.</t>

<section anchor="type-definitions"><name>Type Definitions</name>

<figure><sourcecode type="json"><![CDATA[
{
  "Voucher": [
    { "name": "channelId", "type": "bytes32" },
    { "name": "cumulativeAmount", "type": "uint128" }
  ]
}
]]></sourcecode></figure>

</section>
<section anchor="domain-separator"><name>Domain Separator</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c><spanx style="verb">name</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"EVM Payment Channel"</spanx></c>
      <c><spanx style="verb">version</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"1"</spanx></c>
      <c><spanx style="verb">chainId</spanx></c>
      <c>uint256</c>
      <c>EVM chain ID (e.g., <spanx style="verb">196</spanx>)</c>
      <c><spanx style="verb">verifyingContract</spanx></c>
      <c>string</c>
      <c>Escrow contract address</c>
</texttable>

<t>Note: The domain <spanx style="verb">name</spanx> differs from Tempo's <spanx style="verb">"Tempo Stream Channel"</spanx>.
This is the only semantic difference in the voucher signing scheme.</t>

</section>
<section anchor="signing-procedure"><name>Signing Procedure</name>

<t><list style="numbers" type="1">
  <t>Construct the domain separator hash:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
domainSeparator = keccak256(
  abi.encode(
    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
    keccak256(bytes("EVM Payment Channel")),
    keccak256(bytes("1")),
    chainId,
    verifyingContract
  )
)
]]></artwork></figure>
  </t>
  <t>Construct the struct hash:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
structHash = keccak256(
  abi.encode(
    keccak256("Voucher(bytes32 channelId,uint128 cumulativeAmount)"),
    channelId,
    cumulativeAmount
  )
)
]]></artwork></figure>
  </t>
  <t>Compute the signing hash:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
signingHash = keccak256(
  "\x19\x01" || domainSeparator || structHash
)
]]></artwork></figure>
  </t>
  <t>Sign with ECDSA using secp256k1 curve</t>
  <t>Encode as a 65-byte <spanx style="verb">bytes</spanx> value: <spanx style="verb">r (32) || s (32) || v (1)</spanx>, where <spanx style="verb">v</spanx> is 27 or 28</t>
</list></t>

</section>
<section anchor="cumulative-semantics"><name>Cumulative Semantics</name>

<t>Vouchers specify cumulative totals, not incremental deltas:</t>

<t><list style="symbols">
  <t>Voucher #1: <spanx style="verb">cumulativeAmount = 100</spanx> (authorizes 100 total)</t>
  <t>Voucher #2: <spanx style="verb">cumulativeAmount = 250</spanx> (authorizes 250 total)</t>
  <t>Voucher #3: <spanx style="verb">cumulativeAmount = 400</spanx> (authorizes 400 total)</t>
</list></t>

<t>When settling, the contract computes:
<spanx style="verb">delta = cumulativeAmount - settled</spanx></t>

<t>Server <bcp14>MUST</bcp14> verify <spanx style="verb">cumulativeAmount &lt;= 2^128 - 1</spanx> (uint128 upper
bound). Vouchers exceeding this <bcp14>MUST</bcp14> be rejected.</t>

</section>
</section>
<section anchor="verification-procedure"><name>Verification Procedure</name>

<section anchor="common-verification"><name>Common Verification</name>

<t>For all actions, servers <bcp14>MUST</bcp14> perform the following steps before
action-specific verification:</t>

<t><list style="numbers" type="1">
  <t>Decode the base64url credential and parse the JSON object</t>
  <t>Verify <spanx style="verb">payload.action</spanx> is a recognized action</t>
  <t>Look up the stored challenge using <spanx style="verb">credential.challenge.id</spanx></t>
  <t>Verify all fields in <spanx style="verb">credential.challenge</spanx> exactly match the
stored challenge parameters</t>
  <t>Verify the challenge has not expired</t>
</list></t>

</section>
<section anchor="tx-outcome"><name>Transaction Outcome Checks</name>

<t>Whenever a server relies on an on-chain transaction — verifying a
client-submitted <spanx style="verb">txHash</spanx> (<spanx style="verb">type="hash"</spanx>) or submitting one itself
(<spanx style="verb">type="authorization"</spanx>, <spanx style="verb">type="permit2"</spanx>, <spanx style="verb">settle</spanx>, <spanx style="verb">close</spanx>) — it
<bcp14>MUST</bcp14> read the receipt's <spanx style="verb">status</spanx> field and <bcp14>MUST NOT</bcp14> treat the
transaction as effective on <spanx style="verb">status</spanx> alone being present.</t>

<t><list style="symbols">
  <t><spanx style="verb">status == 0x1</spanx> (success): the call's on-chain effects occurred;
proceed to verify channel state.</t>
  <t><spanx style="verb">status == 0x0</spanx> (reverted): the transaction was mined but <strong>no state
changed</strong> (e.g. <spanx style="verb">NonceMismatch</spanx>, <spanx style="verb">AmountNotIncreasing</spanx>,
<spanx style="verb">ChannelAlreadyExists</spanx>, or a failed token pull). The server <bcp14>MUST</bcp14> fail
fast with a typed error and <bcp14>MUST NOT</bcp14> keep polling for a state change
that will never come.</t>
  <t>No receipt yet (not mined): distinct from a revert; the server <bcp14>MAY</bcp14>
await or retry up to a bounded timeout.</t>
</list></t>

<t>A reverted <spanx style="verb">status == 0x0</spanx> is a definitive negative outcome, not a
pending one; conflating the two is what causes close/settlement paths
to hang on a spinner.</t>

</section>
<section anchor="open-verification"><name>Open Verification</name>

<t>On <spanx style="verb">action="open"</spanx>, servers <bcp14>MUST</bcp14>:</t>

<t><strong>When <spanx style="verb">type="hash"</spanx>:</strong></t>

<t><list style="numbers" type="1">
  <t>Verify the txHash via <spanx style="verb">eth_getTransactionReceipt</spanx>, checking
<spanx style="verb">receipt.status</spanx> per <xref target="tx-outcome"/> (a reverted <spanx style="verb">0x0</spanx> <bcp14>MUST</bcp14> be
rejected immediately, not awaited)</t>
  <t>Verify the transaction successfully caused <spanx style="verb">open()</spanx> to be
executed on the expected escrow, either directly or through an
ERC-4337 EntryPoint-mediated UserOperation</t>
  <t>Verify that this execution created or initialized the specific
<spanx style="verb">payload.channelId</spanx></t>
  <t>Query the escrow contract to verify channel state:
  <list style="symbols">
      <t>Channel exists with the provided <spanx style="verb">channelId</spanx></t>
      <t><spanx style="verb">channel.payee</spanx> matches server's address</t>
      <t><spanx style="verb">channel.token</spanx> matches <spanx style="verb">request.currency</spanx></t>
      <t><spanx style="verb">channel.deposit - channel.settled &gt;= amount</spanx></t>
      <t>Channel is not finalized</t>
      <t><spanx style="verb">channel.closeRequestedAt == 0</spanx> (no pending close)</t>
    </list></t>
  <t>Verify the initial voucher signature (see <xref target="voucher-verification"/>)</t>
  <t>Initialize server-side accounting state</t>
</list></t>

<t><strong>When <spanx style="verb">type="authorization"</spanx> or <spanx style="verb">type="permit2"</spanx>:</strong></t>

<t><list style="numbers" type="1">
  <t>Verify the <spanx style="verb">authorization</spanx> parameters according to the top-level
<spanx style="verb">type</spanx>:
  <list style="symbols">
      <t><spanx style="verb">"authorization"</spanx>: validate EIP-3009 fields and signature</t>
      <t><spanx style="verb">"permit2"</spanx>: validate Permit2 fields and signature</t>
    </list></t>
  <t>Call the matching escrow function:
  <list style="symbols">
      <t><spanx style="verb">"authorization"</spanx>: <spanx style="verb">openWithAuthorization()</spanx></t>
      <t><spanx style="verb">"permit2"</spanx>: <spanx style="verb">openWithPermit2()</spanx></t>
    </list></t>
  <t>Verify channel state as above</t>
  <t>Verify the initial voucher signature</t>
  <t>Initialize server-side accounting state</t>
</list></t>

</section>
<section anchor="topup-verification"><name>TopUp Verification</name>

<t>On <spanx style="verb">action="topUp"</spanx>, servers <bcp14>MUST</bcp14>:</t>

<t><strong>When <spanx style="verb">type="hash"</spanx>:</strong></t>

<t><list style="numbers" type="1">
  <t>Verify the txHash shows a successful <spanx style="verb">topUp()</spanx> execution on the
expected escrow (check <spanx style="verb">receipt.status</spanx> per <xref target="tx-outcome"/>; reject a
reverted <spanx style="verb">0x0</spanx> immediately), either directly or through an ERC-4337
EntryPoint-mediated UserOperation</t>
  <t>Verify that this execution affected the specific <spanx style="verb">payload.channelId</spanx></t>
  <t>Query updated channel state</t>
  <t>Verify the channel deposit increased by exactly
<spanx style="verb">payload.additionalDeposit</spanx></t>
  <t>Update server-side balance</t>
</list></t>

<t><strong>When <spanx style="verb">type="authorization"</spanx> or <spanx style="verb">type="permit2"</spanx>:</strong></t>

<t><list style="numbers" type="1">
  <t>Verify the <spanx style="verb">authorization</spanx> parameters according to the top-level
<spanx style="verb">type</spanx>:
  <list style="symbols">
      <t><spanx style="verb">"authorization"</spanx>: validate EIP-3009 fields and signature</t>
      <t><spanx style="verb">"permit2"</spanx>: validate Permit2 fields and signature</t>
    </list></t>
  <t>Call the matching escrow function:
  <list style="symbols">
      <t><spanx style="verb">"authorization"</spanx>: <spanx style="verb">topUpWithAuthorization()</spanx></t>
      <t><spanx style="verb">"permit2"</spanx>: <spanx style="verb">topUpWithPermit2()</spanx></t>
    </list></t>
  <t>Verify updated channel state</t>
  <t>Update server-side balance</t>
</list></t>

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

<t>On <spanx style="verb">action="voucher"</spanx>, servers <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Verify <spanx style="verb">channel.closeRequestedAt == 0</spanx> (no pending close).
Reject vouchers on channels with a pending forced close.</t>
  <t>If <spanx style="verb">deposit</spanx> field is present, process deposit first:
  <list style="symbols">
      <t>For <spanx style="verb">deposit.type="authorization"</spanx>, call
<spanx style="verb">openWithAuthorization</spanx> or <spanx style="verb">topUpWithAuthorization</spanx></t>
      <t>For <spanx style="verb">deposit.type="permit2"</spanx>, call
<spanx style="verb">openWithPermit2</spanx> or <spanx style="verb">topUpWithPermit2</spanx></t>
      <t>Verify updated channel state</t>
    </list></t>
  <t>Verify voucher signature using EIP-712 recovery</t>
  <t>Verify signature uses canonical low-s values</t>
  <t>Recover signer and verify it matches the expected signer from
on-chain state (<spanx style="verb">channel.authorizedSigner</spanx> if non-zero, otherwise
<spanx style="verb">channel.payer</spanx>). For ERC-1271 contract wallets, verify via
<spanx style="verb">isValidSignature</spanx>.</t>
  <t>If <spanx style="verb">cumulativeAmount &lt;= highestVoucherAmount</spanx>, return <spanx style="verb">200 OK</spanx>
without changing state (idempotent replay).</t>
  <t>Verify monotonicity:
  <list style="symbols">
      <t><spanx style="verb">(cumulativeAmount - highestVoucherAmount) &gt;= minVoucherDelta</spanx></t>
    </list></t>
  <t>Verify <spanx style="verb">cumulativeAmount &lt;= channel.deposit</spanx> (ensures the
settlement delta <spanx style="verb">cumulativeAmount - channel.settled</spanx> does not
exceed available funds <spanx style="verb">channel.deposit - channel.settled</spanx>)</t>
  <t>Persist voucher to durable storage before providing service</t>
  <t>Update <spanx style="verb">highestVoucherAmount = cumulativeAmount</spanx></t>
</list></t>

<t>Signature and signer verification (steps 3-5) <bcp14>MUST</bcp14> be performed
before the idempotency short-circuit in step 6. Because <spanx style="verb">voucher</spanx>
and <spanx style="verb">close</spanx> credentials <bcp14>MAY</bcp14> omit the <spanx style="verb">source</spanx> field and identify
the payer from channel state, returning <spanx style="verb">200 OK</spanx> for a stale
<spanx style="verb">cumulativeAmount</spanx> before verifying the signature would let any
party that knows a <spanx style="verb">channelId</spanx> trigger successful-looking
responses, and — when the voucher is submitted alongside a
service request — consume already-authorized balance on the
payer's behalf.</t>

<t>Implementations <bcp14>MAY</bcp14> cache successfully-verified voucher signatures
keyed by <spanx style="verb">(channelId, cumulativeAmount, signature)</spanx> and short-circuit
on an exact bit-for-bit replay before re-running <spanx style="verb">ecrecover</spanx>. This
optimization is safe because the cache hit itself proves the
signature was previously verified.</t>

</section>
<section anchor="idempotency"><name>Idempotency</name>

<t>Servers <bcp14>MUST</bcp14> treat voucher submissions idempotently <strong>only after
the voucher signature and signer have been verified</strong> per steps
3-5 of <xref target="voucher-verification"/>:</t>

<t><list style="symbols">
  <t>If signature verification fails, the server <bcp14>MUST</bcp14> return an error
response per <xref target="error-responses"/>, regardless of how
<spanx style="verb">cumulativeAmount</spanx> compares to <spanx style="verb">highestVoucherAmount</spanx>.</t>
  <t>After successful signature and signer verification:
  <list style="symbols">
      <t>If <spanx style="verb">cumulativeAmount == highestVoucherAmount</spanx>, the server
<bcp14>MUST</bcp14> return <spanx style="verb">200 OK</spanx> without changing state.</t>
      <t>If <spanx style="verb">cumulativeAmount &lt; highestVoucherAmount</spanx>, the server
<bcp14>MUST</bcp14> return <spanx style="verb">200 OK</spanx> without changing state.</t>
      <t>Only vouchers with <spanx style="verb">cumulativeAmount &gt; highestVoucherAmount</spanx>
proceed to the monotonicity and balance checks in
<xref target="voucher-verification"/>.</t>
    </list></t>
</list></t>

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

<texttable>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>When</ttcol>
      <c>400 Bad Request</c>
      <c>Malformed payload or missing fields</c>
      <c>402 Payment Required</c>
      <c>Invalid signature or signer mismatch</c>
      <c>409 Conflict</c>
      <c>A submitted/verified on-chain transaction reverted (<spanx style="verb">receipt.status == 0x0</spanx>, see <xref target="tx-outcome"/>)</c>
      <c>410 Gone</c>
      <c>Channel finalized or not found</c>
</texttable>

<t>Error responses use Problem Details <xref target="RFC9457"/>. Problem type URIs:</t>

<texttable>
      <ttcol align='left'>Type URI</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">https://paymentauth.org/problems/session/invalid-signature</spanx></c>
      <c>Voucher signature invalid</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/signer-mismatch</spanx></c>
      <c>Signer not authorized</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/amount-exceeds-deposit</spanx></c>
      <c>Exceeds channel deposit</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/delta-too-small</spanx></c>
      <c>Below <spanx style="verb">minVoucherDelta</spanx></c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/channel-not-found</spanx></c>
      <c>No channel with this ID</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/channel-finalized</spanx></c>
      <c>Channel closed</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/challenge-not-found</spanx></c>
      <c>Challenge unknown or expired</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/insufficient-balance</spanx></c>
      <c>Insufficient authorized balance</c>
      <c><spanx style="verb">https://paymentauth.org/problems/session/transaction-reverted</spanx></c>
      <c>An on-chain open/topUp/settle/close transaction reverted</c>
</texttable>

<t>These problem types are the <strong>interoperable error surface</strong>: they are
what a client consumes, and they <bcp14>MUST</bcp14> be uniform across deployments
regardless of how each escrow names its internal reverts
(<xref target="contract-errors"/>). Accordingly, when a server-submitted transaction
reverts (<xref target="tx-outcome"/>) — a <spanx style="verb">feePayer: true</spanx> open/topUp, a relayed
settle/close — or when an action fails server-side validation, the
server <bcp14>MUST</bcp14> report the failure using the most specific applicable
problem type, falling back to <spanx style="verb">transaction-reverted</spanx> when none is more
specific. Servers <bcp14>MUST NOT</bcp14> surface a raw on-chain revert selector or an
implementation-specific error string as the problem <spanx style="verb">type</spanx>.</t>

<t>Recommended mapping from on-chain revert condition (<xref target="contract-errors"/>)
to problem type:</t>

<texttable>
      <ttcol align='left'>Revert condition</ttcol>
      <ttcol align='left'>Problem type</ttcol>
      <c><spanx style="verb">AmountExceedsDeposit</spanx></c>
      <c><spanx style="verb">amount-exceeds-deposit</spanx></c>
      <c><spanx style="verb">ChannelNotFound</spanx></c>
      <c><spanx style="verb">channel-not-found</spanx></c>
      <c><spanx style="verb">ChannelFinalized</spanx></c>
      <c><spanx style="verb">channel-finalized</spanx></c>
      <c><spanx style="verb">InvalidSignature</spanx></c>
      <c><spanx style="verb">invalid-signature</spanx></c>
      <c>Insufficient on-chain balance / token pull failed</c>
      <c><spanx style="verb">insufficient-balance</spanx></c>
      <c><spanx style="verb">NonceMismatch</spanx>, <spanx style="verb">NonceAlreadyUsed</spanx>, <spanx style="verb">AuthorizationExpired</spanx>, <spanx style="verb">AmountNotIncreasing</spanx>, <spanx style="verb">ChannelAlreadyExists</spanx>, or any other</c>
      <c><spanx style="verb">transaction-reverted</spanx></c>
</texttable>

<t>For <spanx style="verb">feePayer: false</spanx>, where the client broadcasts its own <spanx style="verb">open</spanx> /
<spanx style="verb">topUp</spanx>, the client determines the outcome by querying channel state
(Open/TopUp Verification, <xref target="tx-outcome"/>) rather than decoding the
revert, so it likewise does not depend on the escrow's internal error
encoding.</t>

<t>Example error response:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "type": "https://paymentauth.org/problems/session/invalid-signature",
  "title": "Invalid Signature",
  "status": 402,
  "detail": "Voucher signature could not be verified",
  "channelId": "0x6d0f4fdf..."
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="server-accounting"><name>Server-Side Accounting</name>

<t>Servers <bcp14>MUST</bcp14> maintain per-session accounting state:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">acceptedCumulative</spanx></c>
      <c>uint128</c>
      <c>Highest valid voucher amount accepted (monotonically increasing). Also referred to as <spanx style="verb">highestVoucherAmount</spanx> in the verification procedure</c>
      <c><spanx style="verb">spent</spanx></c>
      <c>uint128</c>
      <c>Cumulative amount charged for delivered service (monotonically increasing)</c>
      <c><spanx style="verb">settledOnChain</spanx></c>
      <c>uint128</c>
      <c>Last cumulative amount settled on-chain</c>
</texttable>

<t>Available balance: <spanx style="verb">available = acceptedCumulative - spent</spanx></t>

<section anchor="per-request-processing"><name>Per-Request Processing</name>

<t><list style="numbers" type="1">
  <t><strong>Voucher acceptance</strong>: Verify and persist new <spanx style="verb">acceptedCumulative</spanx></t>
  <t><strong>Balance check</strong>: If <spanx style="verb">available &lt; cost</spanx>, return 402</t>
  <t><strong>Charge and deliver</strong>: Persist <spanx style="verb">spent := spent + cost</spanx> BEFORE
delivering service</t>
  <t><strong>Receipt generation</strong>: Include balance state</t>
</list></t>

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

<t><list style="symbols">
  <t>Persist <spanx style="verb">spent</spanx> increments BEFORE delivering service</t>
  <t>Persist <spanx style="verb">acceptedCumulative</spanx> BEFORE relying on new balance</t>
  <t>Use transactional storage or write-ahead logging</t>
</list></t>

</section>
<section anchor="insufficient-balance-during-streaming"><name>Insufficient Balance During Streaming</name>

<t>When balance is exhausted during a streaming response:</t>

<t><list style="numbers" type="1">
  <t>Server <bcp14>MUST</bcp14> stop delivering additional metered content</t>
  <t>Server <bcp14>MUST</bcp14> emit a <spanx style="verb">payment-need-voucher</spanx> <xref target="SSE"/> event:</t>
</list></t>

<figure><artwork><![CDATA[
event: payment-need-voucher
data: {"channelId":"0x6d0f...",
  "requiredCumulative":"250025",
  "acceptedCumulative":"250000",
  "deposit":"500000"}
]]></artwork></figure>

<t>The <spanx style="verb">payment-need-voucher</spanx> event data:</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">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel identifier</c>
      <c><spanx style="verb">requiredCumulative</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Minimum next voucher amount</c>
      <c><spanx style="verb">acceptedCumulative</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Current highest accepted</c>
      <c><spanx style="verb">deposit</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Current on-chain deposit</c>
</texttable>

<t>When <spanx style="verb">requiredCumulative &gt; deposit</spanx>, the client <bcp14>MUST</bcp14> submit a
<spanx style="verb">topUp</spanx> before sending a new voucher.</t>

<t>Note: The SSE event types <spanx style="verb">payment-need-voucher</spanx> and
<spanx style="verb">payment-receipt</spanx> are defined by this specification. They are
not registered in any external event type registry.</t>

</section>
<section anchor="request-idempotency"><name>Request Idempotency</name>

<t>To prevent double-charging on retries:</t>

<t><list style="symbols">
  <t>Clients <bcp14>SHOULD</bcp14> include an <spanx style="verb">Idempotency-Key</spanx> header on paid requests</t>
  <t>Servers <bcp14>SHOULD</bcp14> track <spanx style="verb">(challengeId, idempotencyKey)</spanx> pairs and return
cached responses for duplicates</t>
  <t>Servers <bcp14>MUST NOT</bcp14> increment <spanx style="verb">spent</spanx> for duplicate idempotent requests</t>
</list></t>

</section>
<section anchor="cost-calculation"><name>Cost Calculation</name>

<t>Servers <bcp14>MUST</bcp14> support at least one of:</t>

<t><list style="symbols">
  <t><strong>Fixed cost</strong>: A predetermined amount per request</t>
  <t><strong>Usage-based</strong>: Proportional to resource consumption (e.g., tokens
generated, bytes transferred)</t>
</list></t>

<t>For streaming responses (SSE), servers <bcp14>SHOULD</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Reserve an estimated cost before starting delivery</t>
  <t>Adjust <spanx style="verb">spent</spanx> as actual consumption is measured</t>
  <t>Pause delivery if <spanx style="verb">available</spanx> is exhausted</t>
</list></t>

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

<section anchor="settlement-timing"><name>Settlement Timing</name>

<t>Servers <bcp14>MAY</bcp14> settle at any time:</t>

<t><list style="symbols">
  <t>Periodically (every N seconds or M base units)</t>
  <t>When <spanx style="verb">action="close"</spanx> is received</t>
  <t>When unsettled amount exceeds a threshold</t>
  <t>Based on gas cost optimization</t>
</list></t>

<t>For every server-submitted <spanx style="verb">settle()</spanx> or <spanx style="verb">close()</spanx>, the server <bcp14>MUST</bcp14>
check <spanx style="verb">receipt.status</spanx> per <xref target="tx-outcome"/> and treat a reverted <spanx style="verb">0x0</spanx>
as a definitive failure to settle (surface a typed error and retry as
appropriate), never as a pending result to be polled to timeout.</t>

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

<t>When the client sends <spanx style="verb">action="close"</spanx>:</t>

<t><list style="numbers" type="1">
  <t>Server <bcp14>MUST</bcp14> verify <spanx style="verb">cumulativeAmount &gt;= spent</spanx> (the client's
final voucher covers all delivered service). If the client's
voucher is insufficient, the server <bcp14>SHOULD</bcp14> settle using the
highest previously accepted voucher instead of the close voucher</t>
  <t>Server calls <spanx style="verb">close(channelId, cumulativeAmount, signature)</spanx></t>
  <t>Server <bcp14>MUST</bcp14> check the resulting <spanx style="verb">receipt.status</spanx> per <xref target="tx-outcome"/>.
On a reverted <spanx style="verb">0x0</spanx>, the server <bcp14>MUST NOT</bcp14> report the channel as
closed or block the client on a spinner; it <bcp14>MUST</bcp14> surface a typed
error and <bcp14>MAY</bcp14> retry (e.g. re-submit with the highest accepted
voucher, or after diagnosing the revert reason)</t>
  <t>On <spanx style="verb">status == 0x1</spanx>, the contract has settled the delta and refunded
the remainder to the payer; the server returns a receipt with the
transaction hash</t>
</list></t>

</section>
<section anchor="forced-close"><name>Forced Close</name>

<t>If the server does not respond:</t>

<t><list style="numbers" type="1">
  <t>Client calls <spanx style="verb">requestClose(channelId)</spanx> on-chain</t>
  <t>Grace period begins (defined by the contract's
<spanx style="verb">CLOSE_GRACE_PERIOD</spanx> constant; the reference value is
15 minutes. Compliant implementations <bcp14>MUST NOT</bcp14> use a
grace period shorter than 10 minutes to ensure the server
has reasonable time to settle outstanding vouchers.
Servers <bcp14>MUST</bcp14> verify the contract's grace period meets
this minimum before accepting channels on that contract)</t>
  <t>Server can still <spanx style="verb">settle()</spanx> or <spanx style="verb">close()</spanx> during grace period</t>
  <t>After grace period, client calls <spanx style="verb">withdraw(channelId)</spanx></t>
  <t>Client receives remaining (unsettled) funds</t>
</list></t>

</section>
<section anchor="sequential-sessions"><name>Sequential Sessions</name>

<t>A single channel supports sequential sessions. Each session uses the
same cumulative voucher counter. The channel's <spanx style="verb">highestVoucherAmount</spanx>
is the source of truth for the next voucher's minimum value.</t>

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

<t>Vouchers are submitted via HTTP requests to the <strong>same resource URI</strong>
that requires payment. There is no separate session endpoint. Clients
<bcp14>SHOULD</bcp14> use HTTP/2 multiplexing or maintain separate connections for
voucher updates and content streaming.</t>

<t>For voucher-only updates (no response body needed), clients <bcp14>MAY</bcp14> use
<spanx style="verb">HEAD</spanx> requests.</t>

</section>
<section anchor="receipt-generation"><name>Receipt Generation</name>

<t>Servers <bcp14>MUST</bcp14> return a <spanx style="verb">Payment-Receipt</spanx> header on <strong>every successful
paid request</strong>. For streaming responses (SSE), servers <bcp14>MUST</bcp14> include the
receipt in the initial response headers AND as a final SSE event:</t>

<figure><artwork><![CDATA[
event: payment-receipt
data: {"method":"evm","intent":"session","status":"success",...}
]]></artwork></figure>

<t>For chunked responses, the final receipt <bcp14>MAY</bcp14> be delivered as an HTTP
trailer if the client advertises <spanx style="verb">TE: trailers</spanx>.</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">"evm"</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">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><xref target="RFC3339"/> response time</c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Stable session reference; equal to <spanx style="verb">channelId</spanx></c>
      <c><spanx style="verb">challengeId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Challenge identifier</c>
      <c><spanx style="verb">channelId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Channel identifier</c>
      <c><spanx style="verb">acceptedCumulative</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Highest voucher accepted</c>
      <c><spanx style="verb">spent</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Total amount charged</c>
      <c><spanx style="verb">chainId</spanx></c>
      <c>number</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>EVM chain ID where settlement occurs</c>
      <c><spanx style="verb">units</spanx></c>
      <c>number</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Units consumed this request</c>
      <c><spanx style="verb">txHash</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>On-chain transaction hash (present on settlement/close)</c>
      <c><spanx style="verb">confirmations</spanx></c>
      <c>number</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Block confirmations at receipt time</c>
</texttable>

<t>The <spanx style="verb">reference</spanx> field is the core spec's stable receipt reference and
<bcp14>MUST</bcp14> equal <spanx style="verb">channelId</spanx>. The <spanx style="verb">txHash</spanx> field is optional settlement
evidence because not every response involves an on-chain settlement;
voucher updates are off-chain. When present, <spanx style="verb">txHash</spanx> can also serve as
a method-specific settlement reference.</t>

<t><strong>Example receipt (per-request):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "evm",
  "intent": "session",
  "status": "success",
  "timestamp": "2026-04-01T12:08:30Z",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "0x6d0f4fdf...",
  "channelId": "0x6d0f4fdf...",
  "chainId": 196,
  "acceptedCumulative": "250000",
  "spent": "237500",
  "units": 500
}
]]></sourcecode></figure>

<t><strong>Example receipt (on close):</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "evm",
  "intent": "session",
  "status": "success",
  "timestamp": "2026-04-01T12:10:00Z",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "0x6d0f4fdf...",
  "channelId": "0x6d0f4fdf...",
  "chainId": 196,
  "acceptedCumulative": "250000",
  "spent": "250000",
  "txHash": "0x1a2b3c4d5e6f7890abcdef1234567890abcdef1234567890abcdef1234567890"
}
]]></sourcecode></figure>

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

<section anchor="replay-prevention"><name>Replay Prevention</name>

<t>Vouchers are bound to a specific channel and contract via:</t>

<t><list style="symbols">
  <t><spanx style="verb">channelId</spanx> in the voucher message</t>
  <t><spanx style="verb">verifyingContract</spanx> in EIP-712 domain</t>
  <t><spanx style="verb">chainId</spanx> in EIP-712 domain</t>
  <t>Cumulative amount semantics (can only increase)</t>
</list></t>

<t>EIP-3009 nonces prevent replay of deposit authorizations at the
contract level. Because the nonce is derived deterministically from
the channel parameters (see <xref target="front-running-protection"/>), each
unique <spanx style="verb">(payee, salt, authorizedSigner)</spanx> open or <spanx style="verb">(channelId,
additionalDeposit, topUpSalt)</spanx> top-up produces a distinct nonce and
the token contract rejects any reuse for the same <spanx style="verb">from</spanx>.</t>

</section>
<section anchor="channel-reuse"><name>Channel Re-Use / Cross-Epoch Replay</name>

<t><spanx style="verb">channelId</spanx> is derived from stable inputs only — <spanx style="verb">(payer, payee, token,
salt, authorizedSigner, address(this), chainId)</spanx> — with no epoch or
open-nonce. After a channel is closed, the same inputs (notably the same
<spanx style="verb">salt</spanx>) re-derive a byte-identical <spanx style="verb">channelId</spanx>, and because the EIP-712
domain and <spanx style="verb">Voucher</spanx> struct are unchanged, an old voucher's digest is
also byte-identical. If the contract permitted re-opening that
<spanx style="verb">channelId</spanx>, the payee could replay a stale high-water voucher against
the new deposit.</t>

<t>The escrow <bcp14>MUST</bcp14> prevent this by retaining finalized channel records
permanently (sticky <spanx style="verb">finalized</spanx> flag, no struct deletion) so the <spanx style="verb">open</spanx>
"already exists" check rejects every re-open of a used <spanx style="verb">channelId</spanx>. This
matches the Tempo reference design, which likewise carries a persistent
<spanx style="verb">finalized</spanx> flag and folds no epoch into <spanx style="verb">channelId</spanx>. Clients that want a
fresh channel after close <bcp14>MUST</bcp14> choose a new <spanx style="verb">salt</spanx>.</t>

</section>
<section anchor="cross-chain-replay"><name>Cross-Chain Replay</name>

<t>The EIP-712 domain separator includes <spanx style="verb">chainId</spanx>, making signatures
invalid on other chains.</t>

</section>
<section anchor="voucher-tampering"><name>Voucher Tampering</name>

<t>EIP-712 signatures bind all voucher fields. Any modification
invalidates the signature.</t>

</section>
<section anchor="rollback-prevention"><name>Rollback Prevention</name>

<t>Server <bcp14>MUST</bcp14> only accept strictly increasing <spanx style="verb">cumulativeAmount</spanx>, and the
escrow contract <bcp14>MUST</bcp14> enforce the same on-chain in <spanx style="verb">settle</spanx> (reverting
when <spanx style="verb">cumulativeAmount &lt;= channel.settled</spanx>). Old vouchers are
automatically superseded.</t>

</section>
<section anchor="overflow-protection"><name>Overflow Protection</name>

<t>Server <bcp14>MUST</bcp14> verify <spanx style="verb">cumulativeAmount &lt;= 2^128 - 1</spanx>. The escrow
contract enforces the same constraint.</t>

</section>
<section anchor="deposit-cap"><name>Deposit Cap</name>

<t>Server <bcp14>MUST</bcp14> verify <spanx style="verb">cumulativeAmount &lt;= channel.deposit</spanx>. The
escrow contract enforces this on-chain as well.</t>

</section>
<section anchor="dos-mitigation"><name>Denial of Service</name>

<t><list style="symbols">
  <t>Rate limit voucher submissions (<bcp14>SHOULD</bcp14> limit to 10/second/session)</t>
  <t>Enforce <spanx style="verb">minVoucherDelta</spanx> to prevent tiny increments</t>
  <t>Enforce minimum deposit thresholds</t>
  <t>Perform format validation before signature recovery</t>
  <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, servers <bcp14>SHOULD</bcp14> enforce minimum
deposit amounts to prevent gas griefing. A malicious client
could sign many small EIP-3009 authorizations, forcing the
server to spend gas on economically unprofitable
<spanx style="verb">openWithAuthorization</spanx> calls.</t>
</list></t>

</section>
<section anchor="signature-malleability"><name>Signature Malleability</name>

<t>ECDSA signatures have an inherent malleability: given a valid
65-byte signature containing components <spanx style="verb">(r, s, v)</spanx>, the value
<spanx style="verb">(r, secp256k1_order - s, 55 - v)</spanx> is also valid for the same
message. (Note: <spanx style="verb">55 - v</spanx> maps 27→28 and 28→27, which is the
correct v-flip for EIP-712 signatures where v ∈ {27, 28}.)
This could allow an attacker to submit a modified signature that
passes <spanx style="verb">ecrecover</spanx> but references a different transaction hash.</t>

<t>The escrow contract <bcp14>MUST</bcp14> enforce canonical (low-s) signatures to prevent
this. See the signature verification requirements in the Contract
Functions section.</t>

</section>
<section anchor="reentrancy"><name>Reentrancy</name>

<t>Functions that transfer tokens out — <spanx style="verb">settle</spanx>, <spanx style="verb">close</spanx>, <spanx style="verb">withdraw</spanx>, and
their relayed variants — <bcp14>MUST</bcp14> follow the checks-effects-interactions
pattern: all state changes (<spanx style="verb">channel.settled</spanx>, <spanx style="verb">channel.finalized</spanx>, and
the payee-relayed nonce used-set) <bcp14>MUST</bcp14> be committed before the external
token transfer. The core functions are additionally protected by their
<spanx style="verb">msg.sender</spanx> access checks (a re-entrant call from a malicious token
carries <spanx style="verb">msg.sender == token</spanx> and fails the payer/payee check), but
<spanx style="verb">settleWithAuthorization</spanx> and <spanx style="verb">closeWithAuthorization</spanx> are callable by
any relayer, so implementations <bcp14>MUST</bcp14> apply a reentrancy guard or rely
strictly on checks-effects-interactions for those paths. Restricting the
escrow to well-behaved tokens without transfer callbacks (e.g. USDC)
further reduces this surface.</t>

</section>
<section anchor="no-voucher-expiry"><name>No Voucher Expiry</name>

<t>Vouchers have no <spanx style="verb">validUntil</spanx> field. Channels have no
expiry — they are closed explicitly. Vouchers remain
valid until the channel closes. The close grace period
protects against clients disappearing.</t>

<t><strong>Operational guidance:</strong> Servers <bcp14>SHOULD</bcp14> settle and close channels that
have been inactive for extended periods (e.g., 30+ days).</t>

</section>
<section anchor="chain-reorganization"><name>Chain Reorganization</name>

<t>If a chain reorganization removes a confirmed <spanx style="verb">open()</spanx> or <spanx style="verb">topUp()</spanx>
transaction, the server loses its escrow guarantee. Mitigations:</t>

<t><list style="symbols">
  <t>Servers <bcp14>SHOULD</bcp14> use sufficient confirmation depth before accepting
open/topUp (e.g., 1 block for L2 rollups with fast finality,
12+ blocks for Ethereum mainnet)</t>
  <t>For L2 rollups, consider L1 settlement finality for high-value
channels</t>
  <t>Voucher-based payments are not affected (off-chain)</t>
  <t>Settlement transactions should use appropriate gas pricing</t>
</list></t>

</section>
<section anchor="front-running-protection"><name>Front-Running Protection</name>

<t>The escrow contract's <spanx style="verb">channelId</spanx> is deterministic. An attacker who
observes a pending <spanx style="verb">open()</spanx> transaction could front-run it. However,
the <spanx style="verb">channelId</spanx> includes the <spanx style="verb">payer</spanx> address (the <spanx style="verb">msg.sender</spanx> of
<spanx style="verb">open()</spanx>), so a front-runner calling <spanx style="verb">open()</spanx> with identical
parameters would produce a different <spanx style="verb">channelId</spanx> because their
address differs. The <spanx style="verb">salt</spanx> parameter (chosen by the client) provides
additional protection by making the <spanx style="verb">channelId</spanx> unpredictable before
the transaction appears in the mempool.</t>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the token-pull authorization
signature is visible in the pending <spanx style="verb">openWith…</spanx> transaction.
The same direct-call attack is mitigated at the
token-transfer layer by both supported authorization formats:</t>

<t><list style="symbols">
  <t><strong>EIP-3009</strong>: The escrow contract <bcp14>MUST</bcp14> use
<spanx style="verb">receiveWithAuthorization</spanx> (not <spanx style="verb">transferWithAuthorization</spanx>)
when calling the token. This enforces <spanx style="verb">msg.sender == to</spanx>,
so only the escrow contract can execute the transfer. The
<spanx style="verb">authorization.to</spanx> field <bcp14>MUST</bcp14> be the escrow contract address.</t>
  <t><strong>Permit2</strong>: The Permit2 contract fixes <spanx style="verb">spender = msg.sender</spanx>
inside <spanx style="verb">permitWitnessTransferFrom</spanx>, so only the caller of
<spanx style="verb">permitWitnessTransferFrom</spanx> (the escrow contract) can spend the
signature. The <spanx style="verb">transferDetails.to</spanx> is also constrained to
the escrow contract address. The channel parameters (<spanx style="verb">payee</spanx>,
<spanx style="verb">salt</spanx>, <spanx style="verb">authorizedSigner</spanx> for <spanx style="verb">open</spanx>; <spanx style="verb">channelId</spanx> for <spanx style="verb">topUp</spanx>)
are bound into the signature as a named EIP-712 witness, so an
attacker who substitutes any of those values when calling the
escrow causes the Permit2 signature verification to revert.</t>
</list></t>

<t>The two paths achieve channel-parameter integrity by different
mechanisms:</t>

<t><list style="symbols">
  <t>Permit2 signs <spanx style="verb">permitted.token</spanx>, <spanx style="verb">permitted.amount</spanx>, <spanx style="verb">spender</spanx>,
<spanx style="verb">nonce</spanx>, <spanx style="verb">deadline</spanx>, <strong>and</strong> the witness struct, which carries
the channel parameters explicitly. No nonce derivation is
required: any unused Permit2 nonce is acceptable, and clients
<bcp14>MAY</bcp14> use random or sequential nonces.</t>
  <t>EIP-3009 signs only <spanx style="verb">from</spanx>, <spanx style="verb">to</spanx>, <spanx style="verb">value</spanx>, <spanx style="verb">validAfter</spanx>,
<spanx style="verb">validBefore</spanx>, <spanx style="verb">nonce</spanx>. It has no witness mechanism, so the
channel parameters (<spanx style="verb">payee</spanx>, <spanx style="verb">salt</spanx>, <spanx style="verb">authorizedSigner</spanx> for
<spanx style="verb">open</spanx>; <spanx style="verb">channelId</spanx>, <spanx style="verb">topUpSalt</spanx> for <spanx style="verb">topUp</spanx>) are not covered
by the underlying signature. An attacker could front-run
<spanx style="verb">openWithAuthorization</spanx> with a different <spanx style="verb">payee</spanx> (their own
address), and the underlying transfer signature would remain
valid.</t>
</list></t>

<t>To close this gap on the EIP-3009 path, compliant escrow contracts
<bcp14>MUST</bcp14> derive the EIP-3009 nonce deterministically from the channel
parameters and <bcp14>MUST</bcp14> validate the caller-supplied <spanx style="verb">nonce</spanx> argument
against the derived value, reverting (e.g., with <spanx style="verb">NonceMismatch()</spanx>)
on any mismatch:</t>

<figure><artwork><![CDATA[
// openWithAuthorization (EIP-3009 nonce, bytes32)
nonce = keccak256(abi.encode(from, payee, token, salt, authorizedSigner))

// topUpWithAuthorization (EIP-3009 nonce, bytes32)
nonce = keccak256(abi.encode(channelId, additionalDeposit, from, topUpSalt))
]]></artwork></figure>

<t>The contract passes the validated nonce to <spanx style="verb">receiveWithAuthorization</spanx>.
If an attacker calls the escrow with a substituted <spanx style="verb">payee</spanx>, <spanx style="verb">salt</spanx>,
<spanx style="verb">authorizedSigner</spanx>, <spanx style="verb">channelId</spanx>, <spanx style="verb">additionalDeposit</spanx>, or <spanx style="verb">topUpSalt</spanx>,
the derived nonce differs from the one the payer signed; the contract
<bcp14>MUST</bcp14> reject the call before invoking the token, and even if it did not,
the underlying signature verification at the token contract would
revert.</t>

<t>The <spanx style="verb">nonce</spanx> is exposed as an explicit function parameter (rather than
derived silently) so that callers and indexers can observe the value
the payer signed; the on-chain check is what makes the binding
non-bypassable. Implementations <bcp14>MUST NOT</bcp14> skip this check, and <bcp14>MUST NOT</bcp14>
fall back to using the caller-supplied value unchanged.</t>

<t>Clients <bcp14>MUST</bcp14> use the same derivation formula when signing the
EIP-3009 authorization and <bcp14>MUST</bcp14> transmit the derived nonce in the
credential. Including <spanx style="verb">from</spanx> ensures the nonce is bound to the
depositor identity, even though the underlying signature already
covers <spanx style="verb">from</spanx> directly.</t>

<t>Trade-off note: The deterministic-nonce approach for EIP-3009
trades signing-time UX (the nonce appears as an opaque hash in
wallet displays) for protocol simplicity. The Permit2 witness
approach trades a slightly longer EIP-712 type string for
intent-visible UX — wallets that render typed data show
<spanx style="verb">payee</spanx>, <spanx style="verb">salt</spanx>, and <spanx style="verb">authorizedSigner</spanx> as labeled fields the
user can review.</t>

</section>
<section anchor="erc-20-approval-front-running"><name>ERC-20 Approval Front-Running</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx>, the client calls
<spanx style="verb">approve(escrow, deposit)</spanx> followed by <spanx style="verb">open()</spanx>. The classic
ERC-20 approval front-running attack (where a spender
races to spend both the old and new allowance) does not
apply here because the escrow contract is trusted code
with deterministic behavior. However, clients <bcp14>SHOULD</bcp14>
batch <spanx style="verb">approve</spanx> and <spanx style="verb">open</spanx> in a single transaction when
possible (e.g., via ERC-4337 UserOperations or
multicall) to minimize the window between approval and
channel creation.</t>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx> and <spanx style="verb">type="permit2"</spanx>,
the payer must have previously approved the canonical Permit2
contract for the token (typically a one-time, unlimited
approval). The same reasoning applies: Permit2 is trusted code
with deterministic behavior, and each Permit2 <spanx style="verb">SignatureTransfer</spanx> is
gated by a single-use unordered nonce.</t>

</section>
<section anchor="contract-wallet-signer-mutability"><name>Contract Wallet Signer Mutability</name>

<t>When <spanx style="verb">authorizedSigner</spanx> is an ERC-1271 contract wallet (e.g., Safe,
ERC-4337 account), voucher validity depends on the wallet's current
signer state at verification time, not at signing time. If the wallet's
owner set, signing key, or signature-validation policy changes after a
voucher is signed, <spanx style="verb">isValidSignature</spanx> <bcp14>MAY</bcp14> return failure for
previously-signed vouchers, rendering them unredeemable on-chain.</t>

<t>This creates an asymmetric risk:</t>

<t><list style="symbols">
  <t><strong>Payee risk</strong>: If the payer rotates keys on their contract wallet
after signing vouchers but before the payee calls <spanx style="verb">settle()</spanx>, the
payee loses the ability to redeem accumulated off-chain authorizations.</t>
  <t><strong>Payer mitigation</strong>: Payers using contract wallets as
<spanx style="verb">authorizedSigner</spanx> <bcp14>SHOULD</bcp14> avoid key rotation during active sessions,
or coordinate rotation with settlement.</t>
  <t><strong>Payee mitigation</strong>: Payees <bcp14>SHOULD</bcp14> settle more frequently when the
<spanx style="verb">authorizedSigner</spanx> is a contract wallet, reducing the value at risk
from signer-state changes. Payees <bcp14>MAY</bcp14> inspect the signer address to
determine whether it is a contract (via <spanx style="verb">EXTCODESIZE</spanx>) and adjust
settlement cadence accordingly.</t>
</list></t>

<t>EOA signers are not affected: ECDSA recovery is stateless and depends
only on the signature and message.</t>

<t><strong>Recommended pattern</strong>: When the payer is a contract wallet, the payer
<bcp14>SHOULD</bcp14> delegate voucher signing to an ephemeral EOA session key by
setting <spanx style="verb">authorizedSigner</spanx> to that EOA's address, rather than leaving
<spanx style="verb">authorizedSigner</spanx> unset (which defaults to the payer contract wallet).
This preserves the AA benefits for the escrowed funds — the contract
wallet still controls <spanx style="verb">open()</spanx>, <spanx style="verb">topUp()</spanx>, and <spanx style="verb">close()</spanx> calls — while
eliminating the signer-mutability risk for off-chain vouchers. The
session key <bcp14>SHOULD</bcp14> be scoped to the lifetime of the channel and
discarded after <spanx style="verb">close()</spanx>.</t>

<t>Contract-wallet <spanx style="verb">authorizedSigner</spanx> remains permitted for cases where
EOA delegation is not acceptable (e.g., enterprise multi-sig policies
that require every signed artifact to carry a quorum signature). In
such cases, the mitigations above apply.</t>

</section>
<section anchor="escrow-guarantees"><name>Escrow Guarantees</name>

<t>The escrow contract provides the following security properties:</t>

<t><list style="symbols">
  <t><strong>Payer protection</strong>: Funds can only be withdrawn with a valid voucher
signature. Forced close + grace period ensures payer
can always recover uncommitted funds.</t>
  <t><strong>Payee protection</strong>: A valid voucher is an irrevocable on-chain
claim. The payee can call <spanx style="verb">settle()</spanx> at any time.</t>
  <t><strong>Atomicity</strong>: <spanx style="verb">close()</spanx> settles and refunds in a single transaction.</t>
</list></t>

</section>
<section anchor="disconnection-handling"><name>Disconnection Handling</name>

<texttable>
      <ttcol align='left'>Scenario</ttcol>
      <ttcol align='left'>Handling</ttcol>
      <c>Client disappears</c>
      <c>Server holds last voucher, can <spanx style="verb">settle()</spanx> unilaterally</c>
      <c>Server crashes</c>
      <c>Server persists vouchers, can <spanx style="verb">settle()</spanx> on restart</c>
      <c>Session idle timeout</c>
      <c>Server settles and closes after configured threshold</c>
</texttable>

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

<section anchor="payment-method-registration"><name>Payment Method Registration</name>

<t>The <spanx style="verb">evm</spanx> payment method is registered by <xref target="I-D.evm-charge"/>.
This document does not create a separate registration.</t>

</section>
<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">evm</spanx> payment method implements the
registered <spanx style="verb">session</spanx> intent.</t>

</section>
<section anchor="problem-type-registration"><name>Problem Type Registration</name>

<t>This document registers the following problem types:</t>

<texttable>
      <ttcol align='left'>Type URI</ttcol>
      <ttcol align='left'>Title</ttcol>
      <ttcol align='left'>Status</ttcol>
      <c><spanx style="verb">.../session/invalid-signature</spanx></c>
      <c>Invalid Signature</c>
      <c>402</c>
      <c><spanx style="verb">.../session/signer-mismatch</spanx></c>
      <c>Signer Mismatch</c>
      <c>402</c>
      <c><spanx style="verb">.../session/amount-exceeds-deposit</spanx></c>
      <c>Amount Exceeds Deposit</c>
      <c>402</c>
      <c><spanx style="verb">.../session/delta-too-small</spanx></c>
      <c>Delta Too Small</c>
      <c>402</c>
      <c><spanx style="verb">.../session/channel-not-found</spanx></c>
      <c>Channel Not Found</c>
      <c>410</c>
      <c><spanx style="verb">.../session/channel-finalized</spanx></c>
      <c>Channel Finalized</c>
      <c>410</c>
      <c><spanx style="verb">.../session/challenge-not-found</spanx></c>
      <c>Challenge Not Found</c>
      <c>402</c>
      <c><spanx style="verb">.../session/insufficient-balance</spanx></c>
      <c>Insufficient Balance</c>
      <c>402</c>
      <c><spanx style="verb">.../session/transaction-reverted</spanx></c>
      <c>Transaction Reverted</c>
      <c>409</c>
</texttable>

<t>Base URI: <spanx style="verb">https://paymentauth.org/problems</spanx></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;
&RFC9110;
&RFC9111;
&RFC9457;
<reference anchor="EIP-712" target="https://eips.ethereum.org/EIPS/eip-712">
  <front>
    <title>Typed structured data hashing and signing</title>
    <author initials="R." surname="Bloemen" fullname="Remco Bloemen">
      <organization></organization>
    </author>
    <author initials="L." surname="Logvinov" fullname="Leonid Logvinov">
      <organization></organization>
    </author>
    <author initials="J." surname="Evans" fullname="Jacob Evans">
      <organization></organization>
    </author>
    <date year="2017" month="September"/>
  </front>
</reference>
<reference anchor="EIP-3009" target="https://eips.ethereum.org/EIPS/eip-3009">
  <front>
    <title>Transfer With Authorization</title>
    <author initials="P. J." surname="Kim" fullname="Peter Jihoon Kim">
      <organization></organization>
    </author>
    <author initials="K." surname="Britz" fullname="Kevin Britz">
      <organization></organization>
    </author>
    <author initials="D." surname="Knott" fullname="David Knott">
      <organization></organization>
    </author>
    <date year="2020" month="September"/>
  </front>
</reference>
<reference anchor="Permit2" target="https://github.com/Uniswap/permit2">
  <front>
    <title>Permit2: Token Approvals for the Next Generation of DeFi</title>
    <author >
      <organization>Uniswap Labs</organization>
    </author>
    <date year="2022" month="December"/>
  </front>
</reference>
<reference anchor="I-D.evm-charge" target="https://datatracker.ietf.org/doc/draft-evm-charge/">
  <front>
    <title>EVM Charge Intent for HTTP Payment Authentication</title>
    <author initials="M." surname="Wong" fullname="Michael Wong">
      <organization></organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="I-D.httpauth-payment" target="https://datatracker.ietf.org/doc/draft-ietf-httpauth-payment/">
  <front>
    <title>The 'Payment' HTTP Authentication Scheme</title>
    <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="EIP-55" target="https://eips.ethereum.org/EIPS/eip-55">
  <front>
    <title>Mixed-case checksum address encoding</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="EIP-2098" target="https://eips.ethereum.org/EIPS/eip-2098">
  <front>
    <title>Compact Signature Representation</title>
    <author initials="R." surname="Moore" fullname="Richard Moore">
      <organization></organization>
    </author>
    <author initials="N." surname="Johnson" fullname="Nick Johnson">
      <organization></organization>
    </author>
    <date year="2019" month="March"/>
  </front>
</reference>
<reference anchor="ERC-20" target="https://eips.ethereum.org/EIPS/eip-20">
  <front>
    <title>Token Standard</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="ERC-4337" target="https://eips.ethereum.org/EIPS/eip-4337">
  <front>
    <title>Account Abstraction Using Alt Mempool</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="DID-PKH" target="https://github.com/w3c-ccg/did-pkh/blob/main/did-pkh-method-draft.md">
  <front>
    <title>did:pkh Method Specification</title>
    <author >
      <organization>W3C Credentials Community Group</organization>
    </author>
    <date year="2022"/>
  </front>
</reference>
<reference anchor="I-D.tempo-session" target="https://datatracker.ietf.org/doc/draft-tempo-session/">
  <front>
    <title>Tempo Session Intent for HTTP Payment Authentication</title>
    <author initials="L." surname="Horne" fullname="Liam Horne">
      <organization></organization>
    </author>
    <author initials="G." surname="Konstantopoulos" fullname="Georgios Konstantopoulos">
      <organization></organization>
    </author>
    <author initials="D." surname="Robinson" fullname="Dan Robinson">
      <organization></organization>
    </author>
    <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"/>
  </front>
</reference>
<reference anchor="SSE" target="https://html.spec.whatwg.org/multipage/server-sent-events.html">
  <front>
    <title>Server-Sent Events</title>
    <author >
      <organization>WHATWG</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 2521?>

<section anchor="scenario-walkthroughs"><name>Scenario Walkthroughs</name>

<section anchor="llm-token-billing-escrow-high-frequency-voucher"><name>LLM Token Billing (Escrow + High-Frequency Voucher)</name>

<t>Agent A calls Provider P's LLM inference API, per-token billing on X Layer with USDC.</t>

<t>Parameters:</t>

<t><list style="symbols">
  <t>Unit price: 100 base units per token = 0.0001 USDC (6 decimals)</t>
  <t>Suggested deposit: 5,000,000 = 5.0 USDC (~50,000 tokens)</t>
  <t>minVoucherDelta: 10,000 = 0.01 USDC (100 tokens per voucher)</t>
</list></t>

<figure><artwork><![CDATA[
Client                  Server               X Layer
  |                        |                      |
  | POST /v1/chat          |                      |
  |----------------------->|                      |
  |                        |                      |
  | 402 + WWW-Authenticate |                      |
  | method="evm"           |                      |
  | intent="session"       |                      |
  |<-----------------------|                      |
  |                        |                      |
  | approve(escrow, 5M)    |                      |
  |---------------------------------------------->|
  | open(payee, USDC,      |                      |
  |   5000000, salt, A)    |                      |
  |---------------------------------------------->|
  | txHash=0xabc...        |                      |
  |<----------------------------------------------|
  |                        |                      |
  | Credential:            |                      |
  | action="open"          |                      |
  | type="hash"            |                      |
  | hash="0xabc..."        |                      |
  |----------------------->|                      |
  |                        | verify deposit       |
  | Receipt: channelId     |                      |
  |<-----------------------|                      |
  |                        |                      |
  | POST /v1/chat (800 tk) |                      |
  | voucher: cum=80000     |                      |
  |----------------------->|                      |
  | 200 + response +       |                      |
  | Receipt{spent:80000}   |                      |
  |<-----------------------|                      |
  |                        |                      |
  | ... repeat ...         |                      |
  | cumulative = 3750000   |                      |
  |                        |                      |
  | 402 + Need-Voucher     |                      |
  | required: 3750100      |                      |
  |<-----------------------|                      |
  |                        |                      |
  | action="close"         |                      |
  | cum=3750100            |                      |
  |----------------------->|                      |
  |                        | close(ch, 3750100)   |
  |                        |--------------------->|
  |                        | Provider: 3.7501 USDC|
  |                        | Agent: 1.2499 USDC   |
  | Receipt{closed, ref}   |                      |
  |<-----------------------|                      |
]]></artwork></figure>

<t>Key numbers:</t>

<t><list style="symbols">
  <t>Total consumed: 3,750,100 base units = 3.7501 USDC</t>
  <t>Refunded: 5,000,000 - 3,750,100 = 1,249,900 = 1.2499 USDC</t>
  <t>On-chain transactions: only 2 (open + close), all intermediate
vouchers are off-chain</t>
</list></t>

</section>
<section anchor="llm-token-billing-deposit-merge-mode"><name>LLM Token Billing (Deposit Merge Mode)</name>

<t>Same setup as Scenario 1, but using feePayer: true + deposit merge
mode. Consumer pays zero gas.</t>

<figure><artwork><![CDATA[
Client                  Server               X Layer
  |                        |                      |
  | POST /v1/chat          |                      |
  |----------------------->|                      |
  | 402 + WWW-Authenticate |                      |
  | feePayer=true           |                      |
  | credentialTypes=       |                      |
  | ["permit2",            |                      |
  |  "authorization",      |                      |
  |  "hash"]               |                      |
  |<-----------------------|                      |
  |                        |                      |
  | Sign EIP-3009 (5 USDC) |                      |
  | Sign voucher (cum=0)   |                      |
  | Credential:            |                      |
  | action="open"          |                      |
  | type="authorization"   |                      |
  |----------------------->|                      |
  |                        | openWithAuthz(...)   |
  |                        |--------------------->|
  | Receipt: channelId     |                      |
  |<-----------------------|                      |
  |                        |                      |
  | ... normal usage ...   |                      |
  | approaching deposit    |                      |
  | limit                  |                      |
  |                        |                      |
  | Sign EIP-3009 (+5 USDC)|                      |
  | Sign voucher           |                      |
  | action="voucher"       |                      |
  | cum=4800000            |                      |
  | deposit={action:"topUp"|                      |
  |   type:"authorization" |                      |
  |   authorization:{...}} |                      |
  |----------------------->|                      |
  |                        | topUpWithAuthz(...)  |
  |                        |--------------------->|
  | 200 + Receipt          |                      |
  |<-----------------------|                      |
  |                        |                      |
  | Consumer pays zero gas |                      |
  | throughout session     |                      |
]]></artwork></figure>

<t>Key advantages:</t>

<t><list style="symbols">
  <t>Consumer needs no native token for gas</t>
  <t>Voucher + deposit merged into single HTTP round-trip</t>
  <t>Server batches on-chain operations for gas optimization</t>
</list></t>

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

<t>The authors thank the Tempo Labs team for the foundational session
payment channel design and the MPP community for their feedback.</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

