<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-hopley-x402-settlement-attestation-01" submissionType="IETF" category="info" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="x402-settlement-attestation">Categorical Settlement Attestation Format for Agentic-Payment Flows</title><seriesInfo value="draft-hopley-x402-settlement-attestation-01" stream="IETF" status="informational" name="Internet-Draft"></seriesInfo>
<author initials="C." surname="Hopley" fullname="Christopher Hopley"><organization>AlgoVoi</organization><address><postal><street></street>
</postal><email>chopmob@gmail.com</email>
</address></author><date year="2026" month="May" day="30"></date>
<area>Independent Submission</area>
<workgroup>Independent Submission</workgroup>
<keyword>x402</keyword>
<keyword>agentic payments</keyword>
<keyword>settlement</keyword>
<keyword>multi-chain</keyword>
<keyword>JCS</keyword>
<keyword>RFC 8785</keyword>
<keyword>audit chain</keyword>
<keyword>categorical receipt</keyword>
<keyword>MiCA</keyword>
<keyword>PSD2</keyword>

<abstract>
<t>This document specifies a categorical settlement attestation format
for agentic-payment flows. The format records that a payment has
reached a particular settlement state on a particular chain, at a
particular instant, under the attesting party's risk model.</t>
<t>The receipt format uses a closed enumeration of categorical outcomes
(SETTLED, PENDING_FINALITY, REVERSED). The categorical outcome is
load-bearing for downstream regulatory obligations: SETTLED triggers
settlement-finality record-keeping obligations under EU Markets in
Crypto-Assets Regulation Article 80 and Anti-Money Laundering
Regulation Article 56; the PSD2 (Directive 2015/2366) Article 89
unauthorised-payment refund-window clock begins at SETTLED.
PENDING_FINALITY records an inclusion-without-finality state where
the refund-window has not yet started. REVERSED records
chain-reorganisation, fraud-reversal, or operator-initiated reversal
events for chain-of-custody audit.</t>
<t>The format is multi-chain: a single <tt>settlement_chain</tt> string field
identifies the chain on which settlement occurred, using a flat
identifier convention (<tt>&lt;chain_family&gt;</tt> for default mainnets,
<tt>&lt;chain_family&gt;:&lt;network&gt;</tt> for non-default networks). The receipt
does not encode chain-specific finality semantics; those are applied
at verification time by a verifier that knows the chain.</t>
<t>The format composes with the AlgoVoi-authored compliance receipt
format (draft-hopley-x402-compliance-receipt) and refund receipt
format (draft-hopley-x402-refund-receipt) under the same
canonicalisation discipline (draft-hopley-x402-canonicalisation-jcs).
A verifier walking the audit chain confirms the full payment
lifecycle from admission through settlement to refund (or
non-refund) under one byte-deterministic canonicalisation pin.</t>
</abstract>

</front>
<middle>
<section anchor="sect-1-introduction"><name>Introduction</name>

<section anchor="sect-1-1-motivation"><name>Motivation</name>
<t>Agentic-payment flows generate three classes of categorical receipt
across the payment lifecycle:</t>

<ol spacing="compact">
<li>Admission-time receipts (compliance screening, payment
authorisation, mandate verification).</li>
<li>Settlement-time receipts (this document).</li>
<li>Post-settlement receipts (refund, dispute resolution).</li>
</ol>
<t>Settlement is the state transition at which a broadcast payment is
considered final by the attesting party's risk model. The
operational and regulatory significance is load-bearing:</t>

<ul spacing="compact">
<li>Under EU Markets in Crypto-Assets Regulation Article 80
(Regulation (EU) 2023/1114) and EU Anti-Money Laundering
Regulation Article 56 (Regulation (EU) 2024/1624), operator
records of settled crypto-asset transactions must be retained and
re-verifiable for the statutory period.</li>
<li>Under PSD2 (Directive 2015/2366) Article 89, the
unauthorised-payment refund obligation has timing tied to when
the payment was settled, not when it was broadcast. A
PENDING_FINALITY state is operationally distinct from a SETTLED
state for refund-window calculation purposes.</li>
<li>Under EU Anti-Money Laundering Directives 5 and 6, a settled
payment that is subsequently REVERSED (for example by chain
reorganisation or court-ordered fraud reversal) requires an audit
trail recording the reversal event independently of the original
settlement event.</li>
</ul>
<t>A receipt format that collapses these distinctions to a binary
&quot;settled / not settled&quot; or to a continuous &quot;confirmation depth&quot;
representation loses the load-bearing operational distinction.</t>
<t>This document specifies a settlement attestation format that
preserves the categorical outcome at the canonical-bytes level and
records the settlement chain explicitly, enabling multi-chain
operator audit trails under one canonicalisation discipline.</t>
</section>

<section anchor="sect-1-2-scope"><name>Scope</name>
<t>This document specifies:</t>

<ul spacing="compact">
<li>The canonical JSON shape of the settlement attestation
(Section 3).</li>
<li>The reference to the canonicalisation rule applicable to the
receipt (Section 4 -- normative reference to
draft-hopley-x402-canonicalisation-jcs, not redefined inline).</li>
<li>The audit chain composition under which settlement attestations
compose with compliance receipts and refund receipts (Section 5).</li>
<li>The year-N auditability properties the format pins (Section 6).</li>
<li>Composition patterns across the AlgoVoi receipt-format suite
(Section 7).</li>
<li>Worked examples covering SETTLED, PENDING_FINALITY, and REVERSED
outcomes (Appendix A).</li>
</ul>
<t>This document does NOT specify:</t>

<ul spacing="compact">
<li>The chain-specific finality model. The receipt identifies the
chain via <tt>settlement_chain</tt>; verifiers apply chain-specific
finality semantics (Algorand's deterministic instant finality,
Ethereum's probabilistic depth-based finality, Stellar's SCP,
etc.) at verification time.</li>
<li>Cryptographic settlement proofs. Cryptographically-strong
post-quantum settlement proofs are an orthogonal mechanism
specified elsewhere. The two layers compose: a categorical
settlement attestation under this format MAY reference a
cryptographic settlement proof in its <tt>settled_payment_ref</tt> or
via a separate audit-chain row.</li>
<li>Cross-chain bridge mechanics. The format supports cross-asset
substitution (the <tt>settlement_amount.asset_id</tt> MAY differ from
the original payment asset) but the bridge mechanism is out of
scope.</li>
</ul>
</section>

<section anchor="sect-1-3-relationship-to-other-internet-drafts"><name>Relationship to other Internet-Drafts</name>
<t>This document normatively references:</t>

<ul spacing="compact">
<li>draft-hopley-x402-canonicalisation-jcs -- the JCS canonicalisation
discipline pinned in Section 4.</li>
</ul>
<t>This document is complementary to:</t>

<ul spacing="compact">
<li>draft-hopley-x402-compliance-receipt -- admission-time compliance
screening receipts. A settlement attestation's
<tt>settled_payment_ref</tt> MAY equal the <tt>content_hash</tt> of a compliance
receipt.</li>
<li>draft-hopley-x402-refund-receipt -- post-settlement refund
receipts. A refund receipt's <tt>original_payment_ref</tt> MAY equal the
<tt>content_hash</tt> of a settlement attestation under this document.</li>
</ul>
</section>
</section>

<section anchor="sect-2-conventions-and-definitions"><name>Conventions and Definitions</name>

<section anchor="sect-2-1-notation"><name>Notation</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and
&quot;OPTIONAL&quot; in this document are to be interpreted as described in
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all
capitals, as shown here.</t>
</section>

<section anchor="sect-2-2-definitions"><name>Definitions</name>
<t><strong>settlement attestation</strong>: a JSON object of the shape specified in
Section 3, canonicalised under the discipline of
draft-hopley-x402-canonicalisation-jcs.</t>
<t><strong>content_hash</strong>: SHA-256, lowercase hex, of the JCS-canonical bytes
of the attestation object.</t>
<t><strong>settled_payment_ref</strong>: a string of the form
<tt>sha256:&lt;lowercase-hex-64&gt;</tt> identifying the payment record being
settled by content hash. The original record MAY be a compliance
receipt, an operator-specific payment authorisation record, or a
cryptographic settlement proof.</t>
<t><strong>settlement_chain</strong>: a string identifier for the chain on which
settlement occurred. See Section 3.5.</t>
<t><strong>settlement_amount</strong>: a two-field object <tt>{amount_minor, asset_id}</tt>
representing the settled value.</t>
<t><strong>canon_version</strong>: an in-band string identifying the canonicalisation
discipline. Fixed value <tt>jcs-rfc8785-v1</tt> for this version.</t>
</section>
</section>

<section anchor="sect-3-receipt-format-specification"><name>Receipt Format Specification</name>
<t>A settlement attestation is a JSON object with the following eight
fields. All fields are REQUIRED. The attestation is canonicalised
under draft-hopley-x402-canonicalisation-jcs per Section 4. Field
names are sorted lexicographically by JCS during canonicalisation;
the object itself uses arbitrary authoring order.</t>

<section anchor="sect-3-1-settlement-result"><name>settlement_result</name>
<t>A string-valued field. The value MUST be one of:</t>

<ul spacing="compact">
<li><tt>SETTLED</tt> -- payment confirmed on-chain with sufficient finality
for the operator's risk model. Funds transferred and irreversible
under normal chain operation.</li>
<li><tt>PENDING_FINALITY</tt> -- payment broadcast and included in a block,
awaiting the operator's required confirmation depth. Operator
has visibility of inclusion but does not yet assert finality.</li>
<li><tt>REVERSED</tt> -- payment previously SETTLED is now considered
reversed (chain reorganisation, fraud reversal, double-spend
resolution, operator-initiated under regulatory directive).</li>
</ul>
<t>The three-element enumeration is closed. Implementations MUST reject
any other value at validation time before canonicalisation. Score,
depth, or confirmation-count representations are not acceptable
substitutes for the categorical outcome.</t>
<t>The regulatory distinction is load-bearing. Under MiCA Article 80,
settlement-finality records must be retained and re-verifiable;
SETTLED is the operational state that triggers this obligation.
Under PSD2 Article 89, refund-window timing is tied to settled
state. Under AML Directives 5 and 6, reversed transactions require
documented evidence chains independent of the original settlement.</t>
</section>

<section anchor="sect-3-2-jurisdiction-flags"><name>jurisdiction_flags</name>
<t>An ordered array of string-valued ISO-3166-1 alpha-2 country codes
or alpha-3 region codes identifying the applicable regulatory
frameworks for the settlement event.</t>
<t>Authoring convention: primary jurisdiction first (where the
operating entity is licensed), secondary jurisdictions in order of
regulatory precedence.</t>
<t>Array element ORDER is SIGNIFICANT and load-bearing per
draft-hopley-x402-canonicalisation-jcs Section 4.3.</t>
</section>

<section anchor="sect-3-3-settled-payment-ref"><name>settled_payment_ref</name>
<t>A string-valued field of the form <tt>sha256:&lt;lowercase-hex-64&gt;</tt>. The
hex digest is SHA-256 of the JCS-canonical bytes of the payment
record being settled.</t>
<t>When settling a payment that was admitted under a compliance
receipt (per draft-hopley-x402-compliance-receipt), the
<tt>settled_payment_ref</tt> MAY equal the <tt>content_hash</tt> of the
compliance receipt itself. This is the conventional choice and
enables the audit-chain composition described in Section 5.</t>
<t>When the original payment record is an operator-specific format
(payment authorisation, mandate, settlement proof, etc.), the
<tt>settled_payment_ref</tt> is the SHA-256 of that record's
JCS-canonical bytes.</t>
<t>Implementations MUST NOT strip the <tt>sha256:</tt> prefix during
canonicalisation or verification.</t>
</section>

<section anchor="sect-3-4-settlement-amount"><name>settlement_amount</name>
<t>A sub-object with exactly two fields:</t>

<ul spacing="compact">
<li><tt>amount_minor</tt> -- a string of decimal digits representing the
settled value in the asset's minor unit. String typing avoids
float-precision loss and JavaScript-integer-overflow concerns for
large values.</li>
<li><tt>asset_id</tt> -- a string identifying the asset and its decimal
precision. Convention: <tt>&lt;symbol&gt;.&lt;decimals&gt;</tt> for chain-native
assets (e.g. <tt>USDC.6</tt>, <tt>ALGO.6</tt>, <tt>ETH.18</tt>); <tt>&lt;chain&gt;:&lt;asset_id&gt;.&lt;decimals&gt;</tt>
for ASA-style assets (e.g. <tt>algo:31566704.6</tt>).</li>
</ul>
<t>The sub-object's keys are sorted lexicographically by RFC 8785
during canonicalisation: <tt>amount_minor</tt> then <tt>asset_id</tt>.</t>
<t>Cross-asset substitution is permitted. When settlement is in a
different asset than the original payment (e.g. paid USDC on Base,
settled USDC on Solana via a bridge), <tt>settlement_amount.asset_id</tt>
reflects the SETTLED asset, not the original. The equivalence-of-value
claim across the substitution is operator-layer and out of scope.</t>
</section>

<section anchor="sect-3-5-settlement-chain"><name>settlement_chain</name>
<t>A string-valued field identifying the chain on which settlement
occurred. The string is in one of two forms:</t>

<ol>
<li><t>Default mainnet of a chain family: <tt>&lt;chain_family&gt;</tt>. Examples:</t>

<ul spacing="compact">
<li><tt>algo</tt> -- Algorand mainnet</li>
<li><tt>voi</tt> -- VOI mainnet</li>
<li><tt>solana</tt> -- Solana mainnet</li>
<li><tt>stellar</tt> -- Stellar Pubnet</li>
<li><tt>hedera</tt> -- Hedera mainnet</li>
<li><tt>base</tt> -- Base L2 mainnet (alias for <tt>ethereum:8453</tt>)</li>
</ul></li>
<li><t>Non-default network of a chain family: <tt>&lt;chain_family&gt;:&lt;network&gt;</tt>.
Examples:</t>

<ul spacing="compact">
<li><tt>algorand:testnet</tt> -- Algorand TestNet</li>
<li><tt>ethereum:1</tt> -- Ethereum mainnet</li>
<li><tt>ethereum:8453</tt> -- Base L2 (canonical by chainId)</li>
<li><tt>tempo:mainnet</tt> -- Tempo mainnet</li>
<li><tt>solana:devnet</tt> -- Solana devnet</li>
</ul></li>
</ol>
<t>The string is case-sensitive at the JCS layer. Implementations
SHOULD canonicalise to lowercase before emission. Verifiers MUST
treat <tt>Ethereum:8453</tt> and <tt>ethereum:8453</tt> as distinct canonical
bytes per RFC 8785.</t>
<t>The receipt does not decompose the chain identifier into a
sub-object. Operators requiring richer chain metadata (block
height, confirmation count, validator quorum at settlement time)
MUST emit those as separate operator-layer audit records, not as
nested fields in this receipt.</t>
</section>

<section anchor="sect-3-6-settlement-provider-did"><name>settlement_provider_did</name>
<t>A string-valued DID URI identifying the entity attesting settlement
(gateway, facilitator, oracle, or operator).</t>
</section>

<section anchor="sect-3-7-settlement-timestamp-ms"><name>settlement_timestamp_ms</name>
<t>An integer-valued field carrying the epoch-millisecond timestamp of
the settlement event in UTC.</t>
<t>This field MUST be an integer. RFC 3339 string forms (e.g.
<tt>&quot;2026-05-30T12:00:00Z&quot;</tt>) MUST be rejected at the validation layer
before canonicalisation. This is Substrate Rule 2, normatively
specified in draft-hopley-x402-canonicalisation-jcs Section 4.1.</t>
</section>

<section anchor="sect-3-8-canon-version"><name>canon_version</name>
<t>A string-valued in-band canonicalisation rule pin. For this version
of the receipt format the value MUST be <tt>jcs-rfc8785-v1</tt>.</t>
</section>
</section>

<section anchor="sect-4-canonicalisation"><name>Canonicalisation</name>
<t>The settlement attestation MUST be canonicalised under the
discipline pinned by draft-hopley-x402-canonicalisation-jcs and
identified by the URN:</t>

<artwork><![CDATA[urn:x402:canonicalisation:jcs-rfc8785-v1
]]></artwork>
<t>The full normative specification of the discipline (JCS RFC 8785
plus the schema-normalisation requirements including Substrate
Rule 2) is in that document. This document does not redefine the
discipline inline.</t>
</section>

<section anchor="sect-5-audit-chain-composition"><name>Audit Chain Composition</name>
<t>A settlement attestation MAY participate in an audit chain alongside
compliance receipts, refund receipts, and other receipt classes
that pin the same canonicalisation discipline.</t>

<section anchor="sect-5-1-chain-row-shape"><name>Chain Row Shape</name>
<t>The audit chain row shape used by this document is identical to
that specified in draft-hopley-x402-compliance-receipt Section 5.1
and draft-hopley-x402-refund-receipt Section 5.1:</t>

<sourcecode type="json"><![CDATA[{
  "row_number": 1,
  "content_hash": "<hex64>",
  "prev_hash": "<hex64>",
  "row_content_hash": "<hex64>"
}
]]></sourcecode>
<t>Row 1's <tt>prev_hash</tt> MUST be 64 zero hex characters. Row N's
<tt>prev_hash</tt> MUST equal row N-1's <tt>row_content_hash</tt>.</t>
</section>

<section anchor="sect-5-2-linkage-verification"><name>Linkage Verification</name>
<t>Per draft-hopley-x402-compliance-receipt Section 5.2: a verifier
reading a chain segment recomputes each row's <tt>row_content_hash</tt>
from its first three fields and confirms forward linkage via
<tt>prev_hash</tt>. Any mismatch indicates tampering or chain integrity
loss.</t>
</section>

<section anchor="sect-5-3-composition-with-compliance-receipts"><name>Composition with Compliance Receipts</name>
<t>When a settlement attestation references a compliance receipt via
<tt>settled_payment_ref</tt>, the audit-chain composition is:</t>

<artwork><![CDATA[chain row N      chain row N+1
+------------+   +-------------+
| compliance |-->| settlement  |
| receipt    |   | attestation |
| (ALLOW)    |   | (SETTLED)   |
+------------+   +-------------+
]]></artwork>
<t>Row N anchors the compliance receipt. Row N+1 anchors the
settlement attestation. The settlement attestation's
<tt>settled_payment_ref</tt> equals row N's <tt>content_hash</tt>. Chain
linkage via <tt>prev_hash</tt> confirms ordering.</t>
</section>

<section anchor="sect-5-4-composition-with-refund-receipts"><name>Composition with Refund Receipts</name>
<t>When a settled payment is subsequently refunded, the refund
receipt's <tt>original_payment_ref</tt> MAY equal the <tt>content_hash</tt> of
the settlement attestation. The chain extends:</t>

<artwork><![CDATA[chain row N+1    chain row N+2
+-------------+  +------------+
| settlement  |->| refund     |
| attestation |  | receipt    |
| (SETTLED)   |  | (FULL)     |
+-------------+  +------------+
]]></artwork>
<t>A verifier walking the full chain confirms admission -&gt; settlement
-&gt; refund under one canonicalisation pin.</t>
</section>
</section>

<section anchor="sect-6-year-n-auditability-properties"><name>Year-N Auditability Properties</name>
<t>The same six properties pinned by
draft-hopley-x402-canonicalisation-jcs Section 5 apply to the
settlement attestation:</t>

<ol spacing="compact">
<li>Self-describing canonicalisation pin via <tt>canon_version</tt>.</li>
<li>No external rule registry required.</li>
<li>Cross-implementation verifiability (8-implementation matrix per
the discipline I-D Section 7).</li>
<li>Tamper detection via per-row <tt>content_hash</tt> and chain <tt>prev_hash</tt>
linkage.</li>
<li>Regulatory distinction preserved via closed enumeration.</li>
</ol>
<t>Plus one settlement-specific property:</t>

<ol spacing="compact" start="6">
<li><strong>Chain-aware finality semantics applied at verification time.</strong>
The <tt>settlement_chain</tt> string identifies which chain's finality
model applies. A verifier years after the event can apply the
correct chain-specific finality semantics to re-evaluate the
original SETTLED claim against retained chain state (block
height, confirmation depth, etc.).</li>
</ol>
</section>

<section anchor="sect-7-composition-with-other-x402-substrate"><name>Composition with Other x402 Substrate</name>

<section anchor="sect-7-1-compliance-receipt-linkage"><name>Compliance Receipt Linkage</name>
<t>See Section 5.3. The conventional <tt>settled_payment_ref</tt> target for
an admission-then-settlement flow is the <tt>content_hash</tt> of the
compliance receipt that admitted the original payment.</t>
</section>

<section anchor="sect-7-2-refund-receipt-linkage"><name>Refund Receipt Linkage</name>
<t>See Section 5.4. A refund receipt's <tt>original_payment_ref</tt> MAY
equal a settlement attestation <tt>content_hash</tt> rather than the
underlying compliance receipt, producing a precise
&quot;the settled payment was reversed&quot; audit trail.</t>
</section>

<section anchor="sect-7-3-cryptographic-settlement-proofs"><name>Cryptographic Settlement Proofs</name>
<t>Cryptographically-strong settlement proofs (post-quantum proofs of
payment conditions, validator signatures, STARK proofs of inclusion,
etc.) are orthogonal to the categorical settlement attestation
specified by this document. The two layers compose:</t>

<ul spacing="compact">
<li>A categorical settlement attestation records the operator's
categorical claim (SETTLED / PENDING_FINALITY / REVERSED) at the
canonical-bytes level.</li>
<li>A cryptographic settlement proof provides byte-level evidence of
the underlying on-chain condition.</li>
</ul>
<t>Both MAY be retained alongside one another, or chained via
<tt>settled_payment_ref</tt> references, depending on operator
requirements.</t>
</section>
</section>

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

<section anchor="sect-8-1-urn-namespace-registration"><name>URN Namespace Registration</name>
<t>This document references the URN
<tt>urn:x402:canonicalisation:jcs-rfc8785-v1</tt> registered by
draft-hopley-x402-canonicalisation-jcs Section 10.1. No additional
URN namespace registration is required by this document.</t>
</section>

<section anchor="sect-8-2-receipt-format-identifier"><name>Receipt Format Identifier</name>
<t>This document defines the receipt format identifier:</t>

<artwork><![CDATA[urn:x402:receipt:settlement-attestation-v1
]]></artwork>
<t>This identifier MAY be used by composite-trust-query implementations
to refer to settlement attestations as a class. Registration with
IANA is requested under the <tt>x402</tt> URN namespace.</t>
</section>
</section>

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

<section anchor="sect-9-1-attestation-tampering"><name>Attestation Tampering</name>
<t>A settlement attestation's <tt>content_hash</tt> is the SHA-256 of its
JCS-canonical bytes. Tampering with any field produces a different
hash; the tampered attestation fails verification against any
audit-chain row referencing the original <tt>content_hash</tt>.</t>
</section>

<section anchor="sect-9-2-chain-reorganisation"><name>Chain Reorganisation</name>
<t>A SETTLED attestation may later become incorrect if the underlying
chain reorganises and the settled transaction is no longer
canonical. The REVERSED outcome records this event. Operators
SHOULD emit a REVERSED attestation when a previously SETTLED state
is invalidated; the audit chain extends rather than overwrites.</t>
<t>A malicious operator could emit a SETTLED attestation for a
payment that never reaches chain-finality, then fail to emit the
corresponding REVERSED. Detection is verifier-side: a verifier
SHOULD periodically re-check chain state against retained SETTLED
attestations and flag discrepancies.</t>
</section>

<section anchor="sect-9-3-chain-identifier-spoofing"><name>Chain Identifier Spoofing</name>
<t>The <tt>settlement_chain</tt> field is operator-asserted. A verifier MUST
NOT trust the chain identifier alone; verification against actual
chain state (via the verifier's own chain client) is required to
confirm settlement.</t>
</section>

<section anchor="sect-9-4-cross-asset-substitution"><name>Cross-Asset Substitution</name>
<t>When <tt>settlement_amount.asset_id</tt> differs from the original payment
asset, the equivalence-of-value claim is operator-asserted. A
verifier cannot determine equivalence from the receipt alone;
external evidence (price oracle attestations at settlement time,
bridge proofs) is required and out of scope of this document.</t>
</section>

<section anchor="sect-9-5-operator-continuity-loss"><name>Operator Continuity Loss</name>
<t>If the original attesting operator becomes unavailable, the audit
chain and its attestations MUST remain independently verifiable
from retained bytes plus the reference implementations cited in
draft-hopley-x402-canonicalisation-jcs Section 7.</t>
</section>
</section>

</middle>
<back>
<section anchor="sect-10-references"><name>References</name>

<section anchor="sect-10-1-normative-references"><name>Normative References</name>

<ul spacing="compact">
<li>[RFC2119] Bradner, S., &quot;Key words for use in RFCs to Indicate
Requirement Levels&quot;, BCP 14, RFC 2119, DOI 10.17487/RFC2119,
March 1997.</li>
<li>[RFC8174] Leiba, B., &quot;Ambiguity of Uppercase vs Lowercase in RFC
2119 Key Words&quot;, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017.</li>
<li>[RFC8259] Bray, T., Ed., &quot;The JavaScript Object Notation (JSON)
Data Interchange Format&quot;, STD 90, RFC 8259, DOI 10.17487/RFC8259,
December 2017.</li>
<li>[RFC8785] Rundgren, A., Jordan, B., and S. Erdtman, &quot;JSON
Canonicalization Scheme (JCS)&quot;, RFC 8785, DOI 10.17487/RFC8785,
June 2020.</li>
<li>draft-hopley-x402-canonicalisation-jcs
Hopley, C., &quot;JCS Canonicalisation Discipline for Agentic-Payment
Receipts&quot;, draft-hopley-x402-canonicalisation-jcs-v1, May 2026.</li>
</ul>
</section>

<section anchor="sect-10-2-informative-references"><name>Informative References</name>

<ul spacing="compact">
<li>draft-hopley-x402-compliance-receipt
Hopley, C., &quot;Categorical Compliance Screening Receipt Format for
Agentic-Payment Flows&quot;, draft-hopley-x402-compliance-receipt-00,
May 2026.</li>
<li>draft-hopley-x402-refund-receipt
Hopley, C., &quot;Categorical Refund Receipt Format for
Agentic-Payment Flows&quot;, draft-hopley-x402-refund-receipt-00,
May 2026.</li>
<li>[AlgoVoi-Substrate-Authorship]
AlgoVoi, &quot;Substrate Authorship and Provenance&quot;,
<eref target="https://docs.algovoi.co.uk/substrate-authorship-provenance"> target="https://docs.algovoi.co.uk/substrate-authorship-provenance"</eref></li>
<li>EU Markets in Crypto-Assets Regulation (MiCA, Regulation (EU)
2023/1114), Article 80.</li>
<li>EU Anti-Money Laundering Regulation (AMLR, Regulation (EU)
2024/1624), Article 56.</li>
<li>EU Payment Services Directive 2 (PSD2, Directive 2015/2366),
Article 89.</li>
<li>EU Anti-Money Laundering Directive 5 (Directive (EU) 2018/843).</li>
<li>EU Anti-Money Laundering Directive 6 (Directive (EU) 2018/1673).</li>
<li>EU Digital Operational Resilience Act (DORA, Regulation (EU)
2022/2554), Article 14.</li>
</ul>
</section>
</section>

<section anchor="appendix-a-examples-informative"><name>Appendix A. Examples (Informative)</name>

<section anchor="a-1-settled-on-base-under-uk-eu-joint-jurisdiction"><name>A.1. SETTLED on Base under UK + EU joint jurisdiction</name>

<sourcecode type="json"><![CDATA[{
  "canon_version": "jcs-rfc8785-v1",
  "jurisdiction_flags": ["UK", "EU"],
  "settled_payment_ref": "sha256:0dd5d0b76c9b9281fdeb2509ad38ab132b16a17385ca01d976ff9e6e12563a0f",
  "settlement_amount": {"amount_minor": "100000", "asset_id": "USDC.6"},
  "settlement_chain": "ethereum:8453",
  "settlement_provider_did": "did:web:api.algovoi.co.uk",
  "settlement_result": "SETTLED",
  "settlement_timestamp_ms": 1716494400000
}
]]></sourcecode>
<t>Records that 0.1 USDC was settled on Base mainnet (chainId 8453)
under joint UK + EU jurisdiction. The PSD2 Article 89 refund-window
clock begins at <tt>settlement_timestamp_ms</tt>. MiCA Article 80 record-
keeping obligations apply to retention of this attestation.</t>
</section>

<section anchor="a-2-pending-finality-on-algorand"><name>A.2. PENDING_FINALITY on Algorand</name>

<sourcecode type="json"><![CDATA[{
  "canon_version": "jcs-rfc8785-v1",
  "jurisdiction_flags": ["UK"],
  "settled_payment_ref": "sha256:0dd5d0b76c9b9281fdeb2509ad38ab132b16a17385ca01d976ff9e6e12563a0f",
  "settlement_amount": {"amount_minor": "100000", "asset_id": "USDC.6"},
  "settlement_chain": "algo",
  "settlement_provider_did": "did:web:api.algovoi.co.uk",
  "settlement_result": "PENDING_FINALITY",
  "settlement_timestamp_ms": 1716494400000
}
]]></sourcecode>
<t>Records broadcast-and-inclusion on Algorand mainnet without yet
asserting operator-required confirmation depth.</t>
</section>

<section anchor="a-3-reversed-on-ethereum-mainnet-after-chain-reorg"><name>A.3. REVERSED on Ethereum mainnet after chain reorg</name>

<sourcecode type="json"><![CDATA[{
  "canon_version": "jcs-rfc8785-v1",
  "jurisdiction_flags": ["UK", "EU"],
  "settled_payment_ref": "sha256:0dd5d0b76c9b9281fdeb2509ad38ab132b16a17385ca01d976ff9e6e12563a0f",
  "settlement_amount": {"amount_minor": "100000", "asset_id": "USDC.6"},
  "settlement_chain": "ethereum:1",
  "settlement_provider_did": "did:web:api.algovoi.co.uk",
  "settlement_result": "REVERSED",
  "settlement_timestamp_ms": 1716494400000
}
]]></sourcecode>
<t>Records that a previously SETTLED payment on Ethereum mainnet is
now considered reversed. The audit chain extends with this row;
the prior SETTLED row remains as historical record.</t>
</section>
</section>

<section anchor="appendix-b-reference-implementations-informative"><name>Appendix B. Reference Implementations (Informative)</name>
<t>The following open-source implementations conform to this format:</t>

<ul>
<li><t>algovoi-settlement-attestation (Python) on PyPI:
<eref target="https://pypi.org/project/algovoi-settlement-attestation/"> target="https://pypi.org/project/algovoi-settlement-attestation/"</eref>
Provides <tt>build_settlement_attestation()</tt>. Depends on
algovoi-substrate for the JCS canonicalisation primitive.
Apache 2.0 licensed.</t>
</li>
<li><t>@algovoi/settlement-attestation (TypeScript) on npm:
<eref target="https://www.npmjs.com/package/@algovoi/settlement-attestation"> target="https://www.npmjs.com/package/@algovoi/settlement-attestation"</eref>
Byte-for-byte parity with the Python sibling. Depends on
@algovoi/substrate for the JCS canonicalisation primitive.
Apache 2.0 licensed.</t>
</li>
</ul>
<t>Conformance vectors:</t>

<artwork><![CDATA[https://github.com/chopmob-cloud/algovoi-jcs-conformance-vectors/tree/main/vectors/settlement_attestation_v1
]]></artwork>
<t>8 byte-level reference vectors + 5 pair invariants + 3 chain
invariants pinning the closed-enumeration, jurisdiction-array-order,
canon_version pin, and audit-chain linkage properties.</t>
</section>

<section anchor="appendix-c-acknowledgments"><name>Appendix C. Acknowledgments</name>
<t>This document, the receipt format it specifies, and the
conformance vectors derived from it are AlgoVoi work under sole
AlgoVoi authorship. Substrate authorship history is catalogued at
<eref target="https://docs.algovoi.co.uk/substrate-authorship-provenance"> target="https://docs.algovoi.co.uk/substrate-authorship-provenance"</eref>.</t>
<t>The canonicalisation discipline pinned by Section 4 is normatively
specified in draft-hopley-x402-canonicalisation-jcs under the same
authorship.</t>
<t>This document closes the lifecycle gap between the admission-time
compliance receipt format (draft-hopley-x402-compliance-receipt)
and the post-settlement refund receipt format
(draft-hopley-x402-refund-receipt). The three formats share the
same canonicalisation pin, audit-chain row shape, and integer-
millisecond timestamp encoding so that a verifier walking the full
payment lifecycle requires only one implementation of the
canonicalisation discipline.</t>
<t>The author acknowledges Anders Rundgren as the editor of RFC 8785,
the JSON Canonicalization Scheme on which the discipline builds.</t>
</section>
</back>

</rfc>
