<?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-solana-charge-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Solana Charge">Solana Charge Intent for HTTP Payment Authentication</title>

    <author initials="L." surname="Galabru" fullname="Ludo Galabru">
      <organization>Solana Foundation</organization>
      <address>
        <email>ludo.galabru@solana.org</email>
      </address>
    </author>
    <author initials="I." surname="Gitter" fullname="Ilan Gitter">
      <organization>Solana Foundation</organization>
      <address>
        <email>ilan.gitter@solana.org</email>
      </address>
    </author>

    <date year="2026" month="September" day="09"/>

    
    
    

    <abstract>


<?line 84?>

<t>This document defines the "charge" intent for the "solana" payment
method within the Payment HTTP Authentication Scheme
<xref target="I-D.httpauth-payment"/>. The client constructs and signs a native SOL
or SPL token transfer on the Solana blockchain; the server verifies the
payment and presents the transaction signature as proof of payment.</t>

<t>Two credential types are supported: <spanx style="verb">type="transaction"</spanx> (default),
where the client sends the signed transaction to the server for
broadcast, and <spanx style="verb">type="signature"</spanx> (fallback), where the client
broadcasts the transaction itself and presents the on-chain transaction
signature for server verification.</t>

<t>This document also defines an optional confidential charge profile, in
which the transferred amount is encrypted on-chain using the Token-2022
Confidential Transfer extension <xref target="CONFIDENTIAL-TRANSFER"/>. Because a
confidential transfer spans multiple transactions, this profile adds a
third credential type, <spanx style="verb">type="bundle"</spanx>. The server — the payment
recipient — confirms the paid amount by decrypting the amount credited
to its own confidential account with its own key, so the amount never
appears in cleartext on-chain.</t>



    </abstract>



  </front>

  <middle>


<?line 107?>

<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
"solana" payment method.</t>

<t>Solana is a high-throughput blockchain with sub-second finality
and low transaction fees <xref target="SOLANA-DOCS"/>. This specification
supports payments in both native SOL and SPL tokens (including
Token-2022 <xref target="SPL-TOKEN-2022"/>), making it suitable for
micropayment use cases where fast confirmation and low overhead
are important.</t>

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

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

<figure><artwork><![CDATA[
   Client                     Server              Solana Network
      |                          |                        |
      |  (1) GET /resource       |                        |
      |----------------------->  |                        |
      |                          |                        |
      |  (2) 402 Payment Required|                        |
      |      (recipient, amount, |                        |
      |       feePayerKey?)      |                        |
      |<-----------------------  |                        |
      |                          |                        |
      |  (3) Build tx, set fee   |                        |
      |      payer, sign         |                        |
      |                          |                        |
      |  (4) Authorization:      |                        |
      |      Payment <credential>|                        |
      |      (signed tx bytes)   |                        |
      |----------------------->  |                        |
      |                          |  (5) Co-sign (if fee   |
      |                          |      payer) + send     |
      |                          |----------------------> |
      |                          |  (6) Confirmation      |
      |                          |<---------------------- |
      |                          |                        |
      |  (7) 200 OK + Receipt    |                        |
      |<-----------------------  |                        |
      |                          |                        |
]]></artwork></figure>

<t>In this model the server controls transaction broadcast, enabling
fee sponsorship (<xref target="fee-sponsorship"/>) and server-side retry logic.
When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the challenge includes <spanx style="verb">feePayerKey</spanx>
so the client sets the server as fee payer. The server co-signs
with its fee payer key before broadcasting.</t>

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

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

<figure><artwork><![CDATA[
   Client                     Server              Solana Network
      |                          |                        |
      |  (1) GET /resource       |                        |
      |----------------------->  |                        |
      |                          |                        |
      |  (2) 402 Payment Required|                        |
      |      (recipient, amount) |                        |
      |<-----------------------  |                        |
      |                          |                        |
      |  (3) Build & sign tx     |                        |
      |                          |                        |
      |  (4) Send transaction    |                        |
      |----------------------------------------------->   |
      |  (5) Confirmation        |                        |
      |<-----------------------------------------------   |
      |                          |                        |
      |  (6) Authorization:      |                        |
      |      Payment <credential>|                        |
      |      (tx signature)      |                        |
      |----------------------->  |                        |
      |                          |  (7) getTransaction    |
      |                          |----------------------> |
      |                          |  (8) Parsed tx data    |
      |                          |<---------------------- |
      |                          |                        |
      |  (9) 200 OK + Receipt    |                        |
      |<-----------------------  |                        |
      |                          |                        |
]]></artwork></figure>

<t>This flow is useful when the client cannot or does not wish to
delegate broadcast to the server. The server verifies the payment
by fetching and inspecting the on-chain transaction via RPC.</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 Solana-specific <spanx style="verb">methodDetails</spanx>, <spanx style="verb">payload</spanx>, and
verification procedures for the "solana" 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 Signature</dt>
  <dd>
    <t>A base58-encoded <xref target="BASE58"/> unique identifier for a Solana
transaction, produced by the first signer. Serves as both
the transaction identifier and proof of payment in this
specification.</t>
  </dd>
  <dt>SPL Token</dt>
  <dd>
    <t>A fungible token on Solana conforming to the SPL Token
program <xref target="SPL-TOKEN"/> or the Token-2022 program
<xref target="SPL-TOKEN-2022"/>.</t>
  </dd>
  <dt>Associated Token Account (ATA)</dt>
  <dd>
    <t>A deterministically derived token account for a given
owner and mint, per the Associated Token Program. The
address is a Program Derived Address (PDA) seeded by
the owner's public key, the token mint, and the token
program ID.</t>
  </dd>
  <dt>Lamports</dt>
  <dd>
    <t>The smallest unit of native SOL. 1 SOL = 1,000,000,000
lamports.</t>
  </dd>
  <dt>Base Units</dt>
  <dd>
    <t>The smallest transferable unit of an SPL 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>Fee Payer</dt>
  <dd>
    <t>An account that pays Solana transaction fees. When the server
acts as fee payer, it adds its signature to the transaction
before broadcasting, covering the transaction fee on behalf
of the client.</t>
  </dd>
  <dt>Pull Mode</dt>
  <dd>
    <t>The default settlement flow where the client signs the
transaction and the server broadcasts it
(<spanx style="verb">type="transaction"</spanx>). The server "pulls" the signed
transaction from the credential. Enables fee sponsorship
and server-side retry logic.</t>
  </dd>
  <dt>Push Mode</dt>
  <dd>
    <t>The fallback settlement flow where the client broadcasts
the transaction itself and presents the confirmed
signature (<spanx style="verb">type="signature"</spanx>). The client "pushes" the
transaction to the network directly. Cannot be used with
fee sponsorship.</t>
  </dd>
  <dt>Confidential Transfer</dt>
  <dd>
    <t>A Token-2022 transfer in which the transferred amount is
encrypted on-chain using the Confidential Transfer
extension <xref target="CONFIDENTIAL-TRANSFER"/>. The amount is hidden
from public observers; only the sender, the receiver, and a
designated auditor can recover it.</t>
  </dd>
  <dt>Confidential Token Account</dt>
  <dd>
    <t>A Token-2022 associated token account that has been
configured for confidential transfers via the
<spanx style="verb">ConfigureAccount</spanx> operation, holding an encrypted
available balance, an encrypted pending balance, and the
owner's ElGamal public key. On mints that do not
auto-approve, the account <bcp14>MUST</bcp14> also be approved by the
mint's confidential-transfer authority before it can send
or receive.</t>
  </dd>
  <dt>ElGamal Public Key</dt>
  <dd>
    <t>A twisted-ElGamal public key bound to a confidential token
account. Transfer amounts are encrypted under the sender's,
the receiver's, and (when configured) the auditor's ElGamal
public keys.</t>
  </dd>
  <dt>Auditor</dt>
  <dd>
    <t>A party optionally designated by the mint's
<spanx style="verb">ConfidentialTransferMint</spanx> configuration whose ElGamal public
key is included in every confidential transfer, letting the
holder of the corresponding secret decrypt transferred amounts.
The auditor is the mint <strong>issuer's</strong> compliance facility; the
charge server does NOT act as the auditor and plays no auditor
role in this specification.</t>
  </dd>
  <dt>Pending Balance</dt>
  <dd>
    <t>The portion of a confidential account's balance that has
received incoming confidential transfers but is not yet
spendable. The account owner converts pending balance into
spendable available balance with the <spanx style="verb">ApplyPendingBalance</spanx>
operation; no other party can perform this step.</t>
  </dd>
  <dt>Proof Context State Account</dt>
  <dd>
    <t>A short-lived account into which the ZK ElGamal Proof
Program <xref target="ZK-ELGAMAL-PROOF"/> records a verified proof so
that a later instruction in the same or a subsequent
transaction can reference it. Because confidential-transfer
proofs are too large to share a single transaction with the
transfer itself, they are verified into context state
accounts first and closed afterward to reclaim rent.</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 Solana transfer
transaction, then either sends the signed transaction bytes to
the server for broadcast (<spanx style="verb">type="transaction"</spanx>) or broadcasts the
transaction itself and sends the on-chain signature
(<spanx style="verb">type="signature"</spanx>). The server verifies the transfer details
and returns a receipt.</t>

</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 native SOL, the amount is in lamports.
For SPL 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 unsigned integer (max 18,446,744,073,709,551,615).</t>
  </dd>
  <dt>currency</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. For native SOL, <bcp14>MUST</bcp14> be the lowercase
string <spanx style="verb">"sol"</spanx>. For SPL tokens, <bcp14>MUST</bcp14> be the base58-encoded
mint address (e.g.,
<spanx style="verb">"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"</spanx>
for USDC). The mint address uniquely identifies the token
and is used by the client to construct the transfer
instruction. <bcp14>MUST NOT</bcp14> exceed 128 characters.</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 base58-encoded public key of the account
receiving the payment. For native SOL transfers, this is the
destination account. For SPL token transfers, this is the
owner of the destination associated token account, not the
ATA address itself.</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 566
bytes (Solana Memo Program limit). When present, clients
<bcp14>SHOULD</bcp14> include this value as a Memo Program instruction
in the transaction, making it visible on-chain for
auditing and reconciliation. Servers <bcp14>MAY</bcp14> verify the memo
matches the <spanx style="verb">externalId</spanx> from the challenge.</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>network</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. Identifies which Solana cluster the payment
should be made on. <bcp14>MUST</bcp14> be one of "mainnet",
"devnet", or "localnet". Defaults to "mainnet"
if omitted. Clients <bcp14>MUST</bcp14> reject challenges whose
network does not match their configured cluster.</t>
  </dd>
  <dt>decimals</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. The number of decimal places
for the token (0–9). <bcp14>MUST</bcp14> be present when <spanx style="verb">currency</spanx>
is a mint address; <bcp14>MUST</bcp14> be absent when <spanx style="verb">currency</spanx> is
<spanx style="verb">"sol"</spanx>. Used by the client to construct a
<spanx style="verb">TransferChecked</spanx> instruction.</t>
  </dd>
  <dt>tokenProgram</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The base58-encoded program ID of the token
program governing the token. <bcp14>MUST</bcp14> be either the
Token Program
(<spanx style="verb">TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA</spanx>) or
the Token-2022 Program
(<spanx style="verb">TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb</spanx>).
If omitted, clients <bcp14>MUST</bcp14> determine the correct token
program by fetching the mint account from the network
and inspecting its owner program. If that lookup
fails, returns an unexpected owner, or cannot be
verified, clients <bcp14>MUST</bcp14> reject the challenge rather
than falling back to the Token Program. Servers
<bcp14>SHOULD</bcp14> include this field as a hint to avoid the
extra RPC lookup. <bcp14>MUST NOT</bcp14> be present when
<spanx style="verb">currency</spanx> is <spanx style="verb">"sol"</spanx>.</t>
  </dd>
  <dt>feePayer</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A boolean indicating whether the server will
pay transaction fees on behalf of the client. Defaults
to <spanx style="verb">false</spanx> if omitted. When <spanx style="verb">true</spanx>, the <spanx style="verb">feePayerKey</spanx>
field <bcp14>MUST</bcp14> also be present. See <xref target="fee-sponsorship"/>.</t>
  </dd>
  <dt>feePayerKey</dt>
  <dd>
    <t>Conditionally <bcp14>REQUIRED</bcp14>. The base58-encoded public key
of the server's fee payer account. <bcp14>MUST</bcp14> be present when
<spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>; <bcp14>MUST</bcp14> be absent when <spanx style="verb">feePayer</spanx> is
<spanx style="verb">false</spanx> or omitted. The client uses this key as the
transaction fee payer when constructing the transaction.</t>
  </dd>
  <dt>splits</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. An array of at most 8 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>): Base58-encoded public key of
the split recipient.</t>
      <t><spanx style="verb">amount</spanx> (<bcp14>REQUIRED</bcp14>): Amount in the same base units
and asset as the primary <spanx style="verb">amount</spanx>.</t>
      <t><spanx style="verb">memo</spanx> (<bcp14>OPTIONAL</bcp14>): Human-readable label for this
split (e.g., "platform fee", "referral"). <bcp14>MUST NOT</bcp14>
exceed 566 bytes (Solana Memo Program limit).</t>
      <t><spanx style="verb">ataCreationRequired</spanx> (<bcp14>OPTIONAL</bcp14>): Boolean. Defaults
to <spanx style="verb">false</spanx>. When <spanx style="verb">true</spanx>, the client <bcp14>MUST</bcp14> include an
idempotent Associated Token Account creation instruction
for this split recipient's ATA before the split transfer.
This field <bcp14>MUST NOT</bcp14> be <spanx style="verb">true</spanx> unless <spanx style="verb">currency</spanx> is an
SPL token mint address. In fee-sponsored pull mode
(<spanx style="verb">feePayer: true</spanx>), this field is the only authorization
for the server fee payer to fund split-recipient ATA
creation. See <xref target="split-recipient-ata-creation"/>.</t>
    </list></t>

    <t>When present, the client <bcp14>MUST</bcp14> include a transfer
instruction for each split in addition to the primary
transfer to <spanx style="verb">recipient</spanx>. All splits use the same asset
as the primary payment (native SOL or the token from <spanx style="verb">currency</spanx>).</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 Solana-specific extension to the
base <spanx style="verb">charge</spanx> intent. It can be used for fee payer cost
recovery, platform fees, revenue sharing, or referral
commissions.</t>
  </dd>
  <dt>recentBlockhash</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A base58-encoded recent blockhash for the
client to use when constructing the transaction. When
provided, clients <bcp14>SHOULD</bcp14> use this blockhash instead of
fetching one from an RPC node. This avoids an extra
RPC round-trip and ensures the server can verify
blockhash freshness. This field is advisory and
short-lived; it <bcp14>MUST NOT</bcp14> be assumed to remain valid for
the full lifetime of the payment challenge. If omitted,
clients <bcp14>MUST</bcp14> fetch a recent blockhash themselves.</t>
  </dd>
  <dt>confidential</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. A boolean indicating that the charge <bcp14>MUST</bcp14> be
settled as a Token-2022 confidential transfer
(<xref target="confidential"/>), in which the transferred amount is
encrypted on-chain. Defaults to <spanx style="verb">false</spanx> if omitted. When
<spanx style="verb">true</spanx>: <spanx style="verb">currency</spanx> <bcp14>MUST</bcp14> be the mint address of a Token-2022
mint whose <spanx style="verb">ConfidentialTransferMint</spanx> extension is enabled;
<spanx style="verb">tokenProgram</spanx>, if present, <bcp14>MUST</bcp14> be the Token-2022 Program;
the credential <bcp14>MUST</bcp14> use <spanx style="verb">type="bundle"</spanx>
(<xref target="bundle-payload"/>); and <spanx style="verb">splits</spanx> <bcp14>MUST NOT</bcp14> be present.
Servers <bcp14>MUST</bcp14> reject a confidential challenge that violates
any of these constraints. <bcp14>MUST NOT</bcp14> be <spanx style="verb">true</spanx> when <spanx style="verb">currency</spanx>
is <spanx style="verb">"sol"</spanx>.</t>
  </dd>
  <dt>auditorElgamalPubkey</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The base64-encoded twisted-ElGamal public key of
the mint's confidential-transfer auditor, when the mint
configures one. This is informational: it lets the client
confirm it is transmitting on the mint it expects. It is NOT
used for charge verification — the auditor is the mint
issuer's compliance facility, not the server's amount-check
mechanism (see <xref target="confidential-amount"/>). When present, clients
<bcp14>SHOULD</bcp14> verify it matches the on-chain
<spanx style="verb">ConfidentialTransferMint</spanx> auditor key. <bcp14>MUST</bcp14> be absent when
<spanx style="verb">confidential</spanx> is not <spanx style="verb">true</spanx>.</t>
  </dd>
  <dt>recipientElgamalPubkey</dt>
  <dd>
    <t><bcp14>OPTIONAL</bcp14>. The base64-encoded twisted-ElGamal public key of
the recipient's confidential token account, supplied as a
hint to save an RPC lookup. When present, clients <bcp14>MUST</bcp14>
verify it matches the recipient's on-chain confidential
account state before use. Regardless of this hint, clients
<bcp14>MUST</bcp14> confirm the recipient has a configured (and, on mints
that do not auto-approve, approved) confidential token
account; if it does not, the client <bcp14>MUST</bcp14> reject the
challenge, because confidential transfers cannot be received
by an unconfigured account (<xref target="prerequisites"/>). <bcp14>MUST</bcp14> be
absent when <spanx style="verb">confidential</spanx> is <spanx style="verb">false</spanx> or omitted.</t>
  </dd>
</dl>

<section anchor="native-sol-example"><name>Native SOL Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "sol",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Weather API access",
  "methodDetails": {
    "network": "mainnet"
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 0.01 SOL (10,000,000 lamports).</t>

</section>
<section anchor="spl-token-example"><name>SPL Token Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Premium API call",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 1 USDC (1,000,000 base units).</t>

</section>
<section anchor="fee-sponsorship-example"><name>Fee Sponsorship Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "sol",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Weather API access",
  "methodDetails": {
    "network": "mainnet",
    "feePayer": true,
    "feePayerKey": "9aE3Fg7HjKLmNpQr5TuVwXyZ2AbCdEf8GhIjKlMnOp1R"
  }
}
]]></sourcecode></figure>

<t>This requests a transfer of 0.01 SOL where the server pays
transaction fees.</t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1050000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Marketplace purchase",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "splits": [
      { "recipient": "3pF8Kg2aHbNvJkLMwEqR7YtDxZ5sGhJn4UV6mWcXrT9A", "amount": "50000", "memo": "platform fee" }
    ]
  }
}
]]></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 anchor="split-recipient-ata-creation-example"><name>Split Recipient ATA Creation Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Marketplace purchase with bridge settlement",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "feePayer": true,
    "feePayerKey": "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr",
    "splits": [
      {
        "recipient": "3pF8Kg2aHbNvJkLMwEqR7YtDxZ5sGhJn4UV6mWcXrT9A",
        "amount": "990000",
        "memo": "bridge deposit",
        "ataCreationRequired": true
      }
    ]
  }
}
]]></sourcecode></figure>

<t>This requests a total payment of 1 USDC. The bridge deposit
split receives 0.99 USDC and the primary recipient receives
0.01 USDC. Because the split sets <spanx style="verb">ataCreationRequired: true</spanx>,
the fee payer authorizes funding the split recipient's ATA if
it does not already exist. The top-level recipient is not
covered by this authorization.</t>

</section>
<section anchor="confidential-transfer-example"><name>Confidential Transfer Example</name>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "HVWf8JmLoHs99Lw8Psf3fyqAtA4crWxCPkrmSdNjhNH3",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Confidential API call",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
    "feePayer": true,
    "feePayerKey": "9aE3Fg7HjKLmNpQr5TuVwXyZ2AbCdEf8GhIjKlMnOp1R",
    "confidential": true
  }
}
]]></sourcecode></figure>

<t>This requests a confidential transfer of 1 token (1,000,000
base units). The on-chain transfer encrypts the amount; the
server, as the recipient, recovers and verifies it by
decrypting the amount credited to its own confidential account
with its own ElGamal key. See <xref target="confidential"/>.</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"/>. Solana implementations <bcp14>MAY</bcp14>
use the payer's base58-encoded public key or a DID.</t>
  </dd>
  <dt>payload</dt>
  <dd>
    <t><bcp14>REQUIRED</bcp14>. A JSON object containing the Solana-specific
credential fields. The <spanx style="verb">type</spanx> field determines which
additional fields are present. Three payload types are
defined: <spanx style="verb">"transaction"</spanx> (default) and <spanx style="verb">"signature"</spanx>
(fallback) for ordinary transfers, and <spanx style="verb">"bundle"</spanx> for
confidential transfers (<xref target="bundle-payload"/>).</t>
  </dd>
</dl>

<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'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"transaction"</spanx></c>
      <c><spanx style="verb">transaction</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base64-encoded serialized signed transaction bytes (max 1232 bytes decoded)</c>
</texttable>

<t>The transaction <bcp14>MUST</bcp14> be a valid Solana versioned transaction
that does not exceed the 1232-byte transaction size limit.
containing the transfer instruction(s) matching the challenge
parameters. The client <bcp14>MUST</bcp14> sign the transaction with the
transfer authority key. When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or absent,
the client <bcp14>MUST</bcp14> also be the fee payer and the transaction <bcp14>MUST</bcp14>
be fully signed. When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the transaction
<bcp14>MUST</bcp14> set the server's <spanx style="verb">feePayerKey</spanx> as fee payer, and the
client signs only as transfer authority; the server adds the
fee payer signature before broadcasting (see
<xref target="fee-sponsorship"/>).</t>

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

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

</section>
<section anchor="signature-payload"><name>Signature Payload — Push Mode</name>

<t>In push mode (<spanx style="verb">type="signature"</spanx>), the client has already
broadcast the transaction to the Solana network. The
<spanx style="verb">signature</spanx> field contains the base58-encoded transaction
signature for the server to verify on-chain.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"signature"</spanx></c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58-encoded Solana transaction signature</c>
</texttable>

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

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

</section>
<section anchor="bundle-payload"><name>Bundle Payload — Confidential Transfers</name>

<t>When <spanx style="verb">methodDetails.confidential</spanx> is <spanx style="verb">true</spanx>, the credential
<bcp14>MUST</bcp14> use <spanx style="verb">type="bundle"</spanx>. A confidential transfer cannot be
expressed as a single transaction: its validity, equality, and
range proofs are too large to share a transaction with the
transfer instruction, so they are first verified into proof
context state accounts (<xref target="confidential"/>). The <spanx style="verb">transactions</spanx>
field carries the ordered list of signed transactions that
implement the transfer.</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">type</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c><spanx style="verb">"bundle"</spanx></c>
      <c><spanx style="verb">transactions</spanx></c>
      <c>array</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Ordered, non-empty array of base64-encoded serialized signed transactions. Each element <bcp14>MUST</bcp14> individually satisfy the 1232-byte transaction size limit.</c>
</texttable>

<t>The transactions <bcp14>MUST</bcp14> be ordered for sequential submission:
each proof context state account <bcp14>MUST</bcp14> be created and its proof
verified before the transaction that consumes it, and any
context-account close instructions <bcp14>MUST</bcp14> appear no earlier than
the transaction that last references the account. The final
transaction in the array <bcp14>MUST</bcp14> contain the confidential
<spanx style="verb">Transfer</spanx> (or <spanx style="verb">TransferWithFee</spanx>) instruction. The server
submits the transactions in array order, waiting for the
required commitment level on each before submitting the next
(see <xref target="confidential-verification"/> and <xref target="bundle-settlement"/>).</t>

<t>Confidential charges are normally fee-sponsored (<spanx style="verb">feePayer:
true</spanx>), because the paying client typically holds no SOL. Every
transaction in the bundle <bcp14>MUST</bcp14> then set the server's
<spanx style="verb">feePayerKey</spanx> as fee payer. The client signs each transaction
only as the transfer authority and for the ephemeral proof /
record account keypairs it generates; the server co-signs the
fee-payer slot before broadcast.</t>

<t>Because the client funds nothing, the server's <spanx style="verb">feePayerKey</spanx>
<bcp14>MUST</bcp14> also be the rent funder for the proof context and record
accounts and their authority (<spanx style="verb">context_state_authority</spanx> and the
record-account authority), and every close instruction <bcp14>MUST</bcp14>
return the reclaimed lamports to the server. The server does
NOT shift rent to the client (it has no SOL); instead it
protects itself from rent drain by (a) verifying each
transaction contains only allow-listed, non-draining
instructions before co-signing (<xref target="confidential-verification"/>),
and (b) reclaiming rent from accounts orphaned by partial
failures — which it can do because it is their authority
(see <xref target="confidential-rent"/>).</t>

<t>The server absorbs the (small) SOL transaction fee for a
confidential charge: it cannot be recovered through a stablecoin
<spanx style="verb">splits</spanx> entry (splits are forbidden for confidential charges,
<xref target="confidential"/>), and the confidential <spanx style="verb">Transfer</spanx> is
single-recipient. Servers <bcp14>SHOULD</bcp14> price this into their fee
model rather than attempt on-chain recovery.</t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "kM9xPqWvT2nJrHsY4aDfEb",
    "realm": "api.example.com",
    "method": "solana",
    "intent": "charge",
    "request": "eyJ...",
    "expires": "2026-03-15T12:05:00Z"
  },
  "payload": {
    "type": "bundle",
    "transactions": [
      "AQAAAA...proof-context-setup-tx...",
      "AQAAAA...confidential-transfer-tx..."
    ]
  }
}
]]></sourcecode></figure>

</section>
<section anchor="signature-limitations"><name>Limitations of Push Mode</name>

<t>The <spanx style="verb">type="signature"</spanx> credential has the following limitations:</t>

<t><list style="symbols">
  <t><bcp14>MUST NOT</bcp14> be used when <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx> in the challenge
request. Since the client has already broadcast the
transaction, the server cannot add its fee payer signature.
Servers <bcp14>MUST</bcp14> reject <spanx style="verb">type="signature"</spanx> credentials when
the challenge specifies <spanx style="verb">feePayer: true</spanx>.</t>
  <t>The server cannot modify or enhance the transaction (e.g.,
add priority fees, adjust compute units, or retry with
different parameters).</t>
</list></t>

</section>
</section>
<section anchor="fee-sponsorship"><name>Fee Sponsorship</name>

<t>When a challenge includes <spanx style="verb">feePayer: true</spanx> in <spanx style="verb">methodDetails</spanx>,
the server commits to paying Solana transaction fees on behalf
of the client. This section describes the fee sponsorship
mechanism.</t>

<section anchor="server-paid-fees"><name>Server-Paid Fees</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>:</t>

<t><list style="numbers" type="1">
  <t><strong>Client constructs transaction</strong>: The client builds the
transfer transaction with the server's <spanx style="verb">feePayerKey</spanx> set
as the transaction fee payer. The client's account is the
transfer authority but NOT the fee payer.</t>
  <t><strong>Client partially signs</strong>: The client signs the transaction
with only its own key (the transfer authority). The fee
payer signature slot remains empty.</t>
  <t><strong>Client sends credential</strong>: The client sends the partially
signed transaction as a <spanx style="verb">type="transaction"</spanx> credential.</t>
  <t><strong>Server adds fee payer signature</strong>: The server verifies the
transaction contents, then signs with the fee payer key to
complete the transaction.</t>
  <t><strong>Server broadcasts</strong>: The fully signed transaction
(containing both the client's transfer authority signature
and the server's fee payer signature) is broadcast to the
Solana network.</t>
</list></t>

</section>
<section anchor="client-paid-fees"><name>Client-Paid Fees</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted, the client <bcp14>MUST</bcp14> set
itself as the fee payer and fully sign the transaction. The
server broadcasts the transaction as-is without adding any
signatures.</t>

</section>
<section anchor="server-requirements"><name>Server Requirements</name>

<t>When acting as fee payer, servers:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> maintain sufficient SOL balance in the fee payer
account to cover transaction fees</t>
  <t><bcp14>MUST</bcp14> verify the transaction contents before signing
(see <xref target="transaction-verification"/>)</t>
  <t><bcp14>SHOULD</bcp14> implement rate limiting to mitigate fee
exhaustion attacks (see <xref target="fee-payer-risks"/>)</t>
</list></t>

</section>
<section anchor="client-requirements"><name>Client Requirements</name>

<t><list style="symbols">
  <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>: clients <bcp14>MUST</bcp14> set <spanx style="verb">feePayerKey</spanx>
from <spanx style="verb">methodDetails</spanx> as the transaction fee payer and <bcp14>MUST</bcp14>
sign only with the transfer authority key. Clients <bcp14>MUST</bcp14>
use <spanx style="verb">type="transaction"</spanx> credentials.</t>
  <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted: clients <bcp14>MUST</bcp14> set
themselves as the fee payer and fully sign the transaction.
Clients <bcp14>MAY</bcp14> use either <spanx style="verb">type="transaction"</spanx> or
<spanx style="verb">type="signature"</spanx> credentials.</t>
</list></t>

</section>
<section anchor="split-recipient-ata-creation"><name>Split Recipient ATA Creation</name>

<t>ATA creation is permitted only as setup for payment
recipients. It does not authorize the creation of token
accounts for unrelated owners. The challenge expresses a
required split-recipient ATA setup on the split entry itself
with <spanx style="verb">ataCreationRequired: true</spanx>.</t>

<t>Every ATA creation instruction in an SPL token payment
transaction <bcp14>MUST</bcp14> satisfy all of the following:</t>

<t><list style="symbols">
  <t>The instruction <bcp14>MUST</bcp14> be the Associated Token Program's
idempotent create instruction.</t>
  <t>The instruction owner <bcp14>MUST</bcp14> be a recipient listed in
<spanx style="verb">splits</spanx>, subject to the fee payer restrictions below.</t>
  <t>The instruction mint <bcp14>MUST</bcp14> be the challenge <spanx style="verb">currency</spanx>.</t>
  <t>The instruction token program <bcp14>MUST</bcp14> be the challenge
<spanx style="verb">tokenProgram</spanx>. If <spanx style="verb">tokenProgram</spanx> is omitted, the token
program resolved from the mint account is used.</t>
  <t>The ATA address <bcp14>MUST</bcp14> be the canonical Associated Token
Account PDA for the owner, mint, and token program.</t>
  <t>The instruction payer <bcp14>MUST</bcp14> be the transaction fee payer.</t>
</list></t>

<t>When a split sets <spanx style="verb">ataCreationRequired: true</spanx>:</t>

<t><list style="symbols">
  <t>The challenge <spanx style="verb">currency</spanx> <bcp14>MUST</bcp14> be an SPL token mint address.</t>
  <t>The client <bcp14>MUST</bcp14> include an ATA creation instruction for that
split recipient before the split transfer.</t>
  <t>The ATA creation instruction does not create an additional
payment recipient. The client <bcp14>MUST</bcp14> still include the split's
<spanx style="verb">transferChecked</spanx> payment instruction.</t>
</list></t>

<t>In fee-sponsored pull mode (<spanx style="verb">feePayer: true</spanx>), the server fee
payer only authorizes ATA creation for split recipients whose
split entry sets <spanx style="verb">ataCreationRequired: true</spanx>. Clients <bcp14>MUST NOT</bcp14>
include fee-payer-funded ATA creation instructions for the
top-level <spanx style="verb">recipient</spanx>, unmarked split recipients, or arbitrary
owners. If the top-level recipient's ATA does not exist, the
server <bcp14>MUST NOT</bcp14> issue a challenge that requires creating it.</t>

<t>When the client is the transaction fee payer (<spanx style="verb">feePayer</spanx> is
<spanx style="verb">false</spanx> or omitted), clients <bcp14>MAY</bcp14> include ATA creation
instructions only for split recipients, and <bcp14>MUST</bcp14> include one
for each split whose entry sets <spanx style="verb">ataCreationRequired: true</spanx>.
Clients <bcp14>MUST NOT</bcp14> include ATA creation instructions for the
top-level <spanx style="verb">recipient</spanx> or any other owner.</t>

</section>
</section>
<section anchor="confidential"><name>Confidential Transfers</name>

<t>When a challenge sets <spanx style="verb">methodDetails.confidential</spanx> to <spanx style="verb">true</spanx>,
the charge <bcp14>MUST</bcp14> be settled as a Token-2022 Confidential
Transfer <xref target="CONFIDENTIAL-TRANSFER"/>. The transferred amount is
encrypted on-chain under twisted-ElGamal public keys and does
not appear in cleartext in the transaction. This profile
applies only to Token-2022 SPL tokens; it <bcp14>MUST NOT</bcp14> be used for
native SOL.</t>

<section anchor="overview"><name>Overview</name>

<t>A confidential transfer differs from an ordinary
<spanx style="verb">transferChecked</spanx> in three ways that this specification must
accommodate:</t>

<t><list style="numbers" type="1">
  <t><strong>The amount is encrypted.</strong> The server cannot read the
transferred amount from parsed transaction data. Instead, the
server — which is the payment recipient — confirms the amount
it received by decrypting its own confidential balance with
its own ElGamal key (see <xref target="confidential-verification"/>).</t>
  <t><strong>The transfer spans multiple transactions.</strong> The transfer
requires a ciphertext-validity proof, a
ciphertext-ciphertext equality proof, and a range proof
(and, on mints with a confidential transfer fee, additional
fee proofs). These do not fit in a single transaction and
are verified into proof context state accounts first. The
credential therefore carries a transaction bundle
(<xref target="bundle-payload"/>).</t>
  <t><strong>Delivery is two-phase.</strong> Funds received by a confidential
transfer land in the recipient's pending balance and become
spendable only after the recipient applies them. The receipt
reflects this (see <xref target="confidential-receipt"/>).</t>
</list></t>

</section>
<section anchor="prerequisites"><name>Prerequisites</name>

<t>A confidential charge can only succeed when all of the
following hold. Servers <bcp14>MUST NOT</bcp14> issue a confidential challenge,
and clients <bcp14>MUST</bcp14> reject one, unless they are satisfied:</t>

<t><list style="symbols">
  <t>The mint identified by <spanx style="verb">currency</spanx> is owned by the Token-2022
Program and has the <spanx style="verb">ConfidentialTransferMint</spanx> extension
enabled.</t>
  <t>The sender (client) holds a configured confidential token
account for the mint, with sufficient confidential available
balance to cover the amount.</t>
  <t>The recipient holds a configured confidential token account
for the mint. On a mint that does not auto-approve new
accounts, that account <bcp14>MUST</bcp14> already be approved by the mint's
confidential-transfer authority. The server or client cannot
configure or approve the recipient's account on its behalf:
the recipient owns the ElGamal secret, and approval is the
mint authority's prerogative.</t>
</list></t>

<t>Account configuration (<spanx style="verb">ConfigureAccount</spanx>), approval
(<spanx style="verb">ApproveAccount</spanx>), deposit, and <spanx style="verb">ApplyPendingBalance</spanx> are
account-lifecycle operations outside the scope of the charge
intent. They are NOT carried in the charge credential and <bcp14>MUST
NOT</bcp14> appear in the bundle's transactions; the bundle is limited
to proof setup, the transfer, and proof-context cleanup
(<xref target="confidential-verification"/>).</t>

</section>
<section anchor="confidential-amount"><name>Amount Verification</name>

<t>The server is the payment recipient, so it confirms the charged
amount the same way any confidential-account holder reads an
incoming payment: it decrypts the amount credited to its own
confidential token account using its own ElGamal secret key. The
grouped validity proof binds the receiver ciphertext to the same
amount the sender debits, so this recipient-side value is the
authoritative settled amount (<xref target="confidential-verification"/>).
The server holds this key already — it is the key of the
recipient account named by the charge — so no additional secret
custody is required beyond the recipient wallet.</t>

<t>The mint's auditor ElGamal key (the <spanx style="verb">auditorElgamalPubkey</spanx> in
the <spanx style="verb">ConfidentialTransferMint</spanx> extension), when present, is a
distinct facility owned by the mint <strong>issuer</strong> for compliance:
it lets the issuer decrypt amounts across the mint. It is NOT
used for, or required by, charge verification, and the server is
not expected to hold the auditor secret. Servers <bcp14>MUST NOT</bcp14> treat
the auditor handle as their amount-verification mechanism.</t>

</section>
<section anchor="proof-context-state-accounts"><name>Proof Context State Accounts</name>

<t>The client builds the bundle so that, for each required proof,
a proof context state account is created and the proof is
verified into it by the ZK ElGamal Proof Program
<xref target="ZK-ELGAMAL-PROOF"/> before the transfer instruction that
references it. After the transfer, the bundle <bcp14>MUST</bcp14> close those
context state accounts and return their rent to whoever funded
it — the server, under fee sponsorship (<xref target="confidential-rent"/>).</t>

<t>Clients <bcp14>SHOULD</bcp14> minimize the number of transactions by batching
proof verifications subject to the transaction size limit, but
<bcp14>MUST NOT</bcp14> exceed it. Servers <bcp14>MUST</bcp14> treat the bundle as opaque in
count but <bcp14>MUST</bcp14> verify its structure per
<xref target="confidential-verification"/>.</t>

<t>Before generating proofs (which is comparatively expensive),
clients <bcp14>SHOULD</bcp14> pre-flight the transfer: confirm the mint has the
Confidential Transfer extension, that the recipient's account is
configured and allows confidential credits, and that the sender's
decrypted available balance covers the amount. This turns the
common failure modes into fast, local errors instead of a built
bundle that fails on-chain.</t>

</section>
<section anchor="pending-balance-and-delivery-semantics"><name>Pending Balance and Delivery Semantics</name>

<t>A confidential transfer credits the recipient's pending
balance, not its available balance. The funds are delivered but
not yet spendable; only the recipient can convert them with
<spanx style="verb">ApplyPendingBalance</spanx>. A successful confidential charge
therefore attests that the encrypted amount was transferred to
the recipient's confidential account, not that it is
immediately spendable by the recipient. The receipt signals
this with <spanx style="verb">delivery: "pending"</spanx> (<xref target="confidential-receipt"/>).</t>

</section>
<section anchor="restrictions"><name>Restrictions</name>

<t><list style="symbols">
  <t><spanx style="verb">splits</spanx> <bcp14>MUST NOT</bcp14> be combined with <spanx style="verb">confidential</spanx>. Each
confidential split would require its own proof set and
transfer; this is out of scope for <spanx style="verb">draft-00</spanx>. Servers <bcp14>MUST</bcp14>
reject a challenge that sets both.</t>
  <t>Confidential charges <bcp14>MUST</bcp14> use <spanx style="verb">type="bundle"</spanx>. <spanx style="verb">type="signature"</spanx>
and a bare <spanx style="verb">type="transaction"</spanx> <bcp14>MUST NOT</bcp14> be used, and servers
<bcp14>MUST</bcp14> reject them when <spanx style="verb">confidential</spanx> is <spanx style="verb">true</spanx>.</t>
</list></t>

</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 one of
<spanx style="verb">"transaction"</spanx>, <spanx style="verb">"signature"</spanx>, or <spanx style="verb">"bundle"</spanx>. If the
challenge sets <spanx style="verb">confidential: true</spanx>, the type <bcp14>MUST</bcp14> be
<spanx style="verb">"bundle"</spanx>; otherwise it <bcp14>MUST</bcp14> be <spanx style="verb">"transaction"</spanx> or
<spanx style="verb">"signature"</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>If <spanx style="verb">payload.type</spanx> is <spanx style="verb">"signature"</spanx> and the challenge
specifies <spanx style="verb">feePayer: true</spanx>, reject the request (see
<xref target="signature-limitations"/>).</t>
  <t>Proceed with type-specific verification:  <list style="symbols">
      <t>For <spanx style="verb">type="transaction"</spanx>: see <xref target="transaction-verification"/>.</t>
      <t>For <spanx style="verb">type="signature"</spanx>: see <xref target="signature-verification"/>.</t>
      <t>For <spanx style="verb">type="bundle"</spanx>: see <xref target="confidential-verification"/>.</t>
    </list></t>
</list></t>

<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 and verify that it
structurally matches the challenge request:
  <list style="symbols">
      <t>the fee payer matches the challenge policy;</t>
      <t>the transfer authority is signed by the client;</t>
      <t>the transaction contains only expected transfer,
ATA-creation, memo, and compute-budget instructions;</t>
      <t>when <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, ATA-creation instructions
funded by the server fee payer are limited to split
recipients whose split entry sets <spanx style="verb">ataCreationRequired</spanx>
to <spanx style="verb">true</spanx>, as described in <xref target="split-recipient-ata-creation"/>;</t>
      <t>when <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted, ATA-creation
instructions are limited to split recipients;</t>
      <t>the payment semantics match the challenge request,
as described in <xref target="sol-verification"/> or
<xref target="spl-verification"/>.</t>
    </list></t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, add the server's fee payer
signature using the <spanx style="verb">feePayerKey</spanx> and re-serialize.
The transaction <bcp14>MUST</bcp14> have the server's <spanx style="verb">feePayerKey</spanx>
set as the fee payer account.</t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, simulate the transaction
using the <spanx style="verb">simulateTransaction</spanx> RPC method. The
server <bcp14>MUST</bcp14> reject the credential if simulation
fails. If <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted, the
server <bcp14>SHOULD</bcp14> simulate the transaction before
broadcast and <bcp14>SHOULD</bcp14> reject the credential if
simulation indicates the transaction will fail.
This catches invalid transactions without spending
fees, which is especially important in fee payer
mode (see <xref target="fee-payer-risks"/>).</t>
  <t>Broadcast the transaction to the Solana network using
<spanx style="verb">sendTransaction</spanx>.</t>
  <t>Wait for confirmation at the required commitment level.</t>
  <t>Fetch the confirmed transaction using <spanx style="verb">getTransaction</spanx>
with <spanx style="verb">jsonParsed</spanx> encoding and verify the transfer
details still match the challenge request, as described in
<xref target="sol-verification"/> or <xref target="spl-verification"/>.</t>
  <t>Record the transaction signature as consumed to
prevent replay (see <xref target="replay-protection"/>).</t>
  <t>Return the resource with a Payment-Receipt header.</t>
</list></t>

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

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

<t><list style="numbers" type="1">
  <t>Verify that <spanx style="verb">payload.signature</spanx> is present and is a
valid base58-encoded string.</t>
  <t>Verify the transaction signature has not been
previously consumed (see <xref target="replay-protection"/>).</t>
  <t>Fetch the transaction from the Solana network using
the RPC <spanx style="verb">getTransaction</spanx> method with <spanx style="verb">jsonParsed</spanx>
encoding and the <spanx style="verb">confirmed</spanx> commitment level.</t>
  <t>Verify the transaction was successful (no error in
the transaction metadata).</t>
  <t>Verify the transfer details match the challenge
request, as described in <xref target="sol-verification"/> or
<xref target="spl-verification"/>.</t>
  <t>Mark the transaction signature as consumed to
prevent replay.</t>
  <t>Return the resource with a Payment-Receipt header.</t>
</list></t>

<t>Note: both credential types reuse the same on-chain
transfer verification logic defined in
<xref target="sol-verification"/> and <xref target="spl-verification"/>.</t>

</section>
<section anchor="sol-verification"><name>Native SOL Verification</name>

<t>For native SOL payments (<spanx style="verb">currency</spanx> is <spanx style="verb">"sol"</spanx>),
the server <bcp14>MUST</bcp14>:</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 System Program <spanx style="verb">transfer</spanx> instruction in the
transaction's parsed instructions whose <spanx style="verb">destination</spanx>
matches the top-level <spanx style="verb">recipient</spanx> and whose <spanx style="verb">lamports</spanx>
field matches that primary payment amount.</t>
  <t>For each split in <spanx style="verb">splits</spanx>, if any, locate an
additional System Program <spanx style="verb">transfer</spanx> instruction whose
<spanx style="verb">destination</spanx> and <spanx style="verb">lamports</spanx> fields match that split.  <vspace blankLines='1'/>
Each required payment leg <bcp14>MUST</bcp14> be matched to a
distinct transfer instruction. A single transfer
instruction <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 transfer instruction is missing, the
server <bcp14>MUST</bcp14> reject the credential.</t>

</section>
<section anchor="spl-verification"><name>SPL Token Verification</name>

<t>For SPL token payments (<spanx style="verb">currency</spanx> is a mint address,
not <spanx style="verb">"sol"</spanx>), the server <bcp14>MUST</bcp14>:</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 <spanx style="verb">transferChecked</spanx> instruction from the
appropriate token program (Token Program or
Token-2022) in the transaction's parsed instructions
whose <spanx style="verb">mint</spanx> field matches the top-level <spanx style="verb">currency</spanx>
field from the challenge request.</t>
  <t>Derive the expected destination associated token
account for the top-level <spanx style="verb">recipient</spanx> from the
<spanx style="verb">recipient</spanx>, <spanx style="verb">currency</spanx>, and <spanx style="verb">tokenProgram</spanx> in the
challenge request. Verify that at least one matching
<spanx style="verb">transferChecked</spanx> instruction uses that derived ATA
as <spanx style="verb">destination</spanx> and has <spanx style="verb">tokenAmount.amount</spanx> equal
to the primary payment amount.</t>
  <t>For each split in <spanx style="verb">splits</spanx>, if any, derive the
expected destination ATA for that split recipient and
verify that at least one additional <spanx style="verb">transferChecked</spanx>
instruction uses that ATA as <spanx style="verb">destination</spanx> and has
<spanx style="verb">tokenAmount.amount</spanx> equal to the split amount.  <vspace blankLines='1'/>
Each required payment leg <bcp14>MUST</bcp14> be matched to a
distinct <spanx style="verb">transferChecked</spanx> instruction. A single
instruction <bcp14>MUST NOT</bcp14> satisfy more than one required
payment leg, even if multiple legs resolve to the
same destination ATA.</t>
</list></t>

<t>If any required <spanx style="verb">transferChecked</spanx> instruction is missing,
the server <bcp14>MUST</bcp14> reject the credential.</t>

<t>Split recipient ATA creation does not alter SPL transfer
verification. The selected challenge request defines the full
set of required payment legs. A <spanx style="verb">transferChecked</spanx> instruction
to an ATA created by the transaction satisfies a required
payment leg only if that ATA owner appears in <spanx style="verb">splits</spanx> for the
selected challenge.</t>

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

<t>For credentials with <spanx style="verb">type="bundle"</spanx> (confidential charges),
the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Decode each element of <spanx style="verb">payload.transactions</spanx> and
deserialize it. Reject the credential if any element is not
a valid transaction or exceeds the transaction size limit.</t>
  <t>Verify the bundle contains only expected instructions:
proof context state account creation, ZK ElGamal Proof
Program <xref target="ZK-ELGAMAL-PROOF"/> verification instructions, the
confidential <spanx style="verb">Transfer</spanx> or <spanx style="verb">TransferWithFee</spanx> instruction on
the Token-2022 Program, context-account close instructions,
and optionally memo and compute-budget instructions. Any
other instruction — in particular <spanx style="verb">ConfigureAccount</spanx>,
<spanx style="verb">ApproveAccount</spanx>, deposit, withdraw, or <spanx style="verb">ApplyPendingBalance</spanx>
— <bcp14>MUST</bcp14> cause rejection (<xref target="prerequisites"/>).</t>
  <t>Verify the confidential transfer instruction:
  <list style="symbols">
      <t>operates on the mint identified by <spanx style="verb">currency</spanx>;</t>
      <t>uses, as its destination, the recipient's confidential
token account derived from the top-level <spanx style="verb">recipient</spanx> and
the mint;</t>
      <t>references the proof context state accounts created
earlier in the bundle;</t>
      <t>credits the recipient's confidential account (the receiver
ciphertext is bound to the transferred amount by the
grouped validity proof).</t>
    </list></t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, verify every transaction sets the
server's <spanx style="verb">feePayerKey</spanx> as fee payer, that the only rent-funding
instructions are <spanx style="verb">create_account</spanx>s funded by the server and
assigning the new account to the ZK ElGamal Proof Program or
the record program, and that the proof/record accounts name
the server as their authority and rent-reclaim destination
(<xref target="confidential-rent"/>); then add the server's fee payer
signature to each transaction. The server <bcp14>MUST</bcp14> also bound the
number of transactions it will co-sign and submit per bundle.</t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, simulate each transaction before
broadcast and reject the credential on simulated failure.
Otherwise the server <bcp14>SHOULD</bcp14> simulate before broadcast.</t>
  <t>Submit the transactions in array order, waiting for at least
the <spanx style="verb">confirmed</spanx> commitment level on each before submitting
the next. If any transaction fails to land, the server <bcp14>MUST</bcp14>
reject the credential and <bcp14>MUST NOT</bcp14> return a success receipt,
even if earlier transactions in the bundle have landed.</t>
  <t>Confirm the received amount: as the payment recipient, the
server decrypts the amount credited to its own confidential
token account (the increase in its pending balance) using its
own recipient ElGamal secret key, and verifies it equals the
top-level <spanx style="verb">amount</spanx>. If the decrypted amount does not match,
the server <bcp14>MUST</bcp14> reject the credential. This needs no auditor
key — the server already holds the recipient account's key
(see <xref target="confidential-amount"/>).</t>
  <t>Record the signature of the final (transfer) transaction as
consumed to prevent replay (<xref target="replay-protection"/>).</t>
  <t>Return the resource with a Payment-Receipt header
(<xref target="confidential-receipt"/>).</t>
</list></t>

<t>Because the proofs are verified on-chain by the ZK ElGamal
Proof Program, the server does not re-verify the
zero-knowledge proofs itself; it relies on the proofs having
been accepted by the program as a precondition for the transfer
instruction succeeding. The server's independent check is the
recipient-side decryption in step 7, which binds the amount
actually credited to its account to the challenged <spanx style="verb">amount</spanx>.</t>

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

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

<t>The transaction signature is globally unique on the
Solana network, making it a natural replay prevention
token. A signature that has been consumed <bcp14>MUST NOT</bcp14> be
accepted again, even if presented with a different
challenge ID.</t>

<t>For <spanx style="verb">type="transaction"</spanx> credentials, the transaction
signature is derived after broadcast. For
<spanx style="verb">type="signature"</spanx> credentials, the signature is
provided directly by the client.</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="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. The server
optionally adds a fee payer signature and broadcasts:</t>

<figure><artwork><![CDATA[
   Client                        Server                   Solana Network
      |                             |                           |
      |  (1) Authorization:         |                           |
      |      Payment <credential>   |                           |
      |      (signed tx bytes)      |                           |
      |-------------------------->  |                           |
      |                             |                           |
      |                             |  (2) If feePayer: true,   |
      |                             |      co-sign as fee payer |
      |                             |                           |
      |                             |  (3) simulateTransaction  |
      |                             |------------------------>  |
      |                             |  (4) Simulation OK        |
      |                             |<------------------------  |
      |                             |                           |
      |                             |  (5) sendTransaction      |
      |                             |------------------------>  |
      |                             |  (6) Confirmation         |
      |                             |<------------------------  |
      |                             |                           |
      |                             |  (7) getTransaction       |
      |                             |      (verify transfer)    |
      |                             |------------------------>  |
      |                             |  (8) Parsed tx data       |
      |                             |<------------------------  |
      |                             |                           |
      |  (9) 200 OK + Receipt       |                           |
      |<--------------------------  |                           |
      |                             |                           |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client submits credential containing signed transaction
bytes.</t>
  <t>If <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the server co-signs with its
fee payer key.</t>
  <t>Server simulates the transaction to catch failures
without spending fees.</t>
  <t>Server broadcasts the transaction to Solana.</t>
  <t>Transaction reaches the required commitment level.</t>
  <t>Server fetches the confirmed transaction and verifies
the transfer details match the challenge request.</t>
  <t>Server records the signature as consumed and returns
the resource with a Payment-Receipt header whose
<spanx style="verb">reference</spanx> field is the transaction signature.</t>
</list></t>

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

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

<figure><artwork><![CDATA[
   Client                     Server              Solana Network
      |                          |                        |
      |  (1) Build & sign tx     |                        |
      |                          |                        |
      |  (2) sendTransaction     |                        |
      |----------------------------------------------->   |
      |                          |                        |
      |  (3) Poll confirmation   |                        |
      |----------------------------------------------->   |
      |  (4) Confirmed           |                        |
      |<-----------------------------------------------   |
      |                          |                        |
      |  (5) Authorization:      |                        |
      |      Payment <credential>|                        |
      |      (tx signature)      |                        |
      |----------------------->  |                        |
      |                          |  (6) getTransaction    |
      |                          |----------------------> |
      |                          |  (7) Verified          |
      |                          |<---------------------- |
      |                          |                        |
      |  (8) 200 OK + Receipt    |                        |
      |<-----------------------  |                        |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client builds a transfer transaction and signs it.</t>
  <t>Client sends the transaction to the Solana network.</t>
  <t>Client polls for confirmation status.</t>
  <t>Transaction reaches <spanx style="verb">confirmed</spanx> commitment level.</t>
  <t>Client presents the transaction signature as the
credential.</t>
  <t>Server fetches the transaction via RPC and verifies
transfer details.</t>
  <t>Server confirms the payment matches the challenge.</t>
  <t>Server returns the resource with a Payment-Receipt.</t>
</list></t>

</section>
<section anchor="bundle-settlement"><name>Bundle Settlement (type="bundle")</name>

<t>For <spanx style="verb">type="bundle"</spanx> credentials (confidential charges), the
client submits an ordered set of signed transactions and the
server settles them sequentially:</t>

<figure><artwork><![CDATA[
   Client                        Server                   Solana Network
      |                             |                           |
      |  (1) Authorization:         |                           |
      |      Payment <credential>   |                           |
      |      (signed tx bundle)     |                           |
      |-------------------------->  |                           |
      |                             |                           |
      |                             |  (2) Verify bundle        |
      |                             |      structure            |
      |                             |                           |
      |                             |  (3) For each tx in order:|
      |                             |      co-sign (if fee      |
      |                             |      payer), simulate,    |
      |                             |      send, await confirm  |
      |                             |------------------------>  |
      |                             |<------------------------  |
      |                             |                           |
      |                             |  (4) getTransaction on    |
      |                             |      final transfer       |
      |                             |------------------------>  |
      |                             |<------------------------  |
      |                             |                           |
      |                             |  (5) Decrypt own received |
      |                             |      amount (recipient    |
      |                             |      key); == challenge   |
      |                             |                           |
      |  (6) 200 OK + Receipt       |                           |
      |<--------------------------  |                           |
      |                             |                           |
]]></artwork></figure>

<t><list style="numbers" type="1">
  <t>Client submits the credential containing the ordered
transaction bundle.</t>
  <t>Server verifies the bundle structure
(<xref target="confidential-verification"/>).</t>
  <t>Server co-signs (when fee payer), simulates, broadcasts, and
confirms each transaction in array order. If any transaction
fails to land, settlement aborts and no success receipt is
returned.</t>
  <t>Server fetches the confirmed final transfer transaction.</t>
  <t>As the recipient, the server decrypts the amount credited to
its own confidential account with its own ElGamal key and
verifies it equals the challenge <spanx style="verb">amount</spanx>.</t>
  <t>Server records the final transfer signature as consumed and
returns the resource with a Payment-Receipt header whose
<spanx style="verb">reference</spanx> is that signature and whose <spanx style="verb">delivery</spanx> is
<spanx style="verb">"pending"</spanx> (<xref target="confidential-receipt"/>).</t>
</list></t>

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

<section anchor="native-sol"><name>Native SOL</name>

<t>The client <bcp14>MUST</bcp14> construct a transaction containing a
System Program <spanx style="verb">transfer</spanx> instruction with:</t>

<t><list style="symbols">
  <t><spanx style="verb">source</spanx>: the client's signing account</t>
  <t><spanx style="verb">destination</spanx>: the <spanx style="verb">recipient</spanx> from the challenge</t>
  <t><spanx style="verb">lamports</spanx>: the <spanx style="verb">amount</spanx> from the challenge</t>
</list></t>

</section>
<section anchor="spl-tokens"><name>SPL Tokens</name>

<t>The client <bcp14>MUST</bcp14> construct a transaction containing:</t>

<t><list style="numbers" type="1">
  <t>Zero or more idempotent Associated Token Account creation
instructions permitted by <xref target="split-recipient-ata-creation"/>:
  <list style="symbols">
      <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx>, the client <bcp14>MUST</bcp14> include an
idempotent ATA creation instruction for each split
recipient whose split entry sets <spanx style="verb">ataCreationRequired</spanx> to
<spanx style="verb">true</spanx>, and <bcp14>MUST NOT</bcp14> include ATA creation instructions
for the top-level <spanx style="verb">recipient</spanx>, unmarked split recipients,
or arbitrary owners.</t>
      <t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">false</spanx> or omitted, the client <bcp14>MAY</bcp14>
include idempotent ATA creation instructions only for split
recipients, and <bcp14>MUST</bcp14> include one for each split whose entry
sets <spanx style="verb">ataCreationRequired</spanx> to <spanx style="verb">true</spanx>. The client <bcp14>MUST NOT</bcp14>
include ATA creation instructions for the top-level
<spanx style="verb">recipient</spanx>.</t>
    </list>
The transaction fee payer covers the rent-exempt minimum
(~0.002 SOL) if the account does not exist.</t>
  <t>A <spanx style="verb">transferChecked</spanx> instruction on the appropriate
token program for the primary payment, and one additional
<spanx style="verb">transferChecked</spanx> instruction for each split. Each transfer
uses:
  <list style="symbols">
      <t><spanx style="verb">source</spanx>: the client's associated token account</t>
      <t><spanx style="verb">mint</spanx>: the <spanx style="verb">currency</spanx> field</t>
      <t><spanx style="verb">destination</spanx>: the payment recipient's derived ATA</t>
      <t><spanx style="verb">authority</spanx>: the client's signing account</t>
      <t><spanx style="verb">amount</spanx>: the primary remainder or split amount</t>
      <t><spanx style="verb">decimals</spanx>: the <spanx style="verb">decimals</spanx> from <spanx style="verb">methodDetails</spanx></t>
    </list></t>
</list></t>

</section>
<section anchor="fee-payer-configuration"><name>Fee Payer Configuration</name>

<t>When <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx> in the challenge:</t>

<t><list style="symbols">
  <t>The client <bcp14>MUST</bcp14> set the server's <spanx style="verb">feePayerKey</spanx> as the
transaction fee payer.</t>
  <t>The client <bcp14>MUST</bcp14> sign the transaction only with its own
key (transfer authority).</t>
  <t>The fee payer signature slot <bcp14>MUST</bcp14> be left empty for the
server to fill.</t>
</list></t>

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

<t><list style="symbols">
  <t>The client <bcp14>MUST</bcp14> set itself as the transaction fee payer.</t>
  <t>The client <bcp14>MUST</bcp14> fully sign the transaction.</t>
</list></t>

<t>Clients <bcp14>SHOULD</bcp14> set a compute unit limit and priority
fee appropriate for current network conditions.</t>

</section>
</section>
<section anchor="confirmation-requirements"><name>Confirmation Requirements</name>

<t>For <spanx style="verb">type="signature"</spanx> credentials, clients <bcp14>MUST</bcp14> wait for
at least the <spanx style="verb">confirmed</spanx> commitment level before presenting
the credential. Servers <bcp14>MUST</bcp14> fetch the transaction with at
least <spanx style="verb">confirmed</spanx> commitment. Servers <bcp14>MAY</bcp14> require
<spanx style="verb">finalized</spanx> commitment for high-value transactions.</t>

<t>For <spanx style="verb">type="transaction"</spanx> credentials, the server controls
the broadcast and confirmation process. Servers <bcp14>MUST</bcp14> wait
for at least <spanx style="verb">confirmed</spanx> commitment before returning the
receipt.</t>

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

<t>Solana provides two commitment levels relevant to
payment verification:</t>

<t><list style="symbols">
  <t><spanx style="verb">confirmed</spanx>: optimistic confirmation from a
supermajority of validators (~400ms). Sufficient
for most payment use cases.</t>
  <t><spanx style="verb">finalized</spanx>: deterministic finality after ~31 slots
(~12 seconds). Required for high-value transactions
where rollback risk is unacceptable.</t>
</list></t>

<t>In theory, a <spanx style="verb">confirmed</spanx> transaction could be rolled
back if validators shift consensus to a competing fork
that excludes the confirmed block. In practice, this
has never occurred on Solana mainnet. The <spanx style="verb">confirmed</spanx>
level is <bcp14>RECOMMENDED</bcp14> as the default for payment
verification to minimize latency.</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 Solana 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">"solana"</spanx></c>
      <c><spanx style="verb">challengeId</spanx></c>
      <c>string</c>
      <c>The challenge <spanx style="verb">id</spanx> from <spanx style="verb">WWW-Authenticate</spanx></c>
      <c><spanx style="verb">reference</spanx></c>
      <c>string</c>
      <c>The transaction signature (base58-encoded)</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"/> verification time</c>
</texttable>

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

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "5UfDuX7hXbPjGUpTmt9PHRLsNGJe4dEny...",
  "status": "success",
  "timestamp": "2026-03-10T21:00:00Z"
}
]]></sourcecode></figure>

</section>
<section anchor="confidential-receipt"><name>Confidential Charge Receipt</name>

<t>For a confidential charge (<spanx style="verb">type="bundle"</spanx>), the <spanx style="verb">reference</spanx>
is the signature of the final confidential transfer
transaction, and the receipt includes one additional field:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">delivery</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"pending"</spanx> — the transferred amount was credited to the recipient's pending balance and becomes spendable only after the recipient applies it (see <xref target="confidential"/>).</c>
</texttable>

<t>The receipt <bcp14>MUST NOT</bcp14> include the cleartext transferred amount;
the amount is encrypted on-chain, and the server learns it only
by decrypting the amount credited to its own recipient account
for verification purposes.</t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "5UfDuX7hXbPjGUpTmt9PHRLsNGJe4dEny...",
  "status": "success",
  "delivery": "pending",
  "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", "Amount mismatch", "Signature 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": "Transfer Mismatch",
  "status": 402,
  "detail": "Destination token account does not belong to expected recipient"
}
]]></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. Solana
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 signatures and
reject any signature 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 signature. Transaction signatures are
globally unique on the Solana network (derived from the
signer's key and the blockhash), making them natural
replay prevention tokens.</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 asset</t>
  <t><spanx style="verb">recipient</spanx> is the expected party</t>
  <t>If <spanx style="verb">currency</spanx> is a mint address, verify it is a known token</t>
  <t><spanx style="verb">splits</spanx>, if present, contain expected recipients
and amounts — malicious servers could add splits
to redirect funds</t>
  <t><spanx style="verb">feePayerKey</spanx>, if present, is the expected server</t>
  <t>If <spanx style="verb">confidential</spanx> is <spanx style="verb">true</spanx>, the recipient has a configured
(and, where required, approved) confidential token account,
and <spanx style="verb">auditorElgamalPubkey</spanx>, if present, matches the mint's
on-chain <spanx style="verb">ConfidentialTransferMint</spanx> auditor key</t>
</list></t>

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

</section>
<section anchor="rpc-trust"><name>RPC Trust</name>

<t>The server relies on its Solana RPC endpoint to
provide accurate transaction data for on-chain
verification. A compromised RPC could return
fabricated transaction data, causing the server to
accept payments that were never made. Servers <bcp14>SHOULD</bcp14>
use trusted RPC providers or run their own nodes.</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-chain. A party monitoring the chain could attempt
to present the same signature to the server. The
challenge binding (the credential echoes the challenge
<spanx style="verb">id</spanx>, which is HMAC-verified) and single-use signature
enforcement mitigate this: only the party that received
the challenge can construct a valid credential.</t>

<t>Push mode does not require the on-chain transaction to
carry a challenge-specific marker. It proves that a
payment matching the challenged terms was made, but not
necessarily that the payment was created for one unique
challenge instance. If multiple valid challenges have
identical terms, the same confirmed transaction could
satisfy any one of them, and the first accepted
presentation wins.</t>

<t>Requiring an on-chain marker such as a Memo carrying
the challenge <spanx style="verb">id</spanx> would provide stronger binding, but
would also reveal extra correlation metadata on chain.
This specification does not require such a marker in
the base flow, but implementations <bcp14>MAY</bcp14> define a
backward-compatible profile that does.</t>

<t>Pull mode is not susceptible to front-running because
the transaction is not broadcast until the server
receives and validates the credential.</t>

</section>
<section anchor="fee-payer-risks"><name>Fee Payer Risks</name>

<t>Servers acting as fee payers accept financial risk in
exchange for providing a seamless payment experience.</t>

<dl>
  <dt>Denial of Service via Bad Transactions</dt>
  <dd>
    <t>Malicious clients could submit transactions that
fail on-chain (insufficient balance, invalid
instructions), causing the server to pay ~5,000
lamports per failed transaction. Mitigations:
</t>

    <t><list style="symbols">
      <t><strong>Transaction simulation</strong>: <spanx style="verb">simulateTransaction</spanx>
catches most failures before broadcast, without
spending fees. Servers <bcp14>MUST</bcp14> simulate fee-sponsored
pull mode transactions before broadcasting.
Servers <bcp14>SHOULD</bcp14> simulate non-fee-sponsored pull
mode transactions before broadcasting.</t>
      <t><strong>Rate limiting</strong>: per client address, per IP, or
per time window.</t>
      <t><strong>Balance verification</strong>: check the client's
balance covers the transfer amount before signing.</t>
      <t><strong>Client authentication</strong>: require API keys or
OAuth tokens before accepting fee-sponsored
transactions.</t>
    </list></t>
  </dd>
  <dt>ATA Rent Drain</dt>
  <dd>
    <t>When the fee payer funds creation of an Associated
Token Account (ATA), it pays ~0.002 SOL in rent.
The recipient can close the ATA to reclaim rent,
then the next payment re-creates it at the fee
payer's expense. Servers <bcp14>SHOULD</bcp14> verify the
top-level recipient's ATA exists before issuing a
challenge, because top-level recipient ATA creation is not
allowed by this specification. For split recipients,
servers that set <spanx style="verb">ataCreationRequired: true</spanx> are explicitly
accepting rent risk for those split recipient ATAs and <bcp14>SHOULD</bcp14>
apply stricter rate limits, authentication, and cost-recovery
policy.</t>
  </dd>
  <dt>Fee Payer Balance Exhaustion</dt>
  <dd>
    <t>Servers <bcp14>MUST</bcp14> monitor fee payer balance and reject
new fee-sponsored requests when insufficient. The
server <bcp14>SHOULD</bcp14> return a 402 with <spanx style="verb">feePayer: false</spanx>,
allowing the client to pay its own fees as fallback.</t>
  </dd>
</dl>

</section>
<section anchor="transaction-payload-security"><name>Transaction Payload Security</name>

<t>In pull mode, the server receives raw transaction
bytes from the client. A malicious client could craft
a transaction that transfers funds FROM the server's
fee payer account rather than simply paying fees.</t>

<t>Servers <bcp14>MUST</bcp14> verify that the transaction contains
only the expected instructions: transfer instruction(s)
matching the challenge parameters, ATA creation
(idempotent), and optionally compute budget
instructions. Any unexpected instructions <bcp14>MUST</bcp14> cause
rejection.</t>

</section>
<section anchor="blockhash-freshness"><name>Blockhash Freshness</name>

<t>When the server provides <spanx style="verb">recentBlockhash</spanx> in the
challenge, clients <bcp14>SHOULD</bcp14> verify it is plausible
(not obviously stale). A malicious server could
provide an expired blockhash, causing the client to
sign a transaction that will never land — wasting
the signing effort. However, since the transaction
is not broadcast by the client in pull mode, the
practical risk is limited to a failed payment
attempt that the client can retry.</t>

</section>
<section anchor="confidential-key"><name>Recipient Key (Confidential)</name>

<t>Confidential charge verification uses the server's <strong>recipient</strong>
ElGamal key — the key of the confidential token account named as
the payee. The server derives this key from the recipient
wallet it already controls, so verification introduces no new
high-value secret beyond that wallet. Servers <bcp14>SHOULD</bcp14> derive it
on demand rather than persist it separately. Compromise of the
recipient key reveals the amounts that account received (the
same exposure as losing the payee wallet); it does not by itself
permit theft.</t>

<t>The mint's <strong>auditor</strong> key, if the mint configures one, is a
separate facility held by the mint <strong>issuer</strong> for compliance —
it is not held by the server and plays no role in charge
verification. Conflating the auditor with the payee would
couple the payment provider to the stablecoin issuer; this
specification deliberately keeps them distinct.</t>

</section>
<section anchor="confidential-rent"><name>Proof Context Rent Drain (Confidential)</name>

<t>Proof context state accounts (and the range-proof record
account) are rent-bearing. The paying client typically holds no
SOL, so it cannot fund this rent — the server (fee payer) does.
A naive design where the server funds rent but the client
controls those accounts would let a malicious client withhold
the closing transaction and strand the server's rent, analogous
to the ATA rent drain in <xref target="fee-payer-risks"/>. This profile
avoids that by making the server the <strong>authority</strong> of every
proof/record account it funds: the bundle <bcp14>MUST</bcp14> create these
accounts with the server's <spanx style="verb">feePayerKey</spanx> as funder and as
<spanx style="verb">context_state_authority</spanx> (and record authority), and <bcp14>MUST</bcp14>
close them back to the server within the bundle, so that net
rent is approximately zero on success.</t>

<t>The server protects itself two ways: (1) before co-signing, it
verifies each transaction contains only allow-listed
instructions and that every <spanx style="verb">create_account</spanx> is server-funded
and assigns the new account to the ZK ElGamal Proof Program or
the record program (<xref target="confidential-verification"/>); and (2)
because it is the authority of any account a partial failure
leaves open, it can reclaim that rent itself (see below).
Servers <bcp14>MUST</bcp14> reject bundles whose <spanx style="verb">create_account</spanx> instructions
name a funder other than the server or assign the account to any
other program.</t>

</section>
<section anchor="partial-bundle-settlement-confidential"><name>Partial Bundle Settlement (Confidential)</name>

<t>A confidential transfer is settled across multiple
transactions. If settlement aborts after some transactions have
landed, on-chain state may include created proof/record accounts
without a completed transfer. The server <bcp14>MUST NOT</bcp14> return a
success receipt in this case. Because the server funded the rent
and is the authority of those accounts, the stranded rent is the
server's to reclaim: servers <bcp14>SHOULD</bcp14> run a periodic sweep that
closes proof/record accounts they own that were left open by
aborted bundles, returning the rent to themselves. To avoid
closing an account that belongs to a settlement still in flight
(which creates and closes its accounts within one bounded
settlement), the sweep <bcp14>SHOULD</bcp14> only close an account observed
across two successive sweeps separated by more than the
settlement window. Servers <bcp14>SHOULD</bcp14> also bound the time and number
of transactions they will settle for a single credential to
limit resource exhaustion.</t>

</section>
<section anchor="amount-privacy-scope-confidential"><name>Amount Privacy Scope (Confidential)</name>

<t>The confidential profile hides the transferred amount from
public on-chain observers. It does not hide the amount from the
challenge exchange itself: the <spanx style="verb">amount</spanx> field travels in the
challenge and credential over TLS, and the server learns the
amount both from the challenge and by decrypting the amount
credited to its own recipient account. Confidentiality is
therefore relative to third-party chain observers, not to the
counterparties (nor any auditor the mint issuer configures).
Sender and recipient account identities, and the fact that a
confidential transfer occurred, remain visible on-chain.</t>

<t>Metadata beyond the amount also stays visible — in particular,
any memo. To avoid re-linking a confidential payment to a
specific order, this profile does NOT write an order/<spanx style="verb">externalId</spanx>
memo on-chain by default; servers <bcp14>SHOULD</bcp14> reconcile a confidential
settlement by the globally-unique signature of its final
(transfer) transaction, returned on the receipt, rather than an
on-chain marker. A server that does include a memo <bcp14>MUST</bcp14> treat the
resulting order-id linkage as an explicit privacy trade-off, and
<bcp14>MUST</bcp14> verify any memo present in the bundle matches the value it
issued in the challenge.</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">solana</spanx></c>
      <c>Solana blockchain native SOL and SPL 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">solana</spanx></c>
      <c>One-time SOL or SPL 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="SOLANA-DOCS" target="https://solana.com/docs">
  <front>
    <title>Solana Documentation</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="SPL-TOKEN" target="https://solana.com/docs/tokens">
  <front>
    <title>SPL Token Program</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="SPL-TOKEN-2022" target="https://solana.com/docs/tokens/extensions">
  <front>
    <title>SPL Token-2022 Program</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="CONFIDENTIAL-TRANSFER" target="https://www.solana-program.com/docs/confidential-balances">
  <front>
    <title>Token-2022 Confidential Transfer Extension</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="ZK-ELGAMAL-PROOF" target="https://docs.anza.xyz/runtime/zk-elgamal-proof">
  <front>
    <title>ZK ElGamal Proof Program</title>
    <author >
      <organization>Anza</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>
<reference anchor="BASE58" target="https://datatracker.ietf.org/doc/html/draft-msporny-base58-03">
  <front>
    <title>Base58 Encoding Scheme</title>
    <author initials="M." surname="Sporny" fullname="Manu Sporny">
      <organization></organization>
    </author>
    <date year="2023"/>
  </front>
</reference>


    </references>

</references>


<?line 1990?>

<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="native-sol-charge-pull-mode"><name>Native SOL Charge (Pull Mode)</name>

<t>A 0.01 SOL charge for weather API access.</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="solana",
  intent="charge",
  request="eyJhbW91bnQiOiIxMDAwMDAwMCIsImN1cnJlbmN5Ij
    oiU09MIiwiZGVzY3JpcHRpb24iOiJXZWF0aGVyIEFQSSBhY2
    Nlc3MiLCJtZXRob2REZXRhaWxzIjp7Im5ldHdvcmsiOiJtYWl
    ubmV0LWJldGEiLCJyZWZlcmVuY2UiOiJmNDdhYzEwYi01OGNj
    LTQzNzItYTU2Ny0wZTAyYjJjM2Q0NzkifSwicmVjaXBpZW50I
    joiN3hLWHRnMkNXODdkOTdUWEpTRHBiRDVqQmtoZVRxQTgzVF
    pSdUpvc2dBc1UifQ",
  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": "10000000",
  "currency": "sol",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Weather API access",
  "methodDetails": {
    "network": "mainnet"
  }
}
]]></sourcecode></figure>

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

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

<t>Decoded credential:</t>

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

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

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

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

<t>Decoded receipt:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "4vJ9YFuPzUgdLkWYJf3KqfNM8cTnBp3jXx...",
  "status": "success",
  "timestamp": "2026-03-15T12:04:58Z"
}
]]></sourcecode></figure>

</section>
<section anchor="spl-token-usdc-charge-with-fee-sponsorship"><name>SPL Token (USDC) Charge with Fee Sponsorship</name>

<t>A 1 USDC charge where the server sponsors transaction fees
and includes a <spanx style="verb">recentBlockhash</spanx> to eliminate client RPC
dependency.</t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Premium API call",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "feePayer": true,
    "feePayerKey": "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr",
    "recentBlockhash": "EkSnNWid2cvwEVnVx9aBqawnmiCNiDgp3gUdkDPTKN1N"
  }
}
]]></sourcecode></figure>

<t>The client uses <spanx style="verb">recentBlockhash</spanx> from the challenge (no RPC
call needed), sets <spanx style="verb">feePayerKey</spanx> as the transaction fee payer,
and partially signs with its own key only. The server
verifies the transaction contents, co-signs as fee payer,
and broadcasts.</t>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": { "..." : "echoed challenge" },
  "payload": {
    "type": "transaction",
    "transaction": "<base64-encoded partially-signed tx>"
  }
}
]]></sourcecode></figure>

</section>
<section anchor="push-mode-typesignature"><name>Push Mode (type="signature")</name>

<t>The client broadcasts the transaction itself and presents
the confirmed signature. Cannot be used with fee sponsorship.</t>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": { "..." : "echoed challenge" },
  "payload": {
    "type": "signature",
    "signature": "4vJ9YFuPzUgdLkWYJf3KqfNM8cTnBp3jXx..."
  }
}
]]></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": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Marketplace purchase",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "splits": [
      {
        "recipient": "3pF8Kg2aHbNvJkLMwEqR7YtDxZ5sGhJn4UV6mWcXrT9A",
        "amount": "50000",
        "memo": "platform fee"
      }
    ]
  }
}
]]></sourcecode></figure>

<t>The client builds a transaction with two transfers: 1,000,000
base units to the primary recipient and 50,000 to the platform.
The total paid remains 1,050,000 base units, matching the
top-level <spanx style="verb">amount</spanx>.</t>

</section>
<section anchor="confidential-charge-bundle"><name>Confidential Charge (Bundle)</name>

<t>A 1-token confidential charge with server-sponsored fees. The
amount is encrypted on-chain; the server, as recipient, verifies
it by decrypting the amount credited to its own account.</t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "1000000",
  "currency": "HVWf8JmLoHs99Lw8Psf3fyqAtA4crWxCPkrmSdNjhNH3",
  "recipient": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
  "description": "Confidential API call",
  "methodDetails": {
    "network": "mainnet",
    "decimals": 6,
    "tokenProgram": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
    "feePayer": true,
    "feePayerKey": "9aE3Fg7HjKLmNpQr5TuVwXyZ2AbCdEf8GhIjKlMnOp1R",
    "confidential": true
  }
}
]]></sourcecode></figure>

<t>The client confirms the recipient has an approved confidential
token account, builds the proof-context-setup and
confidential-transfer transactions (each with <spanx style="verb">feePayerKey</spanx> as
fee payer and signed only by the transfer authority), and
presents them as a bundle.</t>

<t>Decoded credential:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": { "..." : "echoed challenge" },
  "payload": {
    "type": "bundle",
    "transactions": [
      "<base64-encoded proof-context-setup tx>",
      "<base64-encoded confidential-transfer tx>"
    ]
  }
}
]]></sourcecode></figure>

<t>Decoded receipt:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "challengeId": "kM9xPqWvT2nJrHsY4aDfEb",
  "reference": "5UfDuX7hXbPjGUpTmt9PHRLsNGJe4dEny...",
  "status": "success",
  "delivery": "pending",
  "timestamp": "2026-03-15T12:04:58Z"
}
]]></sourcecode></figure>

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

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

</section>


  </back>

<!-- ##markdown-source:
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
RiOEZU9nOUeXQB67QL6O9/8DjHNyo2lKAQA=

-->

</rfc>

