<?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="noModificationTrust200902" 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="23"/>

    
    
    

    <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-ryan-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:
H4sIAAAAAAAAA+y923bbSJYmfI+niJYvklSRtM625XLOr5TkTFX51JKcWVU9
/SdBEpTQJgkWAEpW2erVV3O4nTUPMFfzIP+j1JP8+xgHAKQlZzo7q7u8VlVS
JBAIROzY5/3tbrcblWk5SfbN8fcvzVlSFGk2MyezMpmVZpzl5rvz8zfmTXwz
xS8OFuUl/DcdxiVcFsWDQZ5cBbdGo2w4i6cw3iiPx2U3uZp2C/6pu7ERXSU5
ftw38BkGSS6y/GbfpLNxFqXzfN/MspfZKB3LA87zRVFubWw82diKisVgmtI4
5c0chj85Pn8eDbNZkcyKRbFvynyRRFEME8zy/ciYruFp/CGdmfM0nsFXBh4E
V/6h575IpnE62Tfv01mvhO/+n+zdRW+YTem3LL/YN69//6032HFcwOr8EM8u
3HDHPfeFDHcNf98sYNBPjfcyHV7GycT8kPkjvuy5L2TEKV/Yu4bvPzXoQZzD
JP90mS3ckAc994UMebHIJvDKF72/wA/NY0azLJ/CTlwluKKnzw+3NjefyMft
7W39uLO381g+Pt58tKMft3b1gsePHu/Kxyebmxvu46Z+3Nl9hB+PT950H21u
7dM0hC7XzmG/R6aADR6Wixw+juIyNpdxcZnOLkw8g9/Sixl8XuPb4vwiKffN
ZVnOi/2HD5N0XvQSoNs8WUx78G4P4Sln+DU+im5xVIP/dB1Pk+kwM99MsgRo
v/LbiySbpSPzIru4SmfZVeXX38XDbGCOr+JZQb/AhOHbrY3NR92NJ/Ka20DW
lffM4fpxkpsf0vKSjlqWp3+hg3DvN8PRV7zam6SE5/wuvcyAUn6fTis//z6B
tzLf5Gn5l8ovR/EVvPbvZ1lZBm+2tcFv9ibJp2lZ2UD90pxn75KZOZjP8+wq
nhTEX2D65lXyvjTfJrMkp7c12dgcJc/T5re+gNVZDJBYH76dpcV1PH845wc0
vjARs1xoXsSDcEe2trpEAyfdox6yKjhl8LRw+sjdDun7O/LF5nkj1ZZ5PHyX
5L00Kce0YcAtHzpGyU9/uGLjagzDvsievAU+Du/tznluFRqD1f5KZv0Vv0M4
d3M2vAR6/6xXyG/iWbf6/FVv87v4XWJeZu+Tm8q7dDc25XVklG5KK6+iJHyp
+0mtz3q15mmserdv8mQ2imfm9CauMo/Ka7sfzrOpeZnEF3CiawuyF0UoJj1+
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
s8B7NccLJKNYoKyBeudcGRjwnL7cd6gjtkC3BkJjcw8zwIANgsBE3jjJLtLh
PrvD7Qxgw98lw2H8DuRGCwy+His9LXIzESl07MeEP3IyGn0s4knZ8UqxHKnJ
t0xsLTQj2vwVVSP1iCGno6jdZl/UqwxLyaqLY31s/WCgvmm51bDsPJJr2Kbv
B88B5SV5P5+kwxTZ7ACT7WRJPTs7jlyOqooIIO9JJtms6B7D4aScgVeelX/L
dGDHNFWSiwZlkoEJxbl5TECg5GpoXbetiFp9Pzhlg2iogukPUtLeBwtB2Y+Y
a1FlYiR7xnk2Ba6XX3C+OK2fHN0sb7Pi7CaUR2SfsOePR/CqLUKm/CIdJ8Ob
IZaGHarwRfGD6hmseQomEeoyVF+TJ6SA0NuihJz4uyKHj+nzN8s9pHf695to
hQv08LuDV6+OX5jXb45frfKS0hASNbK6AUtE68swmKhcimKgkubkSIf46e+x
0pNr3cHL/l19wZU8Oz47OwEF9M3BH18evzo/+9RK2rUMC0PUM4iW7FWKp13K
rxqHEDE5BfslKBNhwdNq40EeTuJ0KuLWH+KX3ozq82p/V66/Wj38ys38TcPz
6vPHRTx8DXR/enB+8v2xOXzx+uyY526CqMHz16eHx0fe73YTZANw1UVgUqKk
3O9qn/gCEcmHJKN5E1nnRIHs5Uro/VuIZQOK6QU5O3mH60TQtPb8v+3K81XB
4Dn+5PWrP3PVv59KD9V/X/IwW6ZIW3606qX8IZ7TIRulaIwMUH9xjNHqXA1D
/PT3IK3hwQNrDOJMhur+VvHdtSL11rfVQLDlY6Qv8m1O0lKqKsz6+hSdfCAS
sRY0TzSshcrdTdSQ2E/amzXTuXIKTJj19WwuAZdTkfAPzbdxMQH1BB2DuVhy
wPHG6QQf0/rwQXSBrnyJ+iKHVaolzOiujLIpTRtNjAnWXb0MJk6uddIVUGdg
3oifymz+do4f6ODiB/+A4t96YPoRTHTZO5j6OzS/Ac2DcsVwK9CXRnUbkm7V
UXXDJRliLf9y5YemX/+l6RmiHzU9oq5EoWbqBtdvZdiky6ldpTd79GSwuRJk
OS17Id6AxleijWh4JSJXLKOY+282j8tLjsqC4p3kMzKqClbfKOtFg3n7dpEj
LPlXtYUpikql+lIcWX+2Ifc3FYC00QkOWxnJmgBxXbFT6MZ6F2xVEMX9OIXe
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
5WW4AQA=

-->

</rfc>

