actproof 0.3.3__tar.gz → 0.3.4__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 (40) hide show
  1. {actproof-0.3.3 → actproof-0.3.4}/CHANGELOG.md +32 -0
  2. {actproof-0.3.3 → actproof-0.3.4}/PKG-INFO +7 -3
  3. {actproof-0.3.3 → actproof-0.3.4}/README.md +6 -0
  4. {actproof-0.3.3 → actproof-0.3.4}/actproof/__init__.py +5 -1
  5. {actproof-0.3.3 → actproof-0.3.4}/actproof/anchor.py +6 -0
  6. {actproof-0.3.3 → actproof-0.3.4}/actproof/catalogue.py +348 -28
  7. {actproof-0.3.3 → actproof-0.3.4}/actproof/manifest.py +106 -8
  8. {actproof-0.3.3 → actproof-0.3.4}/actproof/receipt.py +109 -6
  9. {actproof-0.3.3 → actproof-0.3.4}/actproof/verify.py +65 -3
  10. {actproof-0.3.3 → actproof-0.3.4}/pyproject.toml +1 -3
  11. {actproof-0.3.3 → actproof-0.3.4}/tests/test_anchor.py +17 -0
  12. {actproof-0.3.3 → actproof-0.3.4}/tests/test_catalogue.py +243 -0
  13. {actproof-0.3.3 → actproof-0.3.4}/tests/test_catalogue_v3.py +13 -1
  14. {actproof-0.3.3 → actproof-0.3.4}/tests/test_manifest.py +181 -0
  15. {actproof-0.3.3 → actproof-0.3.4}/tests/test_receipt.py +90 -2
  16. {actproof-0.3.3 → actproof-0.3.4}/tests/test_verify.py +114 -0
  17. {actproof-0.3.3 → actproof-0.3.4}/.gitignore +0 -0
  18. {actproof-0.3.3 → actproof-0.3.4}/DEPLOY.md +0 -0
  19. {actproof-0.3.3 → actproof-0.3.4}/LICENSE +0 -0
  20. {actproof-0.3.3 → actproof-0.3.4}/SECURITY.md +0 -0
  21. {actproof-0.3.3 → actproof-0.3.4}/actproof/canonical.py +0 -0
  22. {actproof-0.3.3 → actproof-0.3.4}/actproof/cli.py +0 -0
  23. {actproof-0.3.3 → actproof-0.3.4}/actproof/py.typed +0 -0
  24. {actproof-0.3.3 → actproof-0.3.4}/actproof/signers/__init__.py +0 -0
  25. {actproof-0.3.3 → actproof-0.3.4}/actproof/signers/google_kms.py +0 -0
  26. {actproof-0.3.3 → actproof-0.3.4}/actproof/signers/interface.py +0 -0
  27. {actproof-0.3.3 → actproof-0.3.4}/actproof/signers/mnemonic.py +0 -0
  28. {actproof-0.3.3 → actproof-0.3.4}/actproof/timestamp.py +0 -0
  29. {actproof-0.3.3 → actproof-0.3.4}/docs/ANCHOR_BACKENDS.md +0 -0
  30. {actproof-0.3.3 → actproof-0.3.4}/docs/INTEGRATION.md +0 -0
  31. {actproof-0.3.3 → actproof-0.3.4}/docs/STS-STANDARDS-APPLICATION.md +0 -0
  32. {actproof-0.3.3 → actproof-0.3.4}/tests/__init__.py +0 -0
  33. {actproof-0.3.3 → actproof-0.3.4}/tests/test_canonical.py +0 -0
  34. {actproof-0.3.3 → actproof-0.3.4}/tests/test_catalogue_package_provenance_bugfix.py +0 -0
  35. {actproof-0.3.3 → actproof-0.3.4}/tests/test_cli.py +0 -0
  36. {actproof-0.3.3 → actproof-0.3.4}/tests/test_signers_google_kms.py +0 -0
  37. {actproof-0.3.3 → actproof-0.3.4}/tests/test_signers_interface.py +0 -0
  38. {actproof-0.3.3 → actproof-0.3.4}/tests/test_signers_mnemonic.py +0 -0
  39. {actproof-0.3.3 → actproof-0.3.4}/tests/test_signers_v030_policy.py +0 -0
  40. {actproof-0.3.3 → actproof-0.3.4}/tests/test_timestamp.py +0 -0
@@ -16,6 +16,38 @@ release. Once 1.0.0 ships, semantic versioning will be strictly followed.
16
16
  - **v1.0.0** — API frozen.
17
17
  - **v2.0.0** — COSE_Sign1 + SCITT Transparent Statement bridge, once RFC 9943 publishes.
18
18
 
19
+ ## [0.3.4] — 2026-05-25
20
+
21
+ **On-chain note in three encodings.** A receipt's anchor record now carries
22
+ the exact ARC-2 transaction note as written to the ledger, rendered in
23
+ UTF-8, hex, and base64. A receipt can be checked against a block explorer,
24
+ an indexer API, or a byte-level tool without re-deriving the note from the
25
+ manifest hash.
26
+
27
+ ### Added
28
+
29
+ - **`OnChainNote`** — a frozen dataclass exported from the package, with
30
+ `utf8`, `hex`, and `base64` fields. **`on_chain_note_from_bytes`** is the
31
+ single builder that derives all three encodings from one note byte string.
32
+ Hex is lowercase without a `0x` prefix; base64 is standard-padded.
33
+ - **`AnchorRecord.on_chain_note`** — a new optional field. `anchor_manifest`
34
+ populates it from the note bytes in every anchor mode. When a receipt is
35
+ read without the field, `__post_init__` reconstructs it losslessly from
36
+ `note_payload_b64` and the ARC-2 prefix, so receipts written by earlier
37
+ releases continue to read and verify unchanged.
38
+ - Eight tests covering the three encodings, the builder, the reconstruction
39
+ path, and round-tripping through `receipt_to_dict` and `receipt_from_dict`.
40
+
41
+ ### Notes
42
+
43
+ - Backward compatible. No breaking changes and no dependency changes.
44
+ Receipts written by 0.3.3 and earlier gain the reconstructed
45
+ `anchor.on_chain_note` block on read; receipts written by 0.3.4 carry it
46
+ as stored.
47
+ - `note_payload_b64`, the prefix-stripped payload, is retained alongside the
48
+ new field. A decision on its long-term status is left to the receipt
49
+ format specification.
50
+
19
51
  ## [0.3.2] — 2026-05-19
20
52
 
21
53
  **License switch from MIT to Apache-2.0.** Forward-looking positioning of
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: actproof
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: Verifiable receipts of regulated acts. Canonical JSON (RFC 8785), RFC 3161 trusted timestamps, Algorand ARC-2 anchoring, independent verification.
5
5
  Project-URL: Homepage, https://github.com/deyan-paroushev/actproof-py
6
6
  Project-URL: Documentation, https://github.com/deyan-paroushev/actproof-py/tree/main/docs
@@ -45,8 +45,6 @@ Requires-Dist: types-requests; extra == 'dev'
45
45
  Provides-Extra: docs
46
46
  Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
47
47
  Requires-Dist: mkdocs>=1.6; extra == 'docs'
48
- Provides-Extra: events
49
- Requires-Dist: actproof-events>=1.4.0rc1; extra == 'events'
50
48
  Provides-Extra: gcp
51
49
  Requires-Dist: google-cloud-kms<4.0,>=2.0; extra == 'gcp'
52
50
  Requires-Dist: google-crc32c<2.0,>=1.5; extra == 'gcp'
@@ -59,6 +57,12 @@ public attestations. Canonical JSON (RFC 8785), RFC 3161 trusted timestamps,
59
57
  Algorand ARC-2 anchoring, independent verification by any party with a Python
60
58
  install.
61
59
 
60
+ **Project site: [actproof.org](https://actproof.org).** The site explains
61
+ the full ActProof stack and the reasoning behind it. ActProof Events
62
+ defines the act, `actproof` proves the record, and applications consume
63
+ both. Start there for the architecture. This README is the package
64
+ reference.
65
+
62
66
  `actproof` produces cryptographic receipts that any third party can verify
63
67
  without trusting the issuing platform. A receipt binds: the record or act
64
68
  being documented (optionally classified against the `actproof-events`
@@ -5,6 +5,12 @@ public attestations. Canonical JSON (RFC 8785), RFC 3161 trusted timestamps,
5
5
  Algorand ARC-2 anchoring, independent verification by any party with a Python
6
6
  install.
7
7
 
8
+ **Project site: [actproof.org](https://actproof.org).** The site explains
9
+ the full ActProof stack and the reasoning behind it. ActProof Events
10
+ defines the act, `actproof` proves the record, and applications consume
11
+ both. Start there for the architecture. This README is the package
12
+ reference.
13
+
8
14
  `actproof` produces cryptographic receipts that any third party can verify
9
15
  without trusting the issuing platform. A receipt binds: the record or act
10
16
  being documented (optionally classified against the `actproof-events`
@@ -6,7 +6,7 @@ actproof: anchor signed JSON manifests; verify anyone's anchored receipts.
6
6
 
7
7
  from __future__ import annotations
8
8
 
9
- __version__ = "0.3.3"
9
+ __version__ = "0.3.4"
10
10
 
11
11
 
12
12
  # ─────────────────────────────────────────────────────────────────
@@ -80,6 +80,7 @@ from actproof.receipt import (
80
80
  ARC2_NOTE_FORMAT,
81
81
  AnchorRecord,
82
82
  IssuerEvidence,
83
+ OnChainNote,
83
84
  PlaintextRecipient,
84
85
  Receipt,
85
86
  ReceiptError,
@@ -88,6 +89,7 @@ from actproof.receipt import (
88
89
  build_receipt,
89
90
  issuer_evidence_from_dict,
90
91
  issuer_evidence_to_dict,
92
+ on_chain_note_from_bytes,
91
93
  read_issuer_evidence,
92
94
  read_receipt,
93
95
  receipt_from_dict,
@@ -179,6 +181,8 @@ __all__ = [
179
181
  "read_issuer_evidence", "write_issuer_evidence",
180
182
  "ALGORAND_MAINNET", "ALGORAND_TESTNET", "ALGORAND_BETANET",
181
183
  "ARC2_NOTE_FORMAT", "ARC2_DAPP_NAME", "ARC2_FORMAT_VERSION_JSON",
184
+ # receipt.py (v0.3.4): on-chain note in three encodings
185
+ "OnChainNote", "on_chain_note_from_bytes",
182
186
  # timestamp.py (v0.0.6)
183
187
  "TimestampAuthority", "TSAAttempt", "AcquisitionResult",
184
188
  "TimestampError", "acquire_timestamp_token",
@@ -95,6 +95,7 @@ from actproof.receipt import (
95
95
  ARC2_FORMAT_VERSION_JSON,
96
96
  ARC2_NOTE_FORMAT,
97
97
  AnchorRecord,
98
+ on_chain_note_from_bytes,
98
99
  )
99
100
  from actproof.signers.interface import ALGORAND_MIN_FEE_MICROALGOS
100
101
 
@@ -518,6 +519,9 @@ def anchor_manifest(
518
519
  # commitment, the transaction is the carrier.
519
520
  note_bytes = build_note_bytes(manifest_hash, batching_profile)
520
521
  note_payload_b64 = base64.b64encode(note_bytes[len(_ARC2_PREFIX):]).decode("ascii")
522
+ # The full on-chain note in three encodings, all from this one
523
+ # note_bytes value, so the three encodings cannot drift apart.
524
+ on_chain_note = on_chain_note_from_bytes(note_bytes)
521
525
 
522
526
  network = _network_for_mode(mode)
523
527
 
@@ -536,6 +540,7 @@ def anchor_manifest(
536
540
  note_dapp_name=ARC2_DAPP_NAME,
537
541
  note_format_version=ARC2_FORMAT_VERSION_JSON,
538
542
  note_payload_b64=note_payload_b64,
543
+ on_chain_note=on_chain_note,
539
544
  )
540
545
 
541
546
  # DEMO and PRODUCTION: real submission.
@@ -600,4 +605,5 @@ def anchor_manifest(
600
605
  note_dapp_name=ARC2_DAPP_NAME,
601
606
  note_format_version=ARC2_FORMAT_VERSION_JSON,
602
607
  note_payload_b64=note_payload_b64,
608
+ on_chain_note=on_chain_note,
603
609
  )