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


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

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


<rfc ipr="noModificationTrust200902" docName="draft-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="September" day="09"/>

    
    
    

    <abstract>


<?line 82?>

<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 97?>

<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-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>


    </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 1211?>

<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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
RBie/q/SYu2DbysrkGnfCoiEJGtJwfXoVcDv0A5D1jjSmlLYf9GpTex29iDJ
ySAdHpTE9dn2yNiGHv70UGvA3F+0eDthvbh6UjifNaFDxZic/y/yxs98ZKlT
ObY4vX51AkOGiI5zCOg6KJKJeaV8whWI2fcOAxW/X2SpFy6NrX9CkuicUtHx
T1YgzsHu7PSAVsZ8ushTbn1VhM6coCuEmqBCAzu92zPnz9n2Enj0mIRcqNAE
5eTsAIDDCjVgDhXagn73euplln1QGEAhyUQZf05fpNwf6sY7veG8T6DOksMc
1HBytUnij40T4lSu8CBSx6TWej4lGH4/XBbGFUSlQrd605CoF9lMeOveq0/c
081hnIMeb6nJdUSwOU+4v8MkFLqURRIoTX3FmS+kZgUoQVHl8JMAyvQli5q7
O18yVHsJi68F+CjqXQUVcUSvOAovLZw1YVwz5oQqSohCsnX3MEibIFJBzlox
SGSi6HwiRopJrEm2LCh+4bxrklXEea1dd3yCD9UDjn6nzUY3nixqKkiDA+B6
TbmjoJQR1ykyWb5qKH9zTLxpFQzaPw4593YsHsvukDX3HmGlOUpiTu/W2rb8
eb5/9xI/Yt0vPDLDHr5MTlVIVQLMEbbpGtad72otqll8DUAubxDO9rwgR5lo
WPyMRsYI3S2dV2Gwz+l1F888dqETBvr+2j1F67FYkqvuajmziXOYSEhgYCXD
5uFvXb4/PT2/vCR2cxD0WhVxfbHcTSh+iA9/YiZplJfGPTeFN/GjFrdHeFGu
MJ2jtcdd2nK2ii0NIfaBzXV1KN90joGJuIVHJxCs5jwCcaF2z/XlzgWsybKX
jf6C0wFMtr39nvPXpT03WZOnzic6ELKH4X6Rd8QFyB2jDLizEV2CCKZ9hTMh
Ohz1FPq7mkgj9tzkAGvJU+fuJU/9uAd6Ih7yEvYv+U4m7byaB2nS5CslpCoc
cS0rvZ8xhry5WSI3cskhJ/Yxvztzal4NJk5mrlP1mKmd33J57ur3fJrGFN1Y
ieuUai+vx80qKouKTCUFDAAwu170g0Mukx1kkHEHTcgt7zbH6wClfw06h+zH
r/dTs4Gm8UdN7melqkJG0UUHZfmgiDnoufKJld1ozj60exys2pZVC0qWVWnT
69zkBMM2lUt0yqmhsMshE90jBJ+I7Y9/Ry5w/DdxgWd/AxcweUKNTKA2WeYA
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
AAA=

-->

</rfc>

