<?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-subscription-00" category="info" submissionType="independent">
  <front>
    <title abbrev="Solana Subscription">Solana Subscription 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="" surname="" fullname="Jo D.">
      <organization>Solana Foundation</organization>
      <address>
        <email>jo.desormeaux@solana.org</email>
      </address>
    </author>

    <date year="2026" month="October" day="26"/>

    
    
    

    <abstract>


<?line 83?>

<t>This document defines the Solana profile of the "subscription"
payment intent for use with the Payment HTTP Authentication Scheme.
It specifies how clients grant servers permission to collect a fixed
SPL token payment once per billing period using a subscription
delegation held by an audited on-chain program. This profile
also defines a reusable payer-signed bearer proof for access under an
active subscription. It intentionally models the recurring transfer
authorization itself, not a richer billing object.</t>



    </abstract>



  </front>

  <middle>


<?line 94?>

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

<t>The "subscription" intent on Solana represents a recurring
fixed-amount SPL token payment. The client grants the server a
recipient-scoped subscription delegation with a per-period spending
limit. Activation creates the delegation and collects the first
billing-period charge in the same transaction.</t>

<t>This intent is useful for recurring API plans, content subscriptions,
and other Solana-priced services with a stable amount per billing
period.</t>

<t>This profile is intentionally narrower than a general billing
subscription. It standardizes a recurring token-transfer authorization,
not price catalogs, quantities, prorations, deferred starts, or
billing-anchor resets.</t>

<section anchor="relationship-to-the-subscription-intent"><name>Relationship to the Subscription Intent</name>

<t>This document inherits the shared request semantics of the
"subscription" intent from <xref target="I-D.payment-intent-subscription"/>. It
defines only the Solana-specific <spanx style="verb">methodDetails</spanx>, <spanx style="verb">payload</spanx>,
activation transaction shape, on-chain lifecycle, and verification
procedures for the "solana" payment method.</t>

<t>Solana subscriptions support only subscription-delegation
fulfillment. Solana transactions containing standalone SPL Token
<spanx style="verb">Approve</spanx> instructions and push-mode hash credentials do not provide
the per-period enforcement required for this intent.</t>

<t>Solana also imposes an additional constraint that is not part of the
shared intent: the recurring authorization <bcp14>MUST</bcp14> be created against a
<spanx style="verb">Plan</spanx> account that the merchant has published on-chain prior to the
challenge. This method therefore requires the base58 address of that
on-chain plan in <spanx style="verb">methodDetails.planAddress</spanx>. The shared <spanx style="verb">externalId</spanx>
field retains its meaning as the merchant's reference for the
subscription.</t>

<t>Solana subscriptions also require the per-period spending limit,
recipient scoping, and missed-period non-accumulation described in
this document, including the Token-2022 mint constraints in
<xref target="token-extension-policy"/>. Servers <bcp14>MUST</bcp14> reject request objects on
deployments that cannot enforce those restrictions.</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>

<t>This document uses the terms <spanx style="verb">Subscription</spanx>, <spanx style="verb">Billing Period</spanx>,
<spanx style="verb">Activation</spanx>, <spanx style="verb">Renewal</spanx>, <spanx style="verb">Cancellation</spanx>, and <spanx style="verb">Subscription Identifier</spanx>
as defined by <xref target="I-D.payment-intent-subscription"/>. The following
additional terms are specific to the Solana profile.</t>

<dl>
  <dt>SPL Token</dt>
  <dd>
    <t>Solana's standard token program. SPL Token-2022 is its extension-
enabled successor and is supported subject to <xref target="token-extension-policy"/>.</t>
  </dd>
  <dt>Subscriptions Program</dt>
  <dd>
    <t>The audited on-chain program implementing the account model and
instructions referenced by this specification
<xref target="SUBSCRIPTIONS-PROGRAM"/>.</t>
  </dd>
  <dt>Plan</dt>
  <dd>
    <t>An on-chain PDA published by the merchant that defines
subscription terms and lifecycle controls. Core billing terms --
token mint, amount per billing period, period length, creation
timestamp, and recipient destinations -- are immutable, while
status, end timestamp, allowed pullers, and metadata URI are mutable
until the plan is sunset. Derived from
<spanx style="verb">["plan", owner, plan_id]</spanx>.</t>
  </dd>
  <dt>Puller</dt>
  <dd>
    <t>The plan owner or an address in the on-chain <spanx style="verb">Plan.pullers</spanx> array
that signs a <spanx style="verb">transfer_subscription</spanx> instruction. This profile uses
the program's <spanx style="verb">puller</spanx> name for the server-controlled signing
address authorized to collect subscription charges.</t>
  </dd>
  <dt>Subscription Delegation</dt>
  <dd>
    <t>A per-subscriber on-chain PDA that snapshots the plan terms at
subscription time and tracks current-period accounting state.
Derived from <spanx style="verb">["subscription", plan_pda, subscriber]</spanx>.</t>
  </dd>
  <dt>Subscription Authority</dt>
  <dd>
    <t>A per-(subscriber, mint) on-chain PDA that holds the SPL Token
delegate authority over the associated token account for that
subscriber. The subscriptions program signs transfers as this PDA.
Derived from <spanx style="verb">["SubscriptionAuthority", subscriber, mint]</spanx>.</t>
  </dd>
</dl>

</section>
<section anchor="intent-semantics"><name>Intent Semantics</name>

<section anchor="definition"><name>Definition</name>

<t>The "subscription" intent on Solana represents a request for a
recurring fixed-amount SPL token payment of <spanx style="verb">amount</spanx>, charged once
per billing period until explicit cancellation, until the on-chain
subscription delegation is otherwise invalidated, or until the
optional <spanx style="verb">subscriptionExpires</spanx> timestamp is reached.</t>

<t>On Solana, the recurring authorization is held by an audited on-chain
program <xref target="SUBSCRIPTIONS-PROGRAM"/>. Servers <bcp14>MUST</bcp14> pin its deployment
address in <spanx style="verb">methodDetails.subscriptionProgram</spanx>, and clients <bcp14>MUST</bcp14> validate that
address before signing. The program defines three on-chain accounts
referenced by this specification:</t>

<t><list style="symbols">
  <t><strong>Plan</strong>, published off the critical path of the 402 challenge by
the merchant. The plan's core terms (mint, amount per billing
period, period length, destinations) are immutable once published.</t>
  <t><strong>SubscriptionDelegation</strong>, created when the subscriber activates a
subscription. The delegation snapshots the plan's terms and tracks
the current billing-period start time and the amount already pulled
in the current period.</t>
  <t><strong>SubscriptionAuthority</strong>, created per <spanx style="verb">(subscriber, mint)</spanx> and
acting as the on-chain delegate over the subscriber's token
account.</t>
</list></t>

<t>The program enforces per-period spending limits, recipient scoping,
and missed-period non-accumulation. When a transfer occurs after one
or more billing periods have elapsed, renewals advance the current
billing-period start by whole multiples of the period length and reset
the in-period counter to zero. Although the on-chain primitive permits
partial transfers up to a per-period cap, this HTTP profile permits
only one transfer of exactly <spanx style="verb">amount</spanx> per billing period.</t>

</section>
<section anchor="properties"><name>Properties</name>

<texttable>
      <ttcol align='left'>Property</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c><strong>Intent Identifier</strong></c>
      <c><spanx style="verb">subscription</spanx></c>
      <c><strong>Payment Timing</strong></c>
      <c>Recurring (activation charge atomic with delegation creation, then once per period via server-driven pulls)</c>
      <c><strong>Idempotency</strong></c>
      <c>Activation credential single-use; bearer proof reusable while the subscription remains usable; on-chain delegation reusable across billing periods</c>
      <c><strong>Reversibility</strong></c>
      <c>Cancellable on-chain; effective at end of currently-paid billing period</c>
</texttable>

</section>
<section anchor="flow"><name>Flow</name>

<t>The following diagram illustrates the Solana subscription flow:</t>

<figure><artwork><![CDATA[
   Client                        Server                          Solana
      │                             │                             │
      │  (1) GET /api/resource      │                             │
      │-------------------------->  │                             │
      │                             │                             │
      │  (2) 402 Payment Required   │                             │
      │      intent="subscription"  │                             │
      │<--------------------------  │                             │
      │                             │                             │
      │  (3) Sign activation tx     │                             │
      │      + bearer proof         │                             │
      │                             │                             │
      │  (4) Authorization: Payment │                             │
      │-------------------------->  │                             │
      │                             │                             │
      │                             │  (5) Sign as puller and     │
      │                             │      broadcast              │
      │                             │      subscription delegation│
      │                             │      + first transfer       │
      │                             │-------------------------->  │
      │                             │                             │
      │  (6) 200 OK + Receipt       │                             │
      │<--------------------------  │                             │
      │                             │                             │
      │  (7) GET /api/resource      │                             │
      │      + bearer proof         │                             │
      │-------------------------->  │                             │
      │                             │                             │
      │        ... later period ... │                             │
      │                             │                             │
      │                             │  (8) transfer_subscription  │
      │                             │      (server-driven pull)   │
      │                             │-------------------------->  │
      │                             │                             │
      │  (9) 200 OK + Receipt       │                             │
      │<--------------------------  │                             │
      │                             │                             │
]]></artwork></figure>

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

<t>The <spanx style="verb">request</spanx> parameter in the <spanx style="verb">WWW-Authenticate</spanx> challenge contains a
base64url-encoded JSON object. The <spanx style="verb">request</spanx> JSON <bcp14>MUST</bcp14> be serialized
using JSON Canonicalization Scheme (JCS) <xref target="RFC8785"/> and
base64url-encoded without padding per <xref target="I-D.httpauth-payment"/>.</t>

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

<t>Solana uses the shared <spanx style="verb">amount</spanx>, <spanx style="verb">currency</spanx>, <spanx style="verb">periodUnit</spanx>,
<spanx style="verb">periodCount</spanx>, <spanx style="verb">subscriptionExpires</spanx>, <spanx style="verb">recipient</spanx>, <spanx style="verb">description</spanx>, and
<spanx style="verb">externalId</spanx> fields from <xref target="I-D.payment-intent-subscription"/>, with
their meanings preserved. The Solana profile elevates <spanx style="verb">recipient</spanx> from
<bcp14>OPTIONAL</bcp14> to <bcp14>REQUIRED</bcp14> and constrains the values that <spanx style="verb">periodUnit</spanx> may
take.</t>

<section anchor="required-fields"><name>Required Fields</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">amount</spanx></c>
      <c>string</c>
      <c>Fixed payment amount per billing period in base units</c>
      <c><spanx style="verb">currency</spanx></c>
      <c>string</c>
      <c>SPL Token or Token-2022 mint address (see <xref target="currency-formats"/>)</c>
      <c><spanx style="verb">periodUnit</spanx></c>
      <c>string</c>
      <c>Billing period unit. The value <bcp14>MUST</bcp14> be <spanx style="verb">day</spanx> or <spanx style="verb">week</spanx></c>
      <c><spanx style="verb">periodCount</spanx></c>
      <c>string</c>
      <c>Positive integer count of <spanx style="verb">periodUnit</spanx> values per billing period</c>
      <c><spanx style="verb">recipient</spanx></c>
      <c>string</c>
      <c>Wallet address that receives every subscription charge. The on-chain <spanx style="verb">Plan</spanx> and each transfer <bcp14>MUST</bcp14> bind this address as described below</c>
      <c><spanx style="verb">methodDetails</spanx></c>
      <c>object</c>
      <c>Solana-specific extension data (see <xref target="method-details"/>)</c>
</texttable>

</section>
<section anchor="optional-fields"><name>Optional Fields</name>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">subscriptionExpires</spanx></c>
      <c>string</c>
      <c>Subscription expiry timestamp in <xref target="RFC3339"/> format. When omitted, the subscription has no HTTP-layer maximum lifetime</c>
      <c><spanx style="verb">description</spanx></c>
      <c>string</c>
      <c>Human-readable subscription description</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c>Merchant's reference for the subscription</c>
</texttable>

<t>The <spanx style="verb">amount</spanx> value <bcp14>MUST</bcp14> be a string representation of a positive
integer in base 10 with no sign, decimal point, exponent, or
surrounding whitespace. Leading zeros <bcp14>MUST NOT</bcp14> be used.</t>

<t>The <spanx style="verb">periodCount</spanx> value <bcp14>MUST</bcp14> be a string representation of a positive
integer in base 10 with no sign, decimal point, exponent, or
surrounding whitespace. Leading zeros <bcp14>MUST NOT</bcp14> be used.</t>

<t>Solana subscription delegations use fixed elapsed-time periods and
cannot represent calendar-month billing exactly. Servers <bcp14>MUST</bcp14> reject
<spanx style="verb">periodUnit="month"</spanx>. The shared period fields map to a per-billing-
period interval in hours as follows:</t>

<t><list style="symbols">
  <t><spanx style="verb">periodUnit="day"</spanx> maps to <spanx style="verb">periodCount * 24</spanx> hours</t>
  <t><spanx style="verb">periodUnit="week"</spanx> maps to <spanx style="verb">periodCount * 168</spanx> hours</t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> reject request objects where the mapped per-billing-
period interval is zero or exceeds 8760 hours.</t>

<t>When <spanx style="verb">subscriptionExpires</spanx> is present, it defines an HTTP-layer
maximum subscription lifetime: after that timestamp the server
ceases renewal submissions and serves fresh challenges (see
<xref target="state-transitions"/>). When omitted, the subscription runs until
on-chain cancellation, plan end, or another invalidation event
takes effect.</t>

</section>
</section>
<section anchor="currency-formats"><name>Currency Formats</name>

<t>The <spanx style="verb">currency</spanx> field on Solana is the base58-encoded mint address of
an SPL Token or SPL Token-2022 mint:</t>

<texttable>
      <ttcol align='left'>Format</ttcol>
      <ttcol align='left'>Example</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>Token mint</c>
      <c><spanx style="verb">"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"</spanx></c>
      <c>Base58 address of an SPL Token or Token-2022 mint</c>
</texttable>

<t>Implementations <bcp14>MUST</bcp14> treat <spanx style="verb">currency</spanx> and <spanx style="verb">methodDetails.mint</spanx> as the
same value; servers <bcp14>MUST</bcp14> reject request objects where they differ.
Native SOL is not a valid currency for the "subscription" intent on
Solana.</t>

<t>Base58 values in this profile use the standard Solana alphabet
<xref target="BASE58"/>. Address comparisons are by decoded value, not raw string
form.</t>

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

<t>All Solana-specific request parameters live in <spanx style="verb">methodDetails</spanx>:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">methodDetails.mint</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Mint address echoed from <spanx style="verb">currency</spanx>. <bcp14>MUST</bcp14> equal the on-chain <spanx style="verb">plan.mint</spanx></c>
      <c><spanx style="verb">methodDetails.decimals</spanx></c>
      <c>number</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Decimal precision of the mint</c>
      <c><spanx style="verb">methodDetails.tokenProgram</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Token program ID. The value <bcp14>MUST</bcp14> be the SPL Token program or the SPL Token-2022 program</c>
      <c><spanx style="verb">methodDetails.puller</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 of the server's puller pubkey. <bcp14>MUST</bcp14> be <spanx style="verb">plan.owner</spanx> or appear in <spanx style="verb">plan.pullers</spanx></c>
      <c><spanx style="verb">methodDetails.planAddress</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 address of the on-chain <spanx style="verb">Plan</spanx> account</c>
      <c><spanx style="verb">methodDetails.subscriptionProgram</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 address of the subscriptions program deployment</c>
      <c><spanx style="verb">methodDetails.network</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c><spanx style="verb">"mainnet"</spanx>, <spanx style="verb">"devnet"</spanx>, <spanx style="verb">"testnet"</spanx>, or <spanx style="verb">"localnet"</spanx>. If omitted, the default value is <spanx style="verb">"mainnet"</spanx></c>
      <c><spanx style="verb">methodDetails.feePayer</spanx></c>
      <c>boolean</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>If <spanx style="verb">true</spanx>, the client constructs the activation transaction with the server as fee payer</c>
      <c><spanx style="verb">methodDetails.feePayerKey</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Base58 of the server fee-payer pubkey. <bcp14>REQUIRED</bcp14> when <spanx style="verb">feePayer</spanx> is <spanx style="verb">true</spanx></c>
      <c><spanx style="verb">methodDetails.recentBlockhash</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Pre-fetched blockhash to bind to the activation transaction</c>
</texttable>

<t>Servers <bcp14>MUST</bcp14> reject request objects where the on-chain <spanx style="verb">Plan</spanx> at
<spanx style="verb">methodDetails.planAddress</spanx> does not exist, has been closed, is not
owned by <spanx style="verb">methodDetails.subscriptionProgram</spanx>, or has terms that diverge from
<spanx style="verb">currency</spanx>, <spanx style="verb">amount</spanx>, or the mapped per-billing-period interval.
Servers <bcp14>MUST</bcp14> also verify that the mint account is owned by
<spanx style="verb">methodDetails.tokenProgram</spanx> and that <spanx style="verb">methodDetails.decimals</spanx> matches
the decimal precision recorded in the mint account.</t>

<t>The non-zero entries in <spanx style="verb">plan.destinations</spanx> <bcp14>MUST</bcp14> consist of exactly
one address, and that address <bcp14>MUST</bcp14> equal <spanx style="verb">recipient</spanx>. Servers and
clients <bcp14>MUST</bcp14> reject request objects referencing a plan with an empty
destination whitelist, more than one non-zero destination, or a
destination different from <spanx style="verb">recipient</spanx>. The subscriptions program
compares this whitelist against the owner of the receiver token
account on every transfer, so this constraint binds activation and
all renewals to the advertised recipient.</t>

</section>
<section anchor="implementor-guidance"><name>Implementor Guidance</name>

<t>This section is non-normative.</t>

<t>The Solana profile is a deliberately narrow projection of what an
on-chain subscription system could express. Implementations should:</t>

<t><list style="symbols">
  <t>Treat the on-chain <spanx style="verb">Plan</spanx> as the authoritative source of recurring
terms. The challenge <spanx style="verb">request</spanx> <bcp14>MUST</bcp14> agree with the plan exactly;
servers should reject mismatched challenges before any client
signing.</t>
  <t>Refuse to map <spanx style="verb">periodUnit="month"</spanx> rather than approximate it with
30-day or 31-day fixed periods. Clients receiving a <spanx style="verb">month</spanx> request
for the Solana method should treat it as a server bug.</t>
  <t>Publish a separate <spanx style="verb">Plan</spanx> for each recipient. This profile requires
exactly one non-zero <spanx style="verb">Plan.destinations</spanx> entry so that the program
can enforce the challenge's <spanx style="verb">recipient</spanx> on every transfer.</t>
  <t>Submit at most one <spanx style="verb">transfer_subscription</spanx> per billing period per
subscription, and never retry past the end of the period the
transaction was constructed against.</t>
  <t>Maintain durable server state sufficient to prevent duplicate
charges across retries, concurrent requests, and out-of-band on-
chain events such as failed renewals or independent cancellations.</t>
</list></t>

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

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "periodUnit": "day",
  "periodCount": "30",
  "subscriptionExpires": "2026-07-14T12:00:00Z",
  "recipient": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
  "description": "Monthly Pro plan",
  "externalId": "merchant-subscription-270",
  "methodDetails": {
    "subscriptionProgram": "De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44",
    "planAddress": "8tWbqLkUJoYy7zXc5h2EvCRoaQEv2xnQjUuYhc3rzCgT",
    "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "decimals": 6,
    "puller": "5fKb5cF22cFybZB1H4hLDydFhwoQy9JzKzRWaSbMkB6h",
    "network": "mainnet",
    "feePayer": true,
    "feePayerKey": "5fKb5cF22cFybZB1H4hLDydFhwoQy9JzKzRWaSbMkB6h"
  }
}
]]></sourcecode></figure>

</section>
</section>
<section anchor="credential-requirements"><name>Credential Requirements</name>

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

<section anchor="payload"><name>Payload</name>

<t>The credential <spanx style="verb">payload</spanx> for a Solana "subscription" intent either
activates the subscription or authenticates later use of an active
subscription. Renewals are server-driven on-chain transactions and do
not produce HTTP credentials. Cancellations are out-of-band on-chain
operations and use no credential.</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">challenge</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Echo of the challenge from the server</c>
      <c><spanx style="verb">payload</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Solana-specific activation or access payload</c>
      <c><spanx style="verb">source</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14></c>
      <c>Subscriber identifier (e.g., <spanx style="verb">did:pkh:solana:...</spanx>)</c>
</texttable>

<t>Solana subscription activation uses <spanx style="verb">type="transaction"</spanx>. The client
signs the activation transaction as the subscriber and submits the
serialized bytes. The server verifies the transaction, signs it as
<spanx style="verb">methodDetails.puller</spanx>, adds the fee-payer signature when
<spanx style="verb">methodDetails.feePayer</spanx> is <spanx style="verb">true</spanx>, and broadcasts it.</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>The string <spanx style="verb">"transaction"</spanx></c>
      <c><spanx style="verb">transaction</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Standard-base64 of the activation transaction signed by the subscriber. The server adds the puller signature and, when configured, its fee-payer signature</c>
      <c><spanx style="verb">authentication</spanx></c>
      <c>object</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Reusable payer proof defined in <xref target="subscription-bearer-proof"/></c>
</texttable>

</section>
<section anchor="subscription-bearer-proof"><name>Subscription Bearer Proof</name>

<t>The client signs one reusable proof when it constructs the activation
credential. The proof authorizes access under the resulting
subscription; it does not authorize activation, a renewal transfer, or
any other movement of funds.</t>

<t>The client derives the <spanx style="verb">SubscriptionDelegation</spanx> PDA from the plan and
subscriber, then constructs this JCS <xref target="RFC8785"/> object:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "domain": "mpp-subscription-auth-v1",
  "payer": "<base58 subscriber public key>",
  "subscriptionChallengeId": "<activation challenge id>",
  "subscriptionDelegation": "<base58 delegation address>"
}
]]></sourcecode></figure>

<t>The client signs the UTF-8 bytes of the JCS serialization with the
Ed25519 private key corresponding to <spanx style="verb">payer</spanx>. The resulting
<spanx style="verb">authentication</spanx> object has this shape:</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>The string <spanx style="verb">"proof"</spanx></c>
      <c><spanx style="verb">challengeId</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Activation challenge ID signed as <spanx style="verb">subscriptionChallengeId</spanx></c>
      <c><spanx style="verb">payer</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 Ed25519 public key that produced the proof</c>
      <c><spanx style="verb">signature</spanx></c>
      <c>string</c>
      <c><bcp14>REQUIRED</bcp14></c>
      <c>Base58 encoding of the 64-byte Ed25519 signature</c>
</texttable>

<t>During activation, the server <bcp14>MUST</bcp14> verify that:</t>

<t><list style="symbols">
  <t><spanx style="verb">authentication.challengeId</spanx> equals the activation challenge ID;</t>
  <t>the signed <spanx style="verb">subscriptionDelegation</spanx> equals the canonical PDA derived
from <spanx style="verb">methodDetails.planAddress</spanx>, the subscriber, and
<spanx style="verb">methodDetails.subscriptionProgram</spanx>;</t>
  <t><spanx style="verb">authentication.payer</spanx> equals the subscriber signer extracted from
the activation transaction; and</t>
  <t>the Ed25519 signature verifies over the exact JCS object above.</t>
</list></t>

<t>The server <bcp14>MUST</bcp14> bind the verified <spanx style="verb">authentication</spanx> object to the
subscription only after the activation transaction confirms and the
resulting delegation passes the post-settlement checks in
<xref target="activation"/>. A signature over a derivable PDA whose account does not
exist is not evidence of an active subscription.</t>

<t>To use an active subscription on a later request, the client sends a
credential whose outer <spanx style="verb">challenge</spanx> echoes the activation challenge and
whose payload has this shape:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "type": "proof",
  "subscriptionDelegation": "<base58 delegation address>",
  "authentication": {
    "type": "proof",
    "challengeId": "<activation challenge id>",
    "payer": "<base58 subscriber public key>",
    "signature": "<base58 Ed25519 signature>"
  }
}
]]></sourcecode></figure>

<t>The server <bcp14>MUST</bcp14> verify the proof against the delegation and the
activation binding before granting access. It <bcp14>MUST</bcp14> require the same
<spanx style="verb">authentication</spanx> field values that it bound at activation. The
activation challenge's
<spanx style="verb">expires</spanx> auth-param limits creation of the binding; it does not expire
an already-bound proof. Repeated presentation is the expected bearer-
proof behavior and <bcp14>MUST NOT</bcp14> be rejected merely because the proof was
previously presented.</t>

<t>The proof remains usable only while the identified subscription is
usable under <xref target="server-accounting-and-idempotency"/>. It becomes invalid
when cancellation takes effect, <spanx style="verb">subscriptionExpires</spanx> is reached, the
delegation or its authority is invalidated, or the current billing
period is not paid. Servers <bcp14>MAY</bcp14> provide application-layer early
revocation or narrower audience and lifetime policies.</t>

<t>The proof is a bearer credential after signing. Clients and servers
<bcp14>MUST</bcp14> send it only over authenticated encrypted transports, <bcp14>MUST NOT</bcp14> log
it, and <bcp14>MUST</bcp14> prevent it from appearing in URLs, analytics, or error
reports. An <spanx style="verb">Idempotency-Key</spanx> prevents replay of an application request;
it does not constrain use of a leaked bearer proof.</t>

<t>The subscriber-signed activation transaction <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>contain a <spanx style="verb">subscribe</spanx> instruction creating the
<spanx style="verb">SubscriptionDelegation</spanx> PDA from the on-chain <spanx style="verb">Plan</spanx> snapshot;</t>
  <t>contain a <spanx style="verb">transfer_subscription</spanx> instruction collecting the first-
period charge atomically with the subscription creation;</t>
  <t>contain an <spanx style="verb">initialize_subscription_authority</spanx> instruction prepended
only when the <spanx style="verb">(subscriber, mint)</spanx> authority does not yet exist
on-chain;</t>
  <t>target the subscriptions program identified by
<spanx style="verb">methodDetails.subscriptionProgram</spanx>;</t>
  <t>use the SPL Token or Token-2022 program identified by
<spanx style="verb">methodDetails.tokenProgram</spanx> for all token-touching instructions;</t>
  <t>pull funds from the subscriber's associated token account for
<spanx style="verb">methodDetails.mint</spanx>;</t>
  <t>use <spanx style="verb">methodDetails.puller</spanx> as the required signer for the
<spanx style="verb">transfer_subscription</spanx> instruction;</t>
  <t>direct the first-period charge to a receiver ATA whose token-account
owner equals <spanx style="verb">recipient</spanx>;</t>
  <t>set the fee payer to <spanx style="verb">methodDetails.feePayerKey</spanx> when
<spanx style="verb">methodDetails.feePayer</spanx> is <spanx style="verb">true</spanx>, and to the subscriber otherwise;</t>
  <t>contain no instructions other than those above plus optional
compute-budget and memo instructions.</t>
</list></t>

<t>The subscriber-signed activation transaction <bcp14>MUST NOT</bcp14> contain SPL
Token <spanx style="verb">Approve</spanx> or any other non-subscriptions-program instruction
that could move the subscriber's tokens outside the per-period limit,
and <bcp14>MUST NOT</bcp14> reference writable accounts that could redirect funds
away from <spanx style="verb">recipient</spanx>.</t>

</section>
<section anchor="activation-single-use"><name>Activation Single-Use</name>

<t>Each "subscription" activation credential <bcp14>MUST</bcp14> be usable only once
per challenge. Servers <bcp14>MUST</bcp14> reject replayed credentials.</t>

<t>This single-use requirement applies to <spanx style="verb">type="transaction"</spanx>
activation credentials. It does not apply to a <spanx style="verb">type="proof"</spanx> access
credential defined in
<xref target="subscription-bearer-proof"/>.</t>

<t>A successfully activated subscription may be reused for later billing
periods until:</t>

<t><list style="symbols">
  <t>The subscriber cancels it on-chain;</t>
  <t>The on-chain delegation is otherwise invalidated (e.g., closure of
the <spanx style="verb">SubscriptionAuthority</spanx>);</t>
  <t>The <spanx style="verb">subscriptionExpires</spanx> timestamp, if present, is reached.</t>
</list></t>

</section>
</section>
<section anchor="subscription-lifecycle"><name>Subscription Lifecycle</name>

<section anchor="activation"><name>Activation</name>

<t>For <spanx style="verb">intent="subscription"</spanx>, activation and the first billing-period
charge are a single atomic transaction:</t>

<figure><artwork><![CDATA[
   Client                        Server                          Solana
      |                             |                             |
      |  (1) Authorization:         |                             |
      |      Payment <credential>   |                             |
      |      (subscriber-signed tx) |                             |
      |-------------------------->  |                             |
      |                             |                             |
      |                             |  (2) Sign as puller and,    |
      |                             |      if configured, fee     |
      |                             |      payer; sendTransaction |
      |                             |-------------------------->  |
      |                             |                             |
      |                             |  (3) SubscriptionDelegation |
      |                             |      created + first        |
      |                             |      transfer executed      |
      |                             |<--------------------------  |
      |                             |                             |
      |  (4) 200 OK                 |                             |
      |      Payment-Receipt: ...   |                             |
      |<--------------------------  |                             |
      |                             |                             |
]]></artwork></figure>

<t>When the server receives a Solana "subscription" credential, it <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Verify the activation transaction matches the challenge: program
ID, plan address, token program, mint, puller, recipient, and
per-period amount as described in
<xref target="authorization-scope-verification"/>.</t>
  <t>Verify the subscriber identity per <xref target="source-verification"/>.</t>
  <t>Verify and retain the subscription bearer proof per
<xref target="subscription-bearer-proof"/>.</t>
  <t>Sign the transaction as <spanx style="verb">methodDetails.puller</spanx>. When
<spanx style="verb">methodDetails.feePayer</spanx> is <spanx style="verb">true</spanx>, also sign as
<spanx style="verb">methodDetails.feePayerKey</spanx>, then broadcast.</t>
  <t>Wait for confirmation and read the resulting on-chain state.</t>
  <t>Initialize durable subscription state, including the exact bound
proof, for later access and renewals.</t>
  <t>Return <spanx style="verb">200 OK</spanx> with a <spanx style="verb">Payment-Receipt</spanx> for the first charge,
including a <spanx style="verb">subscriptionId</spanx> as defined in
<xref target="subscription-identifier"/>.</t>
</list></t>

<t>Servers <bcp14>MUST</bcp14> treat the subscription as active only after the
activation transaction settles successfully and the on-chain
<spanx style="verb">SubscriptionDelegation</spanx> account reflects
<spanx style="verb">amount_pulled_in_period == amount_per_period</spanx> for period 0.</t>

<t>Servers <bcp14>MUST NOT</bcp14> treat activation as successful if
<spanx style="verb">subscriptionExpires</spanx> is present and the activation transaction
settles at or after that timestamp.</t>

<section anchor="source-verification"><name>Source Verification</name>

<t>If a credential includes the optional <spanx style="verb">source</spanx> field, servers <bcp14>MUST
NOT</bcp14> trust this value without verification.</t>

<t>Servers <bcp14>MUST</bcp14> determine the payer identity from the activation
transaction itself, by extracting the subscriber signer (the signer
whose role corresponds to the <spanx style="verb">delegator</spanx> field of the resulting
<spanx style="verb">SubscriptionDelegation</spanx>).</t>

<t>If <spanx style="verb">source</spanx> is present, servers <bcp14>MUST</bcp14> verify that it uses the
<spanx style="verb">did:pkh:solana:</spanx> method and that its address matches the subscriber
signer extracted from the activation transaction.</t>

</section>
<section anchor="authorization-scope-verification"><name>Authorization Scope Verification</name>

<t>When validating a Solana subscription credential, servers <bcp14>MUST</bcp14> verify
that the activation transaction:</t>

<t><list style="symbols">
  <t>invokes only the subscriptions program identified by
<spanx style="verb">methodDetails.subscriptionProgram</spanx> for subscription instructions, and only
the token program identified by <spanx style="verb">methodDetails.tokenProgram</spanx> for
token instructions;</t>
  <t>uses <spanx style="verb">methodDetails.planAddress</spanx> as the <spanx style="verb">Plan</spanx> account and uses
<spanx style="verb">methodDetails.puller</spanx> as the authorized puller signer;</t>
  <t>uses a receiver ATA whose token-account owner equals <spanx style="verb">recipient</spanx>;</t>
  <t>contains exactly one subscribe instruction and exactly one
first-period transfer instruction on the subscriptions program,
ordered with subscribe first;</t>
  <t>conditionally contains one subscription-authority initialization
instruction, only if the <spanx style="verb">(subscriber, mint)</spanx> authority does not
yet exist on-chain;</t>
  <t>contains no other subscriptions-program, system-program, or
token-program instructions; compute-budget and memo instructions
are permitted.</t>
</list></t>

<t>After the activation transaction settles, servers <bcp14>MUST</bcp14> read the
resulting <spanx style="verb">SubscriptionDelegation</spanx> account and assert that its
snapshotted terms (plan, mint, amount per billing period, mapped
per-billing-period interval) equal the corresponding challenge
fields, and that the in-period counter equals the per-billing-period
amount (i.e., the first-period charge was executed atomically with
the subscription's creation).</t>

<t>Servers <bcp14>MUST</bcp14> reject activation transactions that pull funds through
broader scopes than those required above.</t>

</section>
</section>
<section anchor="renewal"><name>Renewal</name>

<t>For each later billing period, the server <bcp14>MAY</bcp14> submit one
<spanx style="verb">transfer_subscription</spanx> transaction using the registered subscription
delegation. The transaction <bcp14>MUST</bcp14> pull exactly <spanx style="verb">amount</spanx> to a receiver
ATA whose token-account owner equals the <spanx style="verb">recipient</spanx> bound at
activation.</t>

<t>If the server grants access for a later billing period, it <bcp14>MUST</bcp14>
ensure that the renewal charge for that period has been collected
before, or atomically with, delivering the corresponding service.</t>

<t>Servers <bcp14>MUST NOT</bcp14> submit more than one successful renewal charge for
the same billing period and <bcp14>MUST NOT</bcp14> use the program's partial-transfer
capability for this profile.</t>

<t>The on-chain <spanx style="verb">transfer_subscription</spanx> instruction advances
<spanx style="verb">current_period_start_ts</spanx> by whole multiples of the period length and
resets <spanx style="verb">amount_pulled_in_period</spanx> to zero when the period rolls over.
The program then accepts transfers up to the remaining per-period cap.
Conforming servers <bcp14>MUST</bcp14> use that broader primitive only to collect one
transfer of exactly <spanx style="verb">amount</spanx> in the current billing period. If one or
more billing periods elapse without a successful charge, a later
transaction authorizes only the then-current period's charge; missed
periods do not accumulate.</t>

</section>
<section anchor="subscription-identifier"><name>Subscription Identifier</name>

<t>After successful activation, the server <bcp14>MUST</bcp14> return a
<spanx style="verb">subscriptionId</spanx> in the <spanx style="verb">Payment-Receipt</spanx>. The value <bcp14>MUST</bcp14> be a
server-issued opaque base64url string without padding as defined by
<xref target="I-D.payment-intent-subscription"/>. The server <bcp14>MUST</bcp14> also return the
base58 address of the on-chain <spanx style="verb">SubscriptionDelegation</spanx> account in the
Solana-specific <spanx style="verb">subscriptionDelegation</spanx> receipt field.</t>

<t>Servers <bcp14>MUST NOT</bcp14> include a <spanx style="verb">Payment-Receipt</spanx> header on error
responses. On renewal, servers <bcp14>MUST</bcp14> return the same <spanx style="verb">subscriptionId</spanx>
for the active subscription.</t>

<t>The receipt payload for a Solana subscription:</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">reference</spanx></c>
      <c>string</c>
      <c>Base58 of the settlement transaction signature</c>
      <c><spanx style="verb">status</spanx></c>
      <c>string</c>
      <c><spanx style="verb">"success"</spanx></c>
      <c><spanx style="verb">subscriptionId</spanx></c>
      <c>string</c>
      <c>Server-issued opaque base64url identifier for the subscription</c>
      <c><spanx style="verb">subscriptionDelegation</spanx></c>
      <c>string</c>
      <c>Base58 address of the <spanx style="verb">SubscriptionDelegation</spanx> account</c>
      <c><spanx style="verb">periodIndex</spanx></c>
      <c>number</c>
      <c>Zero-based integer index of the billing period (<spanx style="verb">0</spanx> on activation)</c>
      <c><spanx style="verb">periodStart</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> start of the current period</c>
      <c><spanx style="verb">periodEnd</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> end (exclusive) of the current period</c>
      <c><spanx style="verb">expiresAt</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14>. <xref target="RFC3339"/> effective subscription expiry</c>
      <c><spanx style="verb">timestamp</spanx></c>
      <c>string</c>
      <c><xref target="RFC3339"/> settlement time</c>
      <c><spanx style="verb">externalId</spanx></c>
      <c>string</c>
      <c><bcp14>OPTIONAL</bcp14>. Echoed from the challenge request</c>
</texttable>

<t>Clients <bcp14>MAY</bcp14> retain the <spanx style="verb">subscriptionId</spanx> as application data when
referring to the active subscription in later interactions, but the
<spanx style="verb">subscriptionId</spanx> is only a receipt identifier unless an application
explicitly assigns it additional application-layer meaning.</t>

<t>Clients <bcp14>MUST</bcp14> use the bearer proof from
<xref target="subscription-bearer-proof"/> to authenticate later access. Possession
or presentation of a <spanx style="verb">subscriptionId</spanx> alone is insufficient.</t>

</section>
<section anchor="server-accounting-and-idempotency"><name>Server Accounting and Idempotency</name>

<t>The billing anchor for a Solana subscription is the on-chain
<spanx style="verb">current_period_start_ts</spanx> written by <spanx style="verb">subscribe</spanx> when the activation
transaction settles. Servers <bcp14>MUST</bcp14> derive this anchor from chain
settlement data rather than local wall-clock time.</t>

<t>Billing periods are defined as:</t>

<t><list style="symbols">
  <t>Period 0: <spanx style="verb">[anchor, anchor + mappedPeriodSeconds)</spanx></t>
  <t>Period 1: <spanx style="verb">[anchor + mappedPeriodSeconds, anchor + 2*mappedPeriodSeconds)</spanx></t>
  <t>Period N: <spanx style="verb">[anchor + N*mappedPeriodSeconds, anchor + (N+1)*mappedPeriodSeconds)</spanx></t>
</list></t>

<t><spanx style="verb">mappedPeriodSeconds</spanx> is <spanx style="verb">period_hours * 3600</spanx> for the on-chain
delegation.</t>

<t>Servers <bcp14>MUST</bcp14> maintain durable subscription state sufficient to
enforce per-period charging rules across retries and concurrent
requests. At minimum, servers <bcp14>MUST</bcp14> track:</t>

<t><list style="symbols">
  <t>server-issued subscription identifier</t>
  <t>subscription delegation address</t>
  <t>activation challenge and bound bearer proof</t>
  <t>plan address</t>
  <t>billing anchor</t>
  <t>last successfully charged billing-period index</t>
  <t>any in-flight billing-period index and renewal transaction signature</t>
  <t>subscription expiry</t>
  <t>cancellation timestamp (<spanx style="verb">delegation.expires_at_ts</spanx>; <spanx style="verb">0</spanx> means active,
non-zero means cancellation is scheduled, and cancellation is effective
once the current time reaches that timestamp)</t>
</list></t>

<t>When granting access in a later billing period, servers <bcp14>MUST</bcp14>:</t>

<t><list style="symbols">
  <t>Verify the payer signature, activation binding, and delegation
binding defined in <xref target="subscription-bearer-proof"/>.</t>
  <t>Verify the <spanx style="verb">SubscriptionDelegation</spanx> account exists, is owned by
<spanx style="verb">methodDetails.subscriptionProgram</spanx>, has the expected discriminator and version,
and still identifies the bound plan and payer.</t>
  <t>Derive the payer's <spanx style="verb">SubscriptionAuthority</spanx> from the payer and mint, verify
that it exists and is owned by <spanx style="verb">methodDetails.subscriptionProgram</spanx>, and
require its current <spanx style="verb">init_id</spanx> to equal the delegation header's <spanx style="verb">init_id</spanx>.
A missing authority or mismatched incarnation invalidates the subscription.</t>
  <t>Verify the subscription is still usable by reading
<spanx style="verb">delegation.expires_at_ts</spanx> on-chain; a non-zero timestamp only blocks
renewal once the current time is at or after that timestamp.</t>
  <t>Determine the current billing-period index from the anchor and the
mapped period in seconds.</t>
  <t>Verify that <spanx style="verb">delegation.amount_pulled_in_period</spanx> is zero before
submitting a renewal for the current billing period.</t>
  <t>Atomically record any renewal attempt for the current billing
period as in-flight before submitting <spanx style="verb">transfer_subscription</spanx>.</t>
  <t>Mark the current billing period as charged only after the renewal
transaction settles successfully and the on-chain
<spanx style="verb">delegation.amount_pulled_in_period</spanx> equals <spanx style="verb">amount</spanx>.</t>
  <t>Grant access only after, or atomically with, durably recording the
successful renewal charge.</t>
</list></t>

<t>For non-idempotent requests, clients <bcp14>SHOULD</bcp14> send an <spanx style="verb">Idempotency-Key</spanx>
header per <xref target="I-D.ietf-httpapi-idempotency-key-header"/>. Servers <bcp14>MUST
NOT</bcp14> charge the same activation or billing period more than once for
duplicate idempotent requests.</t>

</section>
<section anchor="cancellation"><name>Cancellation</name>

<t>Subscribers cancel a subscription by submitting
<spanx style="verb">cancel_subscription</spanx> against their
<spanx style="verb">SubscriptionDelegation</spanx>. The normal cancellation path sets
<spanx style="verb">delegation.expires_at_ts</spanx> to the end of the current billing period,
after which <spanx style="verb">transfer_subscription</spanx> fails with
<spanx style="verb">SubscriptionCancelled</spanx>. Implementations should also handle
program-defined immediate-expiry cases, such as closed or mismatched
plan accounts.</t>

<t>Subscribers can additionally revoke every subscription tied to a
<spanx style="verb">(subscriber, mint)</spanx> by closing and reopening their
<spanx style="verb">SubscriptionAuthority</spanx>. Reopening creates a new authority instance,
causing existing subscriptions that reference the prior authority
instance to fail transfer validation.</t>

<t>Servers <bcp14>MUST NOT</bcp14> submit renewal charges for billing periods after
cancellation takes effect. Servers <bcp14>SHOULD</bcp14> handle revocation
gracefully by returning a fresh subscription challenge once the
on-chain delegation has expired.</t>

</section>
<section anchor="state-transitions"><name>Error Responses</name>

<t>When a Solana subscription cannot be used to fulfill a request, the
server <bcp14>MUST</bcp14> return an appropriate HTTP status code:</t>

<texttable>
      <ttcol align='left'>Condition</ttcol>
      <ttcol align='left'>Status Code</ttcol>
      <ttcol align='left'>Behavior</ttcol>
      <c><spanx style="verb">subscriptionExpires</spanx> present and reached</c>
      <c>402 Payment Required</c>
      <c>Issue new challenge</c>
      <c>On-chain cancellation effective or <spanx style="verb">SubscriptionAuthority</spanx> closed</c>
      <c>402 Payment Required</c>
      <c>Issue new challenge</c>
      <c>Current billing period unpaid or <spanx style="verb">transfer_subscription</spanx> failed</c>
      <c>402 Payment Required</c>
      <c>Issue new challenge</c>
      <c>Activation transaction failed verification</c>
      <c>402 Payment Required</c>
      <c>Issue new challenge</c>
      <c>Invalid credential</c>
      <c>402 Payment Required</c>
      <c>Issue new challenge</c>
</texttable>

<t>For all 402 responses, the server <bcp14>MUST</bcp14> include a <spanx style="verb">WWW-Authenticate</spanx>
header with a fresh challenge. Clients receiving a 402 after a
previously valid subscription <bcp14>SHOULD</bcp14> treat the subscription as no
longer usable and initiate a new subscription flow.</t>

</section>
</section>
<section anchor="illustrative-lifecycle-examples"><name>Illustrative Lifecycle Examples</name>

<t>This section is non-normative.</t>

<section anchor="daily-billing-example"><name>Daily Billing Example</name>

<t><strong>Challenge:</strong></t>

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

<t>The <spanx style="verb">request</spanx> decodes to:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "amount": "10000000",
  "currency": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
  "periodUnit": "day",
  "periodCount": "30",
  "subscriptionExpires": "2026-07-14T12:00:00Z",
  "recipient": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
  "description": "Monthly Pro plan",
  "externalId": "merchant-subscription-270",
  "methodDetails": {
    "subscriptionProgram": "De1egAFMkMWZSN5rYXRj9CAdheBamobVNubTsi9avR44",
    "planAddress": "8tWbqLkUJoYy7zXc5h2EvCRoaQEv2xnQjUuYhc3rzCgT",
    "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
    "tokenProgram": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    "decimals": 6,
    "puller": "5fKb5cF22cFybZB1H4hLDydFhwoQy9JzKzRWaSbMkB6h",
    "network": "mainnet",
    "feePayer": true,
    "feePayerKey": "5fKb5cF22cFybZB1H4hLDydFhwoQy9JzKzRWaSbMkB6h"
  }
}
]]></sourcecode></figure>

<t>This requests a recurring payment of 10.00 USDC every 30 days until
2026-07-14T12:00:00Z, with the server (5fKb...kB6h) sponsoring
transaction fees.</t>

<t><strong>Activation transaction (composed by client):</strong></t>

<figure><artwork><![CDATA[
Instruction 0: SetComputeUnitLimit(200000)
Instruction 1: SetComputeUnitPrice(1)
Instruction 2: subscriptions.initialize_subscription_authority
               signer: subscriber
               accounts: [authority_pda, subscriber, mint, ata, ...]
Instruction 3: subscriptions.subscribe
               signer: subscriber
               accounts: [plan_pda, subscription_pda, authority_pda,
                          subscriber, system_program]
Instruction 4: subscriptions.transfer_subscription
               signer: puller
               accounts: [subscription_pda, plan_pda, authority_pda,
                          subscriber_ata, destination_ata, mint,
                          token_program]
Fee payer: 5fKb5cF22cFybZB1H4hLDydFhwoQy9JzKzRWaSbMkB6h (server)
Signatures: subscriber (partial), puller (server, added at co-sign)
Destination ATA owner: 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin
]]></artwork></figure>

<t><strong>Credential:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "qT8wErYuI3oPlKjH6gFdSa",
    "realm": "api.example.com",
    "method": "solana",
    "intent": "subscription",
    "request": "eyJ...",
    "expires": "2026-01-15T12:05:00Z"
  },
  "payload": {
    "type": "transaction",
    "transaction": "AQAAAA...base64 of partially signed tx...",
    "authentication": {
      "type": "proof",
      "challengeId": "qT8wErYuI3oPlKjH6gFdSa",
      "payer": "7YWHMfk9JZe0LMQDBiTkBXK9LmJRxB6Kuf7nBzvuN7tP",
      "signature": "4vJ9...base58 Ed25519 signature...Qd"
    }
  }
}
]]></sourcecode></figure>

<t><strong>Later access credential:</strong></t>

<figure><sourcecode type="json"><![CDATA[
{
  "challenge": {
    "id": "qT8wErYuI3oPlKjH6gFdSa",
    "realm": "api.example.com",
    "method": "solana",
    "intent": "subscription",
    "request": "eyJ...",
    "expires": "2026-01-15T12:05:00Z"
  },
  "payload": {
    "type": "proof",
    "subscriptionDelegation": "BXQGmO5VwTrl5RfFr6Y8XQZ4nPj9QqMOiKkRn3pZ4ZE",
    "authentication": {
      "type": "proof",
      "challengeId": "qT8wErYuI3oPlKjH6gFdSa",
      "payer": "7YWHMfk9JZe0LMQDBiTkBXK9LmJRxB6Kuf7nBzvuN7tP",
      "signature": "4vJ9...base58 Ed25519 signature...Qd"
    }
  }
}
]]></sourcecode></figure>

<t><strong>Receipt:</strong></t>

<t>If activation settles at <spanx style="verb">2026-01-15T12:03:10Z</spanx>, the
<spanx style="verb">Payment-Receipt</spanx> payload decodes to:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "method": "solana",
  "intent": "subscription",
  "status": "success",
  "reference": "5J8...base58 transaction signature...Kt",
  "subscriptionId": "c3ViX3NvbGFuYV8wMQ",
  "subscriptionDelegation": "BXQGmO5VwTrl5RfFr6Y8XQZ4nPj9QqMOiKkRn3pZ4ZE",
  "externalId": "merchant-subscription-270",
  "periodIndex": 0,
  "periodStart": "2026-01-15T12:03:10Z",
  "periodEnd": "2026-02-14T12:03:10Z",
  "expiresAt": "2026-07-14T12:00:00Z",
  "timestamp": "2026-01-15T12:03:10Z"
}
]]></sourcecode></figure>

<t>The resulting billing periods are:</t>

<t><list style="symbols">
  <t>Period 0: <spanx style="verb">[2026-01-15T12:03:10Z, 2026-02-14T12:03:10Z)</spanx></t>
  <t>Period 1: <spanx style="verb">[2026-02-14T12:03:10Z, 2026-03-16T12:03:10Z)</spanx></t>
  <t>Period 2: <spanx style="verb">[2026-03-16T12:03:10Z, 2026-04-15T12:03:10Z)</spanx></t>
</list></t>

<t>Requests during Period 0 do not require another renewal charge. When
Period 1 begins, the server's renewal worker submits one
<spanx style="verb">transfer_subscription</spanx> instruction to the subscriptions program. On
success, the on-chain delegation advances to
<spanx style="verb">current_period_start_ts = 2026-02-14T12:03:10Z</spanx> and
<spanx style="verb">amount_pulled_in_period = 10000000</spanx>. After that renewal succeeds,
additional requests during Period 1 do not permit another charge for
Period 1.</t>

</section>
<section anchor="cancellation-example"><name>Cancellation Example</name>

<t>Suppose Period 2 has been charged and the subscriber cancels by
submitting <spanx style="verb">cancel_subscription</spanx> on-chain at <spanx style="verb">2026-03-20T09:00:00Z</spanx>.
The program sets <spanx style="verb">delegation.expires_at_ts = 2026-04-15T12:03:10Z</spanx>
(end of Period 2).</t>

<t>Cancellation takes effect at the end of the current paid billing
period. The server continues honoring access through that time. The
server's renewal worker <bcp14>MUST NOT</bcp14> submit a Period 3 charge: the
on-chain <spanx style="verb">transfer_subscription</spanx> would fail with
<spanx style="verb">SubscriptionCancelled</spanx>.</t>

<t>Requests at or after <spanx style="verb">2026-04-15T12:03:10Z</spanx> receive
<spanx style="verb">402 Payment Required</spanx> with a fresh challenge.</t>

</section>
<section anchor="failed-renewal-example"><name>Failed Renewal Example</name>

<t>If the subscriber's token balance is insufficient when the server
attempts a Period 3 renewal, the on-chain transaction fails. The
server records the failure but does not retry continuously; it
returns <spanx style="verb">402 Payment Required</spanx> on subsequent gated requests.</t>

<t>If a later retry within Period 3 succeeds, the server may grant
access for Period 3 and update its local state.</t>

<t>If Period 4 begins before any successful Period 3 charge, the next
successful <spanx style="verb">transfer_subscription</spanx> collapses to Period 4 (the program
advances <spanx style="verb">current_period_start_ts</spanx> to Period 4's start and resets
<spanx style="verb">amount_pulled_in_period = 0</spanx>). The skipped Period 3 charge does not
become additional on-chain spending authority.</t>

</section>
<section anchor="expiry-example"><name>Expiry Example</name>

<t>When <spanx style="verb">subscriptionExpires = 2026-07-14T12:00:00Z</spanx> is reached, the
server stops submitting renewal transactions. A subsequent
<spanx style="verb">transfer_subscription</spanx> would still succeed on-chain (the program
itself does not enforce <spanx style="verb">subscriptionExpires</spanx>; it is a server-side
contract derived from the credential), so the server <bcp14>MUST</bcp14> honor the
expiry by ceasing renewal submissions and serving fresh challenges.</t>

<t>Requests after that time receive <spanx style="verb">402 Payment Required</spanx> with a fresh
challenge.</t>

<t>If the server sponsored activation, it can reclaim rent only when
program revocation rules allow <spanx style="verb">revoke_delegation</spanx>, such as after
on-chain cancellation has taken effect or the referenced plan has
ended or been closed.</t>

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

<section anchor="recurring-charge-awareness"><name>Recurring Charge Awareness</name>

<t>Clients <bcp14>MUST</bcp14> clearly communicate that a Solana subscription
authorizes future recurring on-chain transfers without requiring a
new user action for each billing period. Wallets and client UIs
<bcp14>SHOULD</bcp14> display the per-period amount, the period length, and the
<spanx style="verb">subscriptionExpires</spanx> value (when present) at activation time.</t>

</section>
<section anchor="amount-and-period-verification"><name>Amount and Period Verification</name>

<t>Clients <bcp14>MUST</bcp14> parse and verify the <spanx style="verb">request</spanx> payload before signing:</t>

<t><list style="numbers" type="1">
  <t>Verify <spanx style="verb">amount</spanx> is reasonable for the service</t>
  <t>Verify <spanx style="verb">currency</spanx> is the expected mint</t>
  <t>Verify <spanx style="verb">periodUnit</spanx> and <spanx style="verb">periodCount</spanx> match expectations</t>
  <t>Verify <spanx style="verb">recipient</spanx> is controlled by the expected party</t>
  <t>Verify <spanx style="verb">subscriptionExpires</spanx> is acceptable when present</t>
  <t>Verify the on-chain <spanx style="verb">Plan</spanx> referenced by
<spanx style="verb">methodDetails.planAddress</spanx> carries matching mint, per-period
amount, and per-billing-period interval; authorizes the server's
puller as the plan owner or in <spanx style="verb">plan.pullers</spanx>; and has exactly one
non-zero destination equal to <spanx style="verb">recipient</spanx></t>
  <t>Verify the activation <spanx style="verb">transfer_subscription</spanx> instruction uses a
receiver ATA whose token-account owner equals <spanx style="verb">recipient</spanx></t>
</list></t>

<t>Clients <bcp14>MUST NOT</bcp14> sign an activation transaction whose on-chain <spanx style="verb">Plan</spanx>
does not match the challenge. Clients <bcp14>MUST NOT</bcp14> rely on the
<spanx style="verb">description</spanx> field for payment verification.</t>

</section>
<section anchor="duplicate-charge-prevention"><name>Duplicate Charge Prevention</name>

<t>On-chain per-period accounting prevents overspending within a billing
period, but it does not by itself make HTTP service delivery
idempotent. Servers <bcp14>MUST</bcp14> implement durable local state to prevent
duplicate activation and renewal charges caused by retries, parallel
requests, or races between charging and service delivery.</t>

<t>Servers <bcp14>SHOULD</bcp14> use a per-subscription lease (e.g., a database row
lock with a short TTL) when submitting a renewal, releasing the lease
only after the on-chain state has advanced.</t>

</section>
<section anchor="server-accountability"><name>Server Accountability</name>

<t>Servers operating Solana subscriptions are responsible for:</t>

<t><list style="symbols">
  <t>Secure storage of subscription state and any sponsoring fee-payer
keys;</t>
  <t>Not charging more than once per billing period;</t>
  <t>Honoring on-chain cancellation and revocation promptly;</t>
  <t>Providing transaction signatures and billing records to payers on
request.</t>
</list></t>

</section>
<section anchor="caching"><name>Caching</name>

<t>Responses to subscription challenges (402 Payment Required) <bcp14>MUST</bcp14>
include <spanx style="verb">Cache-Control: no-store</spanx> to prevent sensitive payment data
from being cached by intermediaries.</t>

<t>Responses containing <spanx style="verb">Payment-Receipt</spanx> headers <bcp14>MUST</bcp14> include
<spanx style="verb">Cache-Control: private</spanx> to prevent shared caches from storing
payment receipts.</t>

</section>
<section anchor="bearer-proof-theft"><name>Bearer Proof Theft</name>

<t>The subscription authentication proof is intentionally reusable. A
party that obtains it can impersonate the subscriber within the
server's protection space until the subscription or an additional
application-layer authorization expires or is revoked. Domain
separation and the activation challenge bind the proof to one
subscription and server realm, but they do not make a copied proof
non-transferable.</t>

<t>Servers <bcp14>MUST</bcp14> re-check subscription usability for every presentation;
signature verification alone is insufficient. Servers <bcp14>SHOULD</bcp14> support
early application-layer proof revocation when immediate logout or
credential rotation is required.</t>

</section>
<section anchor="destination-scoping"><name>Destination Scoping</name>

<t>Solana subscription delegations <bcp14>MUST</bcp14> be bound to a receiver
identified by <spanx style="verb">recipient</spanx>. Clients and servers <bcp14>MUST</bcp14> reject credentials
whose activation transaction uses a receiver ATA owned by any other
address. Servers <bcp14>MUST</bcp14> use a receiver ATA owned by the same recipient
for every renewal.</t>

</section>
<section anchor="plan-scope-minimization"><name>Plan Scope Minimization</name>

<t><spanx style="verb">plan.destinations</spanx> is a whitelist, not a payout split. The underlying
program permits an empty whitelist or several destinations, but this
profile does not. The non-zero destination set <bcp14>MUST</bcp14> contain only
<spanx style="verb">recipient</spanx>, making the recurring recipient restriction immutable and
program-enforced for the lifetime of the plan.</t>

</section>
<section anchor="subscription-authority-isolation"><name>Subscription Authority Isolation</name>

<t>The <spanx style="verb">SubscriptionAuthority</spanx> is shared across every subscription the
same payer holds for the same mint. Closing the authority
invalidates every delegation created against it, terminating all
subscriptions tied to that authority simultaneously.</t>

<t>Servers <bcp14>MUST NOT</bcp14> rely on long-term existence of a particular
authority instance beyond the lifetime of their own delegations.
Applications <bcp14>SHOULD</bcp14> expose authority closure only as an explicit
"revoke all subscriptions for this token" affordance, never as a side
effect of routine operations.</t>

</section>
<section anchor="token-extension-policy"><name>Token-2022 Extension Policy</name>

<t>Implementations <bcp14>MUST</bcp14> validate Token-2022 mints and token accounts at
activation and before each token-touching instruction according to the
deployed validation policy of the subscriptions program.</t>

<t>The canonical subscriptions program rejects Token-2022 mints with a
configured <spanx style="verb">TransferHook</spanx> extension. An inert <spanx style="verb">TransferHook</spanx> extension
whose authority and program id are both unset is allowed, because it
cannot be activated later.</t>

<t>Implementations <bcp14>MUST NOT</bcp14> resolve transfer-hook extra accounts for
configured hooks or otherwise bypass the mint and token account
validation performed by the program.</t>

</section>
<section anchor="account-ownership-and-program-id-validation"><name>Account Ownership and Program-ID Validation</name>

<t>Before deserializing or mutating any account, implementations <bcp14>MUST</bcp14>
validate the expected program owner for:</t>

<t><list style="symbols">
  <t>the <spanx style="verb">Plan</spanx>, <spanx style="verb">SubscriptionDelegation</spanx>, and <spanx style="verb">SubscriptionAuthority</spanx>
PDAs (owned by the subscriptions program);</t>
  <t>the subscriber and destination token accounts (owned by
<spanx style="verb">methodDetails.tokenProgram</spanx>);</t>
  <t>the mint (owned by <spanx style="verb">methodDetails.tokenProgram</spanx>).</t>
</list></t>

<t>Implementations <bcp14>MUST NOT</bcp14> allow user-controlled program accounts to
influence the activation, transfer, or revocation paths.</t>

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

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

<t>The <spanx style="verb">subscription</spanx> payment intent is registered by
<xref target="I-D.payment-intent-subscription"/>. This document does not register
it again.</t>

</section>
</section>


  </middle>

  <back>


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

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

&RFC2119;
&RFC3339;
&RFC4648;
&RFC8174;
&RFC8259;
&RFC8785;
&RFC9457;
<reference anchor="I-D.httpauth-payment" target="https://datatracker.ietf.org/doc/draft-ryan-httpauth-payment/">
  <front>
    <title>The 'Payment' HTTP Authentication Scheme</title>
    <author initials="J." surname="Moxey" fullname="Jake Moxey">
      <organization></organization>
    </author>
    <date year="2026" month="January"/>
  </front>
</reference>
<reference anchor="I-D.payment-intent-subscription" target="https://datatracker.ietf.org/doc/draft-payment-intent-subscription/">
  <front>
    <title>Subscription 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" month="April"/>
  </front>
</reference>
<reference anchor="I-D.ietf-httpapi-idempotency-key-header" target="https://datatracker.ietf.org/doc/draft-ietf-httpapi-idempotency-key-header/">
  <front>
    <title>The Idempotency-Key HTTP Header Field</title>
    <author initials="J." surname="Jena" fullname="Jayadeba Jena">
      <organization></organization>
    </author>
    <date year="2024" month="June"/>
  </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="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>
<reference anchor="SUBSCRIPTIONS-PROGRAM" target="https://github.com/solana-program/subscriptions">
  <front>
    <title>Subscriptions Solana Program</title>
    <author >
      <organization>Solana Foundation</organization>
    </author>
    <date year="2026"/>
  </front>
</reference>


    </references>

</references>


<?line 1244?>

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

<t>The authors thank the MPP community and the Tempo team for their
feedback on this specification, and the Solana Foundation
subscriptions program team for the on-chain primitives this profile
builds on.</t>

</section>


  </back>

<!-- ##markdown-source:
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
Valbt2zxlt1btyjbBbUOhef1u63eVuMuqX08R104vmWepbvQXbcoUa+tLrm7
aTYZ/bj2++m9y0f5r4vD29lR+vy3p3fPHo9OYip9AIuWTn9cA2UHhDYNrTfM
pvQTG1M/mtBGR7XcRNyh8q506n+U+plb3a07VD/zjq2fKWzrRy6u0HATH92Y
9dOaK63gqvbylRIIGawWpPhXJdF/VRL9VyXRG1USJZZlDAuOkHD1bHsXIejo
W5u9zc3o7cnBvqirtzcjOAfm+qIm2u7UbldYxzH2ej0cwkZEkiOjMt2BmNNU
/OHWrRYxuI4oOpLkA1Nje8MwTHXowUw2d0H7K/cZc4dn9wVCLta3iStsBI9u
VR89ypOhXt8Kn9reDXXg3pXFAVQlT4YxnraZAedo+P+M6bAb/dW28mE+ijtR
1QzogNUMX8Ny/i0Y5e3qKO2L/9Bo8MAGA+Gp0jfhSKuN+D16c2D05AexusI5
7FTn0Khhtc2Hj+GKudRn4Gb3FXP5QBvhVS3nL2iTVjRAPMjN/7FJ89+NbnKU
zZXFG+rEuKALf0ujdYFzbZhUJ/MG1RElnCPYAZQruqEOvEsSEJFH6Lvd6CYy
iZkKaDNWwzSn00lpq+o52ZKQXFqhmJCcBN0EH2vSTqzYwgc8FQXbJi2Fvq/q
KdQqsT78WS+fwXkyP+iq7K5oMchETYVGRJnUC1b5Ke9G8nhfwRN7b/bgH3Tq
SpfKfoEEt/m73qBaamS1VMmq18laucJ+mazvf3339OX4/P6z93rzxcs3Bw+T
0/OHvzy//2L67Pjjw7vPF+PvZw//uFi8+r48cq8HZbN2Lp7dl6k1Fc+Cn96M
1ujNL75AunXrhZ9oNfwXIYWVz5rxN/jYw1/ePJm+vvPz5Wme3jkeP87v/nrv
lzfvd2ZHv91/8/vL18nz8+PZ7fn7nfeP/r+iJ5NUi/SD6VZOs/AyuvqVvbm9
u7X5nvMSVR3YZpBl7aZIIxGtIqE19srwbwzoEvNAvGyk5j2755agMWwLPz8v
65YIb9fw9s/JL7dfXQyePF78+vO9y5dvrqrad1Oaupml4YG94OlN7zsCaDUc
GdoW/+VHs5F7bNuooN5jFl612gqzgavWTv06fy6pouaTzHUNGNLUXCdqGnIN
HtL0kHn1dnfrbvOr2+7V8CHz6k4wFgR9HBsTYMSVWM34DXLXREjNNaSVAAwn
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

-->

</rfc>

