a2a-protocol-core 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/CHANGELOG.md +17 -1
  2. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/PKG-INFO +1 -1
  3. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/pyproject.toml +1 -1
  4. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/__init__.py +1 -1
  5. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/x402_pay.py +7 -2
  6. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/.gitignore +0 -0
  7. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/LICENSE +0 -0
  8. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/README.md +0 -0
  9. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/examples/agent_pay_alias.py +0 -0
  10. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/examples/trigger_payment_hook.py +0 -0
  11. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/addressing.py +0 -0
  12. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/canonical_hash.py +0 -0
  13. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/client.py +0 -0
  14. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/py.typed +0 -0
  15. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/schemas.py +0 -0
  16. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/src/a2a_protocol_core/semantic_normalizer.py +0 -0
  17. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/test_addressing.py +0 -0
  18. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/test_canonical_hash.py +0 -0
  19. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/test_cross_language_vectors.py +0 -0
  20. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/test_schemas.py +0 -0
  21. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/test_semantic_normalizer.py +0 -0
  22. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/test_x402_pay.py +0 -0
  23. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/vectors/canonical_vectors.json +0 -0
  24. {a2a_protocol_core-0.2.0 → a2a_protocol_core-0.2.1}/tests/vectors/generate_vectors.py +0 -0
@@ -3,7 +3,23 @@
3
3
  All notable changes to `a2a-protocol-core` are documented here. This project
4
4
  adheres to [Semantic Versioning](https://semver.org/).
5
5
 
6
- ## [0.2.0] — Unreleased
6
+ ## [0.2.1] — 2026-07-20
7
+
8
+ Conformance fix for the XRPL exact scheme's field placement. Required before
9
+ the server drops its deprecated top-level mirrors (scheduled after 2026-10-01)
10
+ — a 0.2.0 client will stop attaching `InvoiceID` at that point and be rejected
11
+ by the server's mandatory invoice binding.
12
+
13
+ ### Fixed
14
+ - `pay_alias_xrp` now reads `invoiceId` and `sourceTag` from the x402
15
+ requirement's `extra` block, where the XRPL exact scheme
16
+ (`scheme_exact_xrpl.md`) places them, falling back to the deprecated
17
+ top-level mirrors for not-yet-updated servers. Previously only the top-level
18
+ copies were read, so a spec-conformant server that stopped mirroring them
19
+ would silently produce payments without `InvoiceID` — which the invoice
20
+ binding (the anti-replay mechanism) mandatorily rejects.
21
+
22
+ ## [0.2.0] — 2026-07-11
7
23
 
8
24
  Adds the one-call x402 pay-path so an agent can pay a `pay:` alias from its own
9
25
  wallet — the "make it actually easy" client, still fully non-custodial.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: a2a-protocol-core
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: Open, deterministic protocol core for the DNS of Money A2A payment surface (FAS-1 pay: addressing, canonical hashing, payment-hook client).
5
5
  Project-URL: Homepage, https://dnsofmoney.com
6
6
  Project-URL: Specification, https://github.com/dnsofmoney/dns-of-money
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "a2a-protocol-core"
7
- version = "0.2.0"
7
+ version = "0.2.1"
8
8
  description = "Open, deterministic protocol core for the DNS of Money A2A payment surface (FAS-1 pay: addressing, canonical hashing, payment-hook client)."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -46,7 +46,7 @@ from a2a_protocol_core.x402_pay import (
46
46
  summarize_attestation,
47
47
  )
48
48
 
49
- __version__ = "0.2.0"
49
+ __version__ = "0.2.1"
50
50
 
51
51
  __all__ = [
52
52
  "__version__",
@@ -239,14 +239,19 @@ def pay_alias_xrp(
239
239
  """
240
240
  http = session or requests.Session()
241
241
  req = fetch_requirement(base_url=base_url, alias=alias, amount_xrp=amount_xrp, session=http, timeout=timeout)
242
- invoice = req.get("invoiceId")
242
+ # The XRPL exact scheme carries scheme fields in `extra`; the top-level copies
243
+ # are our own deprecated mirrors (removed after 2026-10-01). Prefer `extra`, fall
244
+ # back to top-level so this client still works against not-yet-updated servers.
245
+ extra = req.get("extra") or {}
246
+ invoice = extra.get("invoiceId") or req.get("invoiceId")
247
+ source_tag = extra.get("sourceTag") if extra.get("sourceTag") is not None else req.get("sourceTag")
243
248
  tx_hash, payer = _sign_and_submit_xrp(
244
249
  pay_to=req["payTo"],
245
250
  drops=req["maxAmountRequired"],
246
251
  seed=seed,
247
252
  rpc_url=xrpl_rpc_url,
248
253
  invoice_id=invoice_id_hash(invoice) if invoice else None,
249
- source_tag=req.get("sourceTag"),
254
+ source_tag=source_tag,
250
255
  )
251
256
  body = _settle(
252
257
  base_url=base_url,