Open, deterministic protocol core for the DNS of Money A2A payment surface (FAS-1 pay: addressing, canonical hashing, payment-hook client).
Project description
a2a-protocol-core
The open, deterministic protocol core of the DNS of Money
agent-to-agent (A2A) payment surface — the dependency-light layer external AI
agents adopt to resolve, hash, and initiate pay: payments.
The intelligence lives in the calling agent. This package serves deterministic, inspectable primitives — no rail selection, no scoring, no model anywhere in the money path.
Install
pip install a2a-protocol-core
Runtime deps are intentionally minimal: pydantic and requests.
What's in here
| Module | A2A ref | Purpose |
|---|---|---|
addressing |
FAS-1 | pay: URI grammar + validation (is_valid_pay_uri) |
semantic_normalizer |
A2A-009 | collapse synonym verbs → canonical action codes |
canonical_hash |
A2A-008 | metadata- & vocabulary-stable payment-intent hash |
schemas |
A2A-041 | payment-hook request/response wire models |
client |
A2A-041 | A2APaymentHookClient over /v1/a2a/* |
Quick start
from a2a_protocol_core import (
A2APaymentHookClient,
compute_canonical_hash,
normalize_message,
)
# Your agent describes intent however it likes...
intent = {"action": "send", "amount": "2.50", "currency": "USD", "alias": "pay:agent.compute"}
# ...which collapses to a stable hash regardless of wording ("send" == "transfer" == "pay").
semantic_hash = compute_canonical_hash(normalize_message(intent))
client = A2APaymentHookClient(base_url="https://api.dnsofmoney.com")
result = client.trigger(
job_id="job-001",
provider_pay_address="pay:agent.compute",
requester_pay_address="pay:vendor.alpha",
amount="2.50",
currency="USD",
semantic_hash=semantic_hash,
)
print(result.settlement_result.status, result.iso_message_ref)
See examples/trigger_payment_hook.py.
Pay a pay: alias in one call (non-custodial)
Resolve the price, pay from your own wallet, and get back a signed resolve/verify/OFAC-screen attestation — one function, and your seed never leaves your process:
pip install "a2a-protocol-core[xrpl]"
from a2a_protocol_core import pay_alias_xrp
result = pay_alias_xrp(
base_url="https://api.dnsofmoney.com",
alias="pay:vendor.alpha",
amount_xrp="0.10",
seed="s...", # YOUR XRPL wallet seed — signs locally, never transmitted
api_key="fas_live_...", # attributes the settle leg
)
print(result.tx_hash, result.summary.verdict) # e.g. "A1B2…", "CLEAR"
Already settled the payment through your own wallet stack (or a Coinbase Agentic
Wallet)? Skip the signing and just fetch the attestation — no [xrpl] extra:
from a2a_protocol_core import attest_settled_payment
result = attest_settled_payment(
base_url="https://api.dnsofmoney.com",
alias="pay:vendor.alpha",
amount_xrp="0.10",
tx_hash="A1B2C3...", # your already-validated XRPL tx
api_key="fas_live_...",
)
DNS of Money verifies an already-settled transaction and returns metadata — it never holds your keys or your funds.
Why canonical hashing?
Two agents describing the same payment with different words ("send" vs
"transfer") or different session/trace metadata must produce the same
intent fingerprint. compute_canonical_hash excludes non-semantic noise
(session/request/trace ids, timestamps, idempotency keys, memos) and
normalizes the action verb, so the hash captures what is being paid — not
how it was phrased. That fingerprint binds an agent's intent to a settlement
without trusting free text.
Design constraints
- Deterministic only. Nothing here selects or scores a rail.
- Off the money path. The hash and client describe and carry intent; the deterministic core (server-side) resolves, generates ISO 20022, and settles.
- Dependency-light. Safe to embed in an agent runtime.
Development
pip install -e ".[dev]"
pytest
ruff check src tests
License
Apache-2.0 — permissive with an explicit patent grant. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file a2a_protocol_core-0.2.0.tar.gz.
File metadata
- Download URL: a2a_protocol_core-0.2.0.tar.gz
- Upload date:
- Size: 22.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f58f08c74bb312db48b7f58482798f197e28b57072fa3e4c163f31bc9e5a089
|
|
| MD5 |
918f204bc886bb456893f0470213ba0e
|
|
| BLAKE2b-256 |
94a2e2420c751383228e3193553cb187d6130cb628f3d58dbf96fafef7c6c24f
|
Provenance
The following attestation bundles were made for a2a_protocol_core-0.2.0.tar.gz:
Publisher:
publish.yml on dnsofmoney/a2a-protocol-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2a_protocol_core-0.2.0.tar.gz -
Subject digest:
7f58f08c74bb312db48b7f58482798f197e28b57072fa3e4c163f31bc9e5a089 - Sigstore transparency entry: 2144461867
- Sigstore integration time:
-
Permalink:
dnsofmoney/a2a-protocol-core@da0b688f65343c90cf41f85602b510279c748387 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/dnsofmoney
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@da0b688f65343c90cf41f85602b510279c748387 -
Trigger Event:
push
-
Statement type:
File details
Details for the file a2a_protocol_core-0.2.0-py3-none-any.whl.
File metadata
- Download URL: a2a_protocol_core-0.2.0-py3-none-any.whl
- Upload date:
- Size: 17.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cd7a5bcc23fe8c2b240d6b193201cea609a423d754a2ebbb69db32a82917421d
|
|
| MD5 |
b7944a29b62578b397fbda926a37190b
|
|
| BLAKE2b-256 |
e5647dc0f498f2c71ec419d042aa0b0db11aef3b2420ca9e3b655192044ad64e
|
Provenance
The following attestation bundles were made for a2a_protocol_core-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on dnsofmoney/a2a-protocol-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
a2a_protocol_core-0.2.0-py3-none-any.whl -
Subject digest:
cd7a5bcc23fe8c2b240d6b193201cea609a423d754a2ebbb69db32a82917421d - Sigstore transparency entry: 2144461897
- Sigstore integration time:
-
Permalink:
dnsofmoney/a2a-protocol-core@da0b688f65343c90cf41f85602b510279c748387 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/dnsofmoney
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@da0b688f65343c90cf41f85602b510279c748387 -
Trigger Event:
push
-
Statement type: