<?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.38 (Ruby 3.2.11) -->


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

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


<rfc ipr="trust200902" docName="draft-hedera-charge-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Hedera Charge">Hedera Charge Intent for HTTP Payment Authentication</title>

    <author initials="T." surname="Rowbotham" fullname="Tom Rowbotham">
      <organization></organization>
      <address>
        <email>tom@xeno.money</email>
      </address>
    </author>
    <author initials="L." surname="Walker" fullname="Lindsay Walker">
      <organization>Hedera / Hashgraph</organization>
      <address>
        <email>lindsay.w@swirldslabs.com</email>
      </address>
    </author>

    <date year="2026" month="May" day="20"/>

    
    
    

    <abstract>


<?line 83?>

<t>This document defines the "charge" intent for the "hedera"
payment method within the Payment HTTP Authentication Scheme
<xref target="I-D.httpauth-payment"/>. The client constructs and signs a
native Hedera Token Service (HTS) transfer; the server
verifies the payment via the Mirror Node REST API and
presents the transaction ID as proof of payment.</t>

<t>Two credential types are supported: <spanx style="verb">type="hash"</spanx> (default),
where the client broadcasts the transaction itself and
presents the transaction ID for server verification, and
<spanx style="verb">type="transaction"</spanx> (pull mode), where the client signs and
serializes the transaction for the server to broadcast.</t>



    </abstract>



  </front>

  <middle>


<?line 98?>

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

<t>HTTP Payment Authentication <xref target="I-D.httpauth-payment"/> defines
a challenge-response mechanism that gates access to resources
behind payments. This document registers the "charge" intent
for the "hedera" payment method.</t>

<t>Hedera is a distributed ledger with asynchronous Byzantine
Fault Tolerant (aBFT) consensus, deterministic finality in
3-5 seconds, and fixed transaction fees <xref target="HEDERA-DOCS"/>.
This specification supports payments in Hedera Token Service
(HTS) tokens, including Circle USDC
<xref target="CIRCLE-USDC-HEDERA"/>, making it suitable for micropayment
use cases where fast confirmation and predictable costs are
important.</t>

<t>Challenge binding and replay protection are achieved through
an Attribution memo embedded in the transaction's native
memo field (see <xref target="attribution-memo"/>).</t>

<section anchor="push-mode"><name>Push Mode (Default)</name>

<t>The default flow, called "push mode", uses <spanx style="verb">type="hash"</spanx>
credentials. The client "pushes" the transaction to the
Hedera network itself and presents the confirmed
transaction ID:</t>

<figure><artwork><![CDATA[
 Client                Server         Hedera Network
    |                     |                   |
    | (1) GET /resource   |                   |
    |-------------------> |                   |
    |                     |                   |
    | (2) 402 Payment     |                   |
    |     Required        |                   |
    |     (recipient,     |                   |
    |      amount, memo)  |                   |
    |<------------------- |                   |
    |                     |                   |
    | (3) Build tx with   |                   |
    |     Attribution     |                   |
    |     memo, sign      |                   |
    |                     |                   |
    | (4) Execute tx      |                   |
    |--------------------------------------> |
    | (5) Receipt         |                   |
    |<-------------------------------------- |
    |                     |                   |
    | (6) Authorization:  |                   |
    |     Payment         |                   |
    |     <credential>    |                   |
    |     (transaction ID)|                   |
    |-------------------> |                   |
    |                     | (7) Mirror Node   |
    |                     |     GET /api/v1/  |
    |                     |     transactions/ |
    |                     |     {txId}        |
    |                     |-----------------> |
    |                     | (8) Tx data       |
    |                     |<----------------- |
    |                     |                   |
    | (9) 200 OK +Receipt |                   |
    |<------------------- |                   |
    |                     |                   |
]]></artwork></figure>

<t>This flow is useful when the client has its own Hedera
account and operator key. The server verifies the payment
by querying the Mirror Node REST API <xref target="MIRROR-NODE"/>.</t>

</section>
<section anchor="pull-mode"><name>Pull Mode</name>

<t>The pull mode flow uses <spanx style="verb">type="transaction"</spanx> credentials.
The client signs the transaction and the server "pulls" it
for broadcast to the Hedera network:</t>

<figure><artwork><![CDATA[
 Client                Server         Hedera Network
    |                     |                   |
    | (1) GET /resource   |                   |
    |-------------------> |                   |
    |                     |                   |
    | (2) 402 Payment     |                   |
    |     Required        |                   |
    |     (recipient,     |                   |
    |      amount)        |                   |
    |<------------------- |                   |
    |                     |                   |
    | (3) Build tx with   |                   |
    |     Attribution     |                   |
    |     memo, freeze,   |                   |
    |     sign            |                   |
    |                     |                   |
    | (4) Authorization:  |                   |
    |     Payment         |                   |
    |     <credential>    |                   |
    |     (serialized tx) |                   |
    |-------------------> |                   |
    |                     | (5) Verify memo,  |
    |                     |     execute tx    |
    |                     |-----------------> |
    |                     | (6) Receipt       |
    |                     |<----------------- |
    |                     |                   |
    | (7) 200 OK +Receipt |                   |
    |<------------------- |                   |
    |                     |                   |
]]></artwork></figure>

<t>In this model the server controls transaction broadcast,
enabling server-side retry logic and future fee delegation
(see <xref target="fee-delegation"/>).</t>

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

<t>This document inherits the shared request semantics of the
"charge" intent from <xref target="I-D.payment-intent-charge"/>. It
defines only the Hedera-specific <spanx style="verb">methodDetails</spanx>, <spanx style="verb">payload</spanx>,
and verification procedures for the "hedera" payment method.</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>Transaction ID</dt>
  <dd>
    <t>A unique identifier for a Hedera transaction in the
format <spanx style="verb">shard.realm.num@seconds.nanoseconds</spanx> (e.g.,
<spanx style="verb">0.0.12345@1681234567.123456789</spanx>). Composed of the
payer account ID and the transaction's valid-start
timestamp.</t>
  </dd>
  <dt>Account ID</dt>
  <dd>
    <t>A Hedera account identifier in the format
<spanx style="verb">shard.realm.num</spanx> (e.g., <spanx style="verb">0.0.12345</spanx>). The shard and
realm are typically <spanx style="verb">0.0</spanx> on the public Hedera network.</t>
  </dd>
  <dt>Token ID</dt>
  <dd>
    <t>A Hedera Token Service (HTS) token identifier in the
format <spanx style="verb">shard.realm.num</spanx> (e.g., <spanx style="verb">0.0.456858</spanx> for Circle
USDC on mainnet). Uniquely identifies a fungible or
non-fungible token on the Hedera network.</t>
  </dd>
  <dt>Token Association</dt>
  <dd>
    <t>A one-time operation that associates a Hedera account
with an HTS token, enabling the account to hold and
receive that token. Unlike Solana's Associated Token
Accounts, token association is a single on-chain
operation that does not create a separate account.</t>
  </dd>
  <dt>Base Units</dt>
  <dd>
    <t>The smallest transferable unit of an HTS token,
determined by the token's decimal precision. For
example, USDC uses 6 decimals, so 1 USDC = 1,000,000
base units.</t>
  </dd>
  <dt>Mirror Node</dt>
  <dd>
    <t>A read-only node that archives Hedera network data
and exposes it via a REST API <xref target="MIRROR-NODE"/>. Used
by servers to verify transaction details after
consensus.</t>
  </dd>
  <dt>Attribution Memo</dt>
  <dd>
    <t>A 32-byte challenge-bound memo embedded in the
Hedera transaction's native memo field. Encodes the
MPP tag, version, server identity, optional client
identity, and a challenge-specific nonce. See
<xref target="attribution-memo"/> for the full byte layout.</t>
  </dd>
  <dt>Push Mode</dt>
  <dd>
    <t>The default settlement flow where the client
broadcasts the transaction itself and presents the
confirmed transaction ID (<spanx style="verb">type="hash"</spanx>). The client
"pushes" the transaction to the network directly.</t>
  </dd>
  <dt>Pull Mode</dt>
  <dd>
    <t>The alternative settlement flow where the client
signs and serializes the transaction and the server
broadcasts it (<spanx style="verb">type="transaction"</spanx>). The server
"pulls" the signed transaction from the credential.</t>
  </dd>
</dl>

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

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

</section>
<section anchor="intent-charge"><name>Intent: "charge"</name>

<t>The "charge" intent represents a one-time payment gating
access to a resource. The client builds and signs a Hedera
<spanx style="verb">TransferTransaction</spanx> with an Attribution memo, then either
broadcasts the transaction itself and sends the transaction
ID (<spanx style="verb">type="hash"</spanx>) or sends the serialized signed
transaction bytes to the server for broadcast
(<spanx style="verb">type="transaction"</spanx>). The server verifies the transfer
details and returns a receipt.</t>

</section>
<section anchor="attribution-memo"><name>Attribution Memo</name>

<t>Every Hedera charge transaction <bcp14>MUST</bcp14> include an Attribution
memo in the transaction's native memo field. The memo
provides challenge binding (replay protection) and server
identity verification.</t>

<section anchor="byte-layout"><name>Byte Layout</name>

<t>The Attribution memo is exactly 32 bytes, stored in the
Hedera transaction memo as a <spanx style="verb">0x</spanx>-prefixed hex string
(66 characters: <spanx style="verb">0x</spanx> + 64 hex digits = 66 bytes UTF-8).
This fits well within Hedera's 100-byte memo limit.</t>

<figure><artwork><![CDATA[
Offset  Size  Field
------  ----  -----------------------------------
0..3    4     TAG = keccak256("mpp")[0..3]
4       1     VERSION = 0x01
5..14   10    SERVER_ID =
                keccak256(realm)[0..9]
15..24  10    CLIENT_ID =
                keccak256(clientId)[0..9]
                or zero bytes if anonymous
25..31  7     NONCE =
                keccak256(challengeId)[0..6]
]]></artwork></figure>

<dl>
  <dt>TAG (bytes 0-3)</dt>
  <dd>
    <t>The first 4 bytes of <spanx style="verb">keccak256("mpp")</spanx>. Identifies
this memo as an MPP attribution memo. Implementations
<bcp14>MUST</bcp14> reject memos where these bytes do not match.</t>
  </dd>
  <dt>VERSION (byte 4)</dt>
  <dd>
    <t>Protocol version. <bcp14>MUST</bcp14> be <spanx style="verb">0x01</spanx> for this
specification. Implementations <bcp14>MUST</bcp14> reject memos
with an unrecognized version.</t>
  </dd>
  <dt>SERVER_ID (bytes 5-14)</dt>
  <dd>
    <t>The first 10 bytes of <spanx style="verb">keccak256(realm)</spanx>, where
<spanx style="verb">realm</spanx> is the challenge's <spanx style="verb">realm</spanx> auth-param.
Binds the memo to a specific server. Servers <bcp14>MUST</bcp14>
verify this fingerprint matches their own realm.</t>
  </dd>
  <dt>CLIENT_ID (bytes 15-24)</dt>
  <dd>
    <t>The first 10 bytes of <spanx style="verb">keccak256(clientId)</spanx>, where
<spanx style="verb">clientId</spanx> is an optional client identifier. If the
client is anonymous, all 10 bytes <bcp14>MUST</bcp14> be zero.</t>
  </dd>
  <dt>NONCE (bytes 25-31)</dt>
  <dd>
    <t>The first 7 bytes of <spanx style="verb">keccak256(challengeId)</spanx>, where
<spanx style="verb">challengeId</spanx> is the challenge <spanx style="verb">id</spanx> auth-param from
the <spanx style="verb">WWW-Authenticate</spanx> header. Binds the memo to a
specific challenge instance, preventing replay.</t>
  </dd>
</dl>

</section>
<section anchor="memo-encoding"><name>Memo Encoding</name>

<t>The 32-byte memo <bcp14>MUST</bcp14> be hex-encoded with a <spanx style="verb">0x</spanx> prefix
and stored as the Hedera transaction memo via
<spanx style="verb">setTransactionMemo()</spanx>. The resulting string is exactly
66 characters (<spanx style="verb">0x</spanx> + 64 hex digits) and 66 bytes
UTF-8, which is within Hedera's 100-byte memo limit.</t>

<t>Example memo (hex):</t>

<figure><artwork><![CDATA[
0xef1ed71201a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7
  f8a9b0c1d2e3f4a5b6c7
]]></artwork></figure>

</section>
<section anchor="compatibility"><name>Compatibility</name>

<t>This byte layout is identical to the attribution memo
used by the Tempo payment method, ensuring compatibility
across the MPP ecosystem. The only difference is the
transport: Tempo embeds the memo in a smart contract
call (<spanx style="verb">transferWithMemo</spanx>), while Hedera uses the native
transaction memo field.</t>

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

<t>All JSON <xref target="RFC8259"/> objects carried in auth-params or HTTP
headers in this specification <bcp14>MUST</bcp14> be serialized using the
JSON Canonicalization Scheme (JCS) <xref target="RFC8785"/> before
encoding. JCS produces a deterministic byte sequence, which
is required for any digest or signature operations defined
by the base spec <xref target="I-D.httpauth-payment"/>.</t>

<t>The resulting bytes <bcp14>MUST</bcp14> then be encoded using base64url
<xref target="RFC4648"/> Section 5 without padding characters (<spanx style="verb">=</spanx>).
Implementations <bcp14>MUST NOT</bcp14> append <spanx style="verb">=</spanx> padding when encoding,
and <bcp14>MUST</bcp14> accept input with or without padding when decoding.</t>

<t>This encoding convention applies to: the <spanx style="verb">request</spanx>
auth-param in <spanx style="verb">WWW-Authenticate</spanx>, the credential token in
<spanx style="verb">Authorization</spanx>, and the receipt token in <spanx style="verb">Payment-Receipt</spanx>.</t>

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

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

<t>The <spanx style="verb">request</spanx> auth-param of the <spanx style="verb">WWW-Authenticate: Payment</spanx>
header contains a JCS-serialized, base64url-encoded JSON
object (see <xref target="encoding"/>). The following shared fields are
included in that object:</t>

<dl>
  <dt>amount</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The payment amount in base units, encoded as
a decimal string. For HTS tokens, the amount is in the
token's smallest unit (e.g., for USDC with 6 decimals,
"1000000" represents 1 USDC). The value <bcp14>MUST</bcp14> be a
positive integer that fits in a 64-bit signed integer
(max 9,223,372,036,854,775,807), consistent with
Hedera's <spanx style="verb">int64</spanx> transfer amounts.</t>
  </dd>
  <dt>currency</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The HTS token ID string identifying the
payment asset (e.g., <spanx style="verb">"0.0.456858"</spanx> for Circle USDC
on mainnet). The token ID uniquely identifies the
token on the Hedera network and is used by the client
to construct the <spanx style="verb">TransferTransaction</spanx>. <bcp14>MUST</bcp14> be a
valid Hedera entity ID in the format
<spanx style="verb">shard.realm.num</spanx>.</t>
  </dd>
  <dt>description</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A human-readable memo describing the
resource or service being paid for. <bcp14>MUST NOT</bcp14> exceed
256 characters.</t>
  </dd>
  <dt>recipient</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. The Hedera account ID of the account
receiving the payment (e.g., <spanx style="verb">"0.0.12345"</spanx>). <bcp14>MUST</bcp14>
be a valid Hedera account ID in the format
<spanx style="verb">shard.realm.num</spanx>.</t>
  </dd>
  <dt>externalId</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Merchant's reference (e.g., order ID,
invoice number), per <xref target="I-D.payment-intent-charge"/>.
May be used for reconciliation or idempotency. <bcp14>MUST
NOT</bcp14> exceed 34 bytes (100-byte Hedera memo limit minus
the 66-byte Attribution memo). When the Attribution
memo is present, there is no remaining memo capacity
for an on-chain external ID; the <spanx style="verb">externalId</spanx> is
therefore carried only in the credential's challenge
echo and is not written on-chain.</t>
  </dd>
  <dt>splits</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. An array of at most 9 additional payment
splits. Each entry is a JSON object with the
following fields:
</t>

    <t><list style="symbols">
      <t><spanx style="verb">recipient</spanx> (<bcp14>REQUIRED</bcp14>): Hedera account ID of the
split recipient (e.g., <spanx style="verb">"0.0.67890"</spanx>).</t>
      <t><spanx style="verb">amount</spanx> (<bcp14>REQUIRED</bcp14>): Amount in the same base units
and token as the primary <spanx style="verb">amount</spanx>.</t>
    </list></t>

    <t>When present, the client <bcp14>MUST</bcp14> include a token
transfer entry for each split in addition to the
primary transfer to <spanx style="verb">recipient</spanx>. All splits use the
same token as the primary payment (the <spanx style="verb">currency</spanx>
token ID).</t>

    <t>Hedera's <spanx style="verb">TransferTransaction</spanx> natively supports
atomic multi-party transfers (up to 10 token
transfer entries per transaction), making splits
straightforward: the client adds one debit from the
payer and one credit per recipient in a single
atomic transaction.</t>

    <t>The top-level <spanx style="verb">amount</spanx> is the total the client pays.
The sum of all split amounts <bcp14>MUST NOT</bcp14> exceed
<spanx style="verb">amount</spanx>. The primary <spanx style="verb">recipient</spanx> receives <spanx style="verb">amount</spanx>
minus the sum of all split amounts; this remainder
<bcp14>MUST</bcp14> be greater than zero. Servers <bcp14>MUST</bcp14> reject
challenges where splits consume the entire amount.
Servers <bcp14>MUST</bcp14> verify each split transfer on-chain
during credential verification. If the same
recipient appears more than once in <spanx style="verb">splits</spanx>, each
occurrence is a distinct payment leg and <bcp14>MUST</bcp14> be
verified separately; servers <bcp14>MUST NOT</bcp14> implicitly
aggregate such entries.</t>

    <t>This mechanism is a Hedera-specific extension to the
base <spanx style="verb">charge</spanx> intent. It can be used for platform
fees, revenue sharing, or referral commissions.</t>

    <t>Note: The <spanx style="verb">splits</spanx> field is at the top level of the
request object (alongside <spanx style="verb">amount</spanx>, <spanx style="verb">currency</spanx>,
<spanx style="verb">recipient</spanx>, etc.), not nested under
<spanx style="verb">methodDetails</spanx>. The mppx framework's schema
transform outputs <spanx style="verb">splits</spanx> at the top level.</t>
  </dd>
</dl>

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

<t>The following fields are nested under <spanx style="verb">methodDetails</spanx> in
the request JSON:</t>

<dl>
  <dt>chainId</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The EIP-155 chain ID for the Hedera
network: 295 for mainnet, 296 for testnet.
Implementations <bcp14>SHOULD</bcp14> document their default
network. The reference implementation defaults to
testnet (296) for safety. Clients <bcp14>MUST</bcp14> reject
challenges whose <spanx style="verb">chainId</spanx> does not match their
configured network.</t>
  </dd>
</dl>

</section>
<section anchor="client-configuration-fields"><name>Client Configuration Fields</name>

<t>The following fields are used during request
construction by the mppx framework's schema transform
but are NOT present in the serialized wire-format
challenge. They are consumed by <spanx style="verb">parseUnits()</spanx> to
convert human-readable amounts to base units before
the request is serialized.</t>

<dl>
  <dt>decimals</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The number of decimal places for the
token (0-18). Used by <spanx style="verb">parseUnits()</spanx> during
request construction to convert a human-readable
amount (e.g., "1.00") into base units (e.g.,
"1000000"). This field is consumed by the schema
transform and does NOT appear in the serialized
challenge sent over the wire. Clients that
construct requests manually <bcp14>MUST</bcp14> provide <spanx style="verb">amount</spanx>
in base units directly and do not need this field.</t>
  </dd>
</dl>

<section anchor="hts-token-example"><name>HTS Token Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "0.0.456858",
  "recipient": "0.0.12345",
  "description": "Weather API access",
  "methodDetails": {
    "chainId": 295
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 1 USDC (1,000,000 base
units) on Hedera mainnet (chain ID 295).</t>

</section>
<section anchor="testnet-example"><name>Testnet Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "500000",
  "currency": "0.0.5449",
  "recipient": "0.0.67890",
  "description": "Premium API call",
  "methodDetails": {
    "chainId": 296
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 0.50 USDC on Hedera
testnet (chain ID 296). Note that <spanx style="verb">decimals</spanx> is not
present in the wire format; it is only used during
request construction by the mppx schema transform.</t>

</section>
<section anchor="payment-splits-example"><name>Payment Splits Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1050000",
  "currency": "0.0.456858",
  "recipient": "0.0.12345",
  "description": "Marketplace purchase",
  "splits": [
    {
      "recipient": "0.0.67890",
      "amount": "50000"
    }
  ],
  "methodDetails": {
    "chainId": 295
  }
}
]]></sourcecode></figure>

<t>This requests a total payment of 1.05 USDC. The platform
receives 0.05 USDC and the primary recipient (seller)
receives 1.00 USDC.</t>

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

<t>The <spanx style="verb">Authorization</spanx> header carries a single base64url-
encoded JSON token (no auth-params). The decoded object
contains the following top-level fields:</t>

<dl>
  <dt>challenge</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. An echo of the challenge auth-params from
the <spanx style="verb">WWW-Authenticate</spanx> header: <spanx style="verb">id</spanx>, <spanx style="verb">realm</spanx>,
<spanx style="verb">method</spanx>, <spanx style="verb">intent</spanx>, <spanx style="verb">request</spanx>, and (if present)
<spanx style="verb">expires</spanx>. This binds the credential to the exact
challenge that was issued.</t>
  </dd>
  <dt>source</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A payer identifier string, as defined by
<xref target="I-D.httpauth-payment"/>. Hedera implementations <bcp14>MAY</bcp14>
use a DID in the format
<spanx style="verb">did:pkh:hedera:{network}:{accountId}</spanx>.</t>
  </dd>
  <dt>payload</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. A JSON object containing the Hedera-specific
credential fields. The <spanx style="verb">type</spanx> field determines which
additional fields are present. Two payload types are
defined: <spanx style="verb">"hash"</spanx> (default) and <spanx style="verb">"transaction"</spanx>
(pull mode).</t>
  </dd>
</dl>

<section anchor="hash-payload"><name>Hash Payload -- Push Mode</name>

<t>In push mode (<spanx style="verb">type="hash"</spanx>), the client has already
broadcast the transaction to the Hedera network. The
<spanx style="verb">transactionId</spanx> field contains the Hedera transaction ID
for the server to verify via the Mirror Node.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c>Y</c>
      <c><spanx style="verb">"hash"</spanx></c>
      <c><spanx style="verb">transactionId</spanx></c>
      <c>string</c>
      <c>Y</c>
      <c>Hedera transaction ID</c>
</texttable>

<t>The <spanx style="verb">transactionId</spanx> <bcp14>MUST</bcp14> be in the standard Hedera format
<spanx style="verb">shard.realm.num@seconds.nanoseconds</spanx> (e.g.,
<spanx style="verb">"0.0.12345@1681234567.123456789"</spanx>).</t>

<t>Example (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "hedera",
    "intent": "charge",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "hash",
    "transactionId":
      "0.0.12345@1681234567.123456789"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="transaction-payload"><name>Transaction Payload -- Pull Mode</name>

<t>In pull mode (<spanx style="verb">type="transaction"</spanx>), the client sends the
signed transaction bytes to the server for broadcast. The
<spanx style="verb">transaction</spanx> field contains the base64-encoded serialized
signed transaction.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Req</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c>Y</c>
      <c><spanx style="verb">"transaction"</spanx></c>
      <c><spanx style="verb">transaction</spanx></c>
      <c>string</c>
      <c>Y</c>
      <c>Base64-encoded signed tx bytes</c>
</texttable>

<t>The transaction <bcp14>MUST</bcp14> be a valid Hedera transaction that
has been frozen and signed by the payer. The server
deserializes the transaction via <spanx style="verb">Transaction.fromBytes()</spanx>,
verifies the Attribution memo, and executes it.</t>

<t>Example (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "hedera",
    "intent": "charge",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "transaction",
    "transaction": "CgMA...base64-encoded..."
  }
}
]]></sourcecode></figure>

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

<t>Upon receiving a request with a credential, the server
<bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Decode the base64url credential and parse the JSON.</t>
  <t>Verify that <spanx style="verb">payload.type</spanx> is present and is either
<spanx style="verb">"hash"</spanx> or <spanx style="verb">"transaction"</spanx>.</t>
  <t>Look up the stored challenge using
<spanx style="verb">credential.challenge.id</spanx>. If no matching challenge
is found, reject the request.</t>
  <t>Verify that all fields in <spanx style="verb">credential.challenge</spanx>
exactly match the stored challenge auth-params.</t>
  <t>Proceed with type-specific verification:  <list style="symbols">
      <t>For <spanx style="verb">type="hash"</spanx>: see <xref target="hash-verification"/>.</t>
      <t>For <spanx style="verb">type="transaction"</spanx>: see
<xref target="transaction-verification"/>.</t>
    </list></t>
</list></t>

<section anchor="hash-verification"><name>Push Mode Verification</name>

<t>For credentials with <spanx style="verb">type="hash"</spanx>:</t>

<t><list style="numbers" type="1">
  <t>Verify that <spanx style="verb">payload.transactionId</spanx> is present and
is a valid Hedera transaction ID string.</t>
  <t>Verify the transaction ID has not been previously
consumed (see <xref target="replay-protection"/>).</t>
  <t>Fetch the transaction from the Mirror Node REST API
at <spanx style="verb">/api/v1/transactions/{txId}</spanx>, where <spanx style="verb">{txId}</spanx> is
the transaction ID with <spanx style="verb">@</spanx> replaced by <spanx style="verb">-</spanx> and <spanx style="verb">.</spanx>
in the timestamp replaced by <spanx style="verb">-</spanx> (Mirror Node URL
format). The server <bcp14>MUST</bcp14> poll with retry to account
for the 3-5 second lag between consensus and Mirror
Node indexing (see <xref target="mirror-node-lag"/>).</t>
  <t>Verify the transaction was successful: the <spanx style="verb">result</spanx>
field <bcp14>MUST</bcp14> be <spanx style="verb">"SUCCESS"</spanx>.</t>
  <t>Verify the Attribution memo: decode the
<spanx style="verb">memo_base64</spanx> field from the Mirror Node response
(base64 to UTF-8 to hex string), then verify:
  <list style="symbols">
      <t>The memo is a valid MPP attribution memo
(TAG and VERSION match).</t>
      <t>The SERVER_ID fingerprint matches the server's
realm.</t>
      <t>The NONCE matches
<spanx style="verb">keccak256(challengeId)[0..6]</spanx>.</t>
    </list></t>
  <t>Verify the token transfers match the challenge
request (see <xref target="transfer-verification"/>).</t>
  <t>Mark the transaction ID as consumed to prevent
replay.</t>
  <t>Return the resource with a <spanx style="verb">Payment-Receipt</spanx> header.</t>
</list></t>

</section>
<section anchor="transaction-verification"><name>Pull Mode Verification</name>

<t>For credentials with <spanx style="verb">type="transaction"</spanx>:</t>

<t><list style="numbers" type="1">
  <t>Decode the base64 <spanx style="verb">payload.transaction</spanx> value.</t>
  <t>Deserialize the transaction using
<spanx style="verb">Transaction.fromBytes()</spanx>.</t>
  <t>Extract the transaction memo and verify it is a
valid MPP attribution memo:
  <list style="symbols">
      <t>The memo string starts with <spanx style="verb">0x</spanx> and is 66
characters.</t>
      <t>TAG and VERSION match.</t>
      <t>SERVER_ID fingerprint matches the server's realm.</t>
      <t>NONCE matches
<spanx style="verb">keccak256(challengeId)[0..6]</spanx>.</t>
    </list></t>
  <t>Verify the serialized transaction bytes have not
been previously submitted (see <xref target="replay-protection"/>).</t>
  <t>Execute the transaction on the Hedera network using
the server's operator credentials.</t>
  <t>Verify the transaction receipt status is <spanx style="verb">SUCCESS</spanx>.</t>
  <t>Fetch the transaction from the Mirror Node and
verify the token transfers match the challenge
request (see <xref target="transfer-verification"/>).</t>
  <t>Mark the transaction ID as consumed to prevent
replay.</t>
  <t>Return the resource with a <spanx style="verb">Payment-Receipt</spanx> header.</t>
</list></t>

</section>
<section anchor="transfer-verification"><name>Transfer Verification</name>

<t>For all credential types, the server <bcp14>MUST</bcp14> verify the
token transfers from the Mirror Node response:</t>

<t><list style="numbers" type="1">
  <t>Compute the primary payment amount as the top-level
<spanx style="verb">amount</spanx> minus the sum of all <spanx style="verb">splits</spanx>, if any.</t>
  <t>Locate a token transfer entry in the Mirror Node
response's <spanx style="verb">token_transfers</spanx> array where:
  <list style="symbols">
      <t><spanx style="verb">token_id</spanx> matches the <spanx style="verb">currency</spanx> from the
challenge request.</t>
      <t><spanx style="verb">account</spanx> matches the top-level <spanx style="verb">recipient</spanx>.</t>
      <t><spanx style="verb">amount</spanx> is greater than or equal to the computed
primary payment amount.</t>
    </list></t>
  <t>For each split in <spanx style="verb">splits</spanx>, if any, locate an
additional token transfer entry where:
  <list style="symbols">
      <t><spanx style="verb">token_id</spanx> matches the <spanx style="verb">currency</spanx>.</t>
      <t><spanx style="verb">account</spanx> matches the split <spanx style="verb">recipient</spanx>.</t>
      <t><spanx style="verb">amount</spanx> is greater than or equal to the split
<spanx style="verb">amount</spanx>.</t>
    </list>
Each required payment leg <bcp14>MUST</bcp14> be matched to a
distinct token transfer entry. A single entry <bcp14>MUST
NOT</bcp14> satisfy more than one required payment leg,
even if multiple legs share the same recipient.</t>
</list></t>

<t>If any required token transfer entry is missing, the
server <bcp14>MUST</bcp14> reject the credential.</t>

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

<t>Servers <bcp14>MUST</bcp14> maintain a set of consumed transaction
identifiers. Before accepting a credential, the server
<bcp14>MUST</bcp14> check whether the identifier has already been
consumed. After successful verification, the server
<bcp14>MUST</bcp14> atomically mark the identifier as consumed.</t>

<t>For <spanx style="verb">type="hash"</spanx> credentials, the transaction ID is
provided directly by the client. For
<spanx style="verb">type="transaction"</spanx> credentials, the transaction ID
is derived after the server executes the transaction.</t>

<t>The Attribution memo's NONCE field provides an
additional layer of replay protection: even if a
transaction ID were somehow reusable, the
challenge-bound nonce ensures the memo can only satisfy
the specific challenge it was created for.</t>

<t>A transaction ID that has been consumed <bcp14>MUST NOT</bcp14> be
accepted again, even if presented with a different
challenge ID.</t>

</section>
<section anchor="mirror-node-lag"><name>Mirror Node Lag</name>

<t>Hedera achieves consensus in approximately 3-5 seconds,
but the Mirror Node REST API may take an additional 3-5
seconds to index the transaction. Servers <bcp14>MUST</bcp14> implement
retry logic when fetching transactions from the Mirror
Node:</t>

<t><list style="symbols">
  <t>Servers <bcp14>SHOULD</bcp14> retry up to 10 times with a 2-second
delay between attempts.</t>
  <t>A 404 response from the Mirror Node during the retry
window is expected and <bcp14>MUST NOT</bcp14> be treated as a
permanent failure.</t>
  <t>After exhausting retries, the server <bcp14>MUST</bcp14> reject the
credential with a <spanx style="verb">verification-failed</spanx> error.</t>
</list></t>

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

<t>Two settlement flows are supported, corresponding to
the two credential types.</t>

<section anchor="push-mode-settlement-typehash"><name>Push Mode Settlement (type="hash")</name>

<t>For <spanx style="verb">type="hash"</spanx> credentials, the client broadcasts
the transaction and presents the transaction ID:</t>

<figure><artwork><![CDATA[
 Client                Server         Mirror Node
    |                     |                |
    | (1) Build tx with   |                |
    |     Attribution     |                |
    |     memo, sign,     |                |
    |     execute         |                |
    |                     |                |
    | (2) Authorization:  |                |
    |     Payment         |                |
    |     <credential>    |                |
    |     (transaction ID)|                |
    |-------------------> |                |
    |                     |                |
    |                     | (3) GET        |
    |                     |  /api/v1/      |
    |                     |  transactions/ |
    |                     |  {txId}        |
    |                     |  (with retry)  |
    |                     |--------------> |
    |                     | (4) Tx data    |
    |                     |<-------------- |
    |                     |                |
    |                     | (5) Verify:    |
    |                     |  - memo        |
    |                     |  - transfers   |
    |                     |  - result      |
    |                     |                |
    | (6) 200 OK +Receipt |                |
    |<------------------- |                |
    |                     |                |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client builds a <spanx style="verb">TransferTransaction</spanx> with the
Attribution memo, signs it, and executes it on
the Hedera network.</t>
  <t>Client presents the transaction ID as the
credential.</t>
  <t>Server fetches the transaction from the Mirror
Node REST API, retrying to account for indexing
lag.</t>
  <t>Server verifies the Attribution memo (challenge
binding, server identity) and token transfers
(amount, recipient, splits).</t>
  <t>Server records the transaction ID as consumed and
returns the resource with a <spanx style="verb">Payment-Receipt</spanx>
header.</t>
</list></t>

</section>
<section anchor="pull-mode-settlement-typetransaction"><name>Pull Mode Settlement (type="transaction")</name>

<t>For <spanx style="verb">type="transaction"</spanx> credentials, the client signs
the transaction and sends it to the server:</t>

<figure><artwork><![CDATA[
 Client                Server         Hedera Network
    |                     |                   |
    | (1) Authorization:  |                   |
    |     Payment         |                   |
    |     <credential>    |                   |
    |     (signed tx      |                   |
    |      bytes)         |                   |
    |-------------------> |                   |
    |                     |                   |
    |                     | (2) Deserialize,  |
    |                     |     verify memo   |
    |                     |                   |
    |                     | (3) Execute tx    |
    |                     |-----------------> |
    |                     | (4) Receipt       |
    |                     |<----------------- |
    |                     |                   |
    |                     | (5) Mirror Node   |
    |                     |     verify        |
    |                     |     transfers     |
    |                     |                   |
    | (6) 200 OK +Receipt |                   |
    |<------------------- |                   |
    |                     |                   |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client submits credential containing signed
transaction bytes.</t>
  <t>Server deserializes the transaction, verifies the
Attribution memo (challenge binding, server
identity).</t>
  <t>Server executes the transaction on the Hedera
network.</t>
  <t>Server verifies the receipt status is <spanx style="verb">SUCCESS</spanx>.</t>
  <t>Server fetches the transaction from the Mirror
Node and verifies token transfers match the
challenge request.</t>
  <t>Server records the transaction ID as consumed and
returns the resource with a <spanx style="verb">Payment-Receipt</spanx>
header.</t>
</list></t>

</section>
<section anchor="client-transaction-construction"><name>Client Transaction Construction</name>

<t>The client <bcp14>MUST</bcp14> construct a <spanx style="verb">TransferTransaction</spanx> with:</t>

<t><list style="numbers" type="1">
  <t>A debit of the full <spanx style="verb">amount</spanx> from the client's
account for the specified <spanx style="verb">currency</spanx> token.</t>
  <t>A credit of the primary payment amount (total
<spanx style="verb">amount</spanx> minus sum of splits) to the <spanx style="verb">recipient</spanx>
account for the <spanx style="verb">currency</spanx> token.</t>
  <t>For each split, a credit of the split <spanx style="verb">amount</spanx> to
the split <spanx style="verb">recipient</spanx> for the <spanx style="verb">currency</spanx> token.</t>
  <t>The Attribution memo set via
<spanx style="verb">setTransactionMemo()</spanx> (see <xref target="attribution-memo"/>).</t>
</list></t>

<t>All debit and credit entries <bcp14>MUST</bcp14> sum to zero within
the <spanx style="verb">TransferTransaction</spanx>, as required by Hedera's
transfer semantics.</t>

<t>The recipient account(s) <bcp14>MUST</bcp14> have previously
associated with the <spanx style="verb">currency</spanx> token. Unlike Solana's
Associated Token Accounts, Hedera token association is
a one-time operation and does not require rent or
account creation by the payer. If the recipient has
not associated with the token, the transaction will
fail with <spanx style="verb">TOKEN_NOT_ASSOCIATED_TO_ACCOUNT</spanx>.</t>

</section>
<section anchor="finality"><name>Finality</name>

<t>Hedera provides asynchronous Byzantine Fault Tolerant
(aBFT) consensus with deterministic finality in
approximately 3-5 seconds. Once a transaction reaches
consensus, it cannot be rolled back or reversed.</t>

<t>This is in contrast to probabilistic finality models
(e.g., proof-of-work chains) where transactions can
theoretically be reversed. Hedera's deterministic
finality means that once the Mirror Node reports a
transaction as <spanx style="verb">SUCCESS</spanx>, the payment is irreversible.</t>

<t>Servers <bcp14>MAY</bcp14> accept the credential immediately upon
Mirror Node confirmation without waiting for additional
confirmations.</t>

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

<t>Upon successful verification, the server <bcp14>MUST</bcp14> include
a <spanx style="verb">Payment-Receipt</spanx> header in the 200 response.</t>

<t>The receipt payload for Hedera charge:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">method</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"hedera"</spanx></c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c>The transaction ID</c>
      <c><spanx style="verb">status</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"success"</spanx></c>
      <c><spanx style="verb">timestamp</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> time</c>
</texttable>

<t>Example (decoded):</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "hedera",
  "reference":
    "0.0.12345@1681234567.123456789",
  "status": "success",
  "timestamp": "2026-03-10T21:00:00Z"
}
]]></sourcecode></figure>

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

<t>When rejecting a credential, the server <bcp14>MUST</bcp14> return
HTTP 402 (Payment Required) with a fresh
<spanx style="verb">WWW-Authenticate: Payment</spanx> challenge per
<xref target="I-D.httpauth-payment"/>. The server <bcp14>SHOULD</bcp14> include a
response body conforming to RFC 9457 <xref target="RFC9457"/> Problem
Details, with <spanx style="verb">Content-Type: application/problem+json</spanx>.
Servers <bcp14>MUST</bcp14> use the standard problem types defined in
<xref target="I-D.httpauth-payment"/>: <spanx style="verb">malformed-credential</spanx>,
<spanx style="verb">invalid-challenge</spanx>, and <spanx style="verb">verification-failed</spanx>. The
<spanx style="verb">detail</spanx> field <bcp14>SHOULD</bcp14> contain a human-readable
description of the specific failure (e.g., "Transaction
not found on Mirror Node", "Attribution memo mismatch",
"Transaction ID already consumed").</t>

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

<t>Example error response body:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "type": "https://paymentauth.org/problems/verification-failed",
  "title": "Attribution Memo Mismatch",
  "status": 402,
  "detail": "Memo challenge nonce does not match"
}
]]></sourcecode></figure>

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

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

<t>All communication <bcp14>MUST</bcp14> use TLS 1.2 or higher. Hedera
credentials <bcp14>MUST</bcp14> only be transmitted over HTTPS
connections.</t>

</section>
<section anchor="replay-protection-considerations"><name>Replay Protection Considerations</name>

<t>Servers <bcp14>MUST</bcp14> track consumed transaction IDs and reject
any transaction ID that has already been accepted. The
check-and-consume operation <bcp14>MUST</bcp14> be atomic to prevent
race conditions where concurrent requests present the
same transaction ID.</t>

<t>The Attribution memo's NONCE field (derived from the
challenge ID) provides cryptographic challenge binding:
even if an attacker obtains a valid transaction ID,
they cannot construct a valid credential without the
matching challenge. However, the consumed-set check
remains essential because a single transaction could
theoretically match multiple challenges with identical
terms.</t>

</section>
<section anchor="attribution-memo-security"><name>Attribution Memo Security</name>

<t>The Attribution memo provides challenge binding but is
not a cryptographic signature over the challenge
parameters. It binds the transaction to a specific
challenge ID and server realm via keccak256
fingerprints, which provides collision resistance
(~2^56 for the 7-byte nonce, ~2^80 for the 10-byte
server and client fingerprints).</t>

<t>An attacker would need to find a challenge ID whose
keccak256 prefix collides with the target nonce to
forge a memo. At 7 bytes (56 bits), this requires
approximately 2^56 hash operations, which is
computationally infeasible for real-time attacks.</t>

</section>
<section anchor="client-side-verification"><name>Client-Side Verification</name>

<t>Clients <bcp14>MUST</bcp14> verify the challenge before signing:</t>

<t><list style="numbers" type="1">
  <t><spanx style="verb">amount</spanx> is reasonable for the service.</t>
  <t><spanx style="verb">currency</spanx> matches the expected token ID.</t>
  <t><spanx style="verb">recipient</spanx> is the expected party.</t>
  <t><spanx style="verb">splits</spanx>, if present, contain expected recipients
and amounts -- malicious servers could add splits
to redirect funds.</t>
  <t>The <spanx style="verb">chainId</spanx> matches the client's configured
network.</t>
</list></t>

<t>Malicious servers could request excessive amounts,
direct payments to unexpected recipients, or add
hidden splits.</t>

</section>
<section anchor="mirror-node-trust"><name>Mirror Node Trust</name>

<t>The server relies on the Hedera Mirror Node REST API
to provide accurate transaction data for on-chain
verification. A compromised Mirror Node could return
fabricated transaction data, causing the server to
accept payments that were never made. Servers <bcp14>SHOULD</bcp14>
use trusted Mirror Node providers or run their own
Mirror Node instance.</t>

</section>
<section anchor="front-running-push-mode"><name>Front-running (Push Mode)</name>

<t>In push mode, the client broadcasts the transaction
before presenting the credential, making it visible
on the Hedera network. A party monitoring the network
could attempt to present the same transaction ID to
the server. The challenge binding (the credential
echoes the challenge <spanx style="verb">id</spanx>, which is HMAC-verified by
the server) and the Attribution memo (which binds the
transaction to a specific challenge nonce) mitigate
this: only the party that received the challenge can
construct a valid credential with a matching memo.</t>

<t>Unlike the Solana method's push mode, Hedera's
Attribution memo provides stronger on-chain challenge
binding. The memo's NONCE field cryptographically ties
the transaction to a specific challenge instance,
preventing a single transaction from satisfying
multiple challenges even if they have identical terms.</t>

</section>
<section anchor="transaction-payload-security-pull-mode"><name>Transaction Payload Security (Pull Mode)</name>

<t>In pull mode, the server receives raw transaction bytes
from the client. A malicious client could craft a
transaction that performs unexpected operations.</t>

<t>Servers <bcp14>MUST</bcp14> verify that the deserialized transaction:
- Contains only the expected token transfer entries.
- Has a valid Attribution memo bound to the current
  challenge.
- Does not include unexpected operations beyond the
  token transfer.</t>

</section>
<section anchor="fee-delegation"><name>Fee Delegation (Future)</name>

<t>Hedera natively supports fee delegation via the
<spanx style="verb">feePayerAccountId</spanx> field on transactions. This allows
a third party (e.g., the server) to pay the transaction
fee on behalf of the client.</t>

<t>This specification does not define fee delegation
semantics in this version. A future revision <bcp14>MAY</bcp14> add
<spanx style="verb">feePayer</spanx> and <spanx style="verb">feePayerAccountId</spanx> fields to
<spanx style="verb">methodDetails</spanx>, following a pattern similar to the
Solana method's fee sponsorship mechanism. When
implemented, fee delegation would pair naturally with
pull mode (<spanx style="verb">type="transaction"</spanx>), where the server
can add its fee payer signature before broadcasting.</t>

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

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

<t>This document requests registration of the following
entry in the "HTTP Payment Methods" registry
established by <xref target="I-D.httpauth-payment"/>:</t>

<texttable>
      <ttcol align='left'>Method Identifier</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">hedera</spanx></c>
      <c>Hedera Token Service (HTS) token transfer</c>
      <c>This document</c>
</texttable>

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

<t>This document requests registration of the following
entry in the "HTTP Payment Intents" registry
established by <xref target="I-D.httpauth-payment"/>:</t>

<texttable>
      <ttcol align='left'>Intent</ttcol>
      <ttcol align='left'>Applicable Methods</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c><spanx style="verb">charge</spanx></c>
      <c><spanx style="verb">hedera</spanx></c>
      <c>One-time HTS token transfer</c>
      <c>This document</c>
</texttable>

</section>
</section>


  </middle>

  <back>


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

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

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


    </references>

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

<reference anchor="HEDERA-DOCS" target="https://docs.hedera.com">
  <front>
    <title>Hedera Documentation</title>
    <author >
      <organization>Hedera</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="HIP-218" target="https://hips.hedera.com/hip/hip-218
">
  <front>
    <title>HIP-218: Smart Contract Verification</title>
    <author >
      <organization>Hedera</organization>
    </author>
    <date year="2022"/>
  </front>
</reference>
<reference anchor="HIP-376" target="https://hips.hedera.com/hip/hip-376
">
  <front>
    <title>HIP-376: Approve/Allowance API for Tokens</title>
    <author >
      <organization>Hedera</organization>
    </author>
    <date year="2022"/>
  </front>
</reference>
<reference anchor="MIRROR-NODE" target="https://docs.hedera.com/hedera/sdks-and-apis/rest-api
">
  <front>
    <title>Hedera Mirror Node REST API</title>
    <author >
      <organization>Hedera</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="CIRCLE-USDC-HEDERA" target="https://www.circle.com/multi-chain-usdc/hedera
">
  <front>
    <title>Circle USDC on Hedera</title>
    <author >
      <organization>Circle</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>


    </references>

</references>


<?line 1212?>

<section anchor="examples"><name>Examples</name>

<t>The following examples illustrate the complete HTTP
exchange for each flow. Base64url values are shown with
their decoded JSON below.</t>

<section anchor="usdc-charge-push-mode"><name>USDC Charge (Push Mode)</name>

<t>A 1 USDC charge for weather API access on mainnet.</t>

<t><strong>1. Challenge (402 response):</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 402 Payment Required
WWW-Authenticate: Payment
  id="kM9xPqWvT2nJrHsY4aDfEb",
  realm="api.example.com",
  method="hedera",
  intent="charge",
  request="<base64url request>",
  expires="2026-03-15T12:05:00Z"
Cache-Control: no-store
]]></sourcecode></figure>

<t>Decoded <spanx style="verb">request</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "0.0.456858",
  "recipient": "0.0.12345",
  "description": "Weather API access",
  "methodDetails": {
    "chainId": 295
  }
}
]]></sourcecode></figure>

<t><strong>2. Credential (retry with transaction ID):</strong></t>

<figure><sourcecode type="http"><![CDATA[
GET /weather HTTP/1.1
Host: api.example.com
Authorization: Payment <base64url credential>
]]></sourcecode></figure>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "hedera",
    "intent": "charge",
    "request": "<base64url request>",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "hash",
    "transactionId":
      "0.0.12345@1681234567.123456789"
  }
}
]]></sourcecode></figure>

<t><strong>3. Response (with receipt):</strong></t>

<figure><sourcecode type="http"><![CDATA[
HTTP/1.1 200 OK
Payment-Receipt: <base64url receipt>
Content-Type: application/json

{"temperature": 72, "condition": "sunny"}
]]></sourcecode></figure>

<t>Decoded receipt:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "hedera",
  "reference":
    "0.0.12345@1681234567.123456789",
  "status": "success",
  "timestamp": "2026-03-15T12:04:58Z"
}
]]></sourcecode></figure>

</section>
<section anchor="pull-mode-typetransaction"><name>Pull Mode (type="transaction")</name>

<t>The client signs and serializes the transaction; the
server deserializes, verifies, and executes it.</t>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "hedera",
    "intent": "charge",
    "request": "<base64url request>",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "transaction",
    "transaction": "CgMA...base64-encoded..."
  }
}
]]></sourcecode></figure>

</section>
<section anchor="payment-splits"><name>Payment Splits</name>

<t>A marketplace charge of 1.05 USDC where 0.05 USDC goes
to the platform as a fee.</t>

<t>Decoded <spanx style="verb">request</spanx>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1050000",
  "currency": "0.0.456858",
  "recipient": "0.0.12345",
  "description": "Marketplace purchase",
  "splits": [
    {
      "recipient": "0.0.67890",
      "amount": "50000"
    }
  ],
  "methodDetails": {
    "chainId": 295
  }
}
]]></sourcecode></figure>

<t>The client builds a <spanx style="verb">TransferTransaction</spanx> with three
token transfer entries:
- Debit 1,050,000 from the payer (<spanx style="verb">0.0.PAYER</spanx>)
- Credit 1,000,000 to the seller (<spanx style="verb">0.0.12345</spanx>)
- Credit 50,000 to the platform (<spanx style="verb">0.0.67890</spanx>)</t>

<t>All three entries are atomic within a single
transaction, leveraging Hedera's native multi-party
transfer support.</t>

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

<t>The author thanks the Tempo team for the MPP attribution
memo design and the mppx ecosystem architecture that
this specification builds upon.</t>

</section>


  </back>

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

-->

</rfc>

