An application-layer compliance protocol for stateless ISO 20022 messaging bound to on-chain settlement. The message never rests. The anchor never lies. The ledger enforces.
ZPK is not encryption. Encryption assumes the data is still there -- protected, persistent, waiting. ZPK makes persistence architecturally impossible.
| Property | Encryption | ZPK |
|---|---|---|
| Data at rest | Yes, encrypted | No. Never. |
| Breach exposure | Ciphertext stolen | Nothing to steal |
| Compliance proof | Audit logs | Ledger anchor (immutable) |
| Reassembly | Any key holder | Authorized wallet only |
| Data liability | Managed | Liquidated |
Every ZPK transaction follows this exact sequence. No step can be skipped. The ledger enforces the order.
444E41 (hex for "DNA"), validates the anchor format, and checks single-use state. If any check fails, the transaction rolls back. The payment is never made.The DNA anchor is a 24-character uppercase hex string. It is the only on-chain artifact of a ZPK transaction.
09BC5A5D157C2E503831A3F2| Property | Value |
|---|---|
| Total length | 24 characters (pilot) · 64 characters (production) |
| Character set | Uppercase hex [0-9A-F] |
| Regex (pilot) | /^[0-9A-F]{24}$/ |
| Prefix in Memo | DNA (3 chars, ASCII) |
| HookParameter name | 444E41 (hex for "DNA") |
| HookParameter value | Anchor hex-encoded as UTF-8 (48 hex chars for 24-char anchor) |
| Global uniqueness | Guaranteed by Shannon nonce injection at shatter time |
| Single-use enforcement | Hook state_set on Xahau -- replay rejected on-chain |
The ZPK-Enforcer Hook is deployed on Xahau Mainnet. It runs autonomously on every incoming payment to the gateway address. No human is in the loop.
| Property | Value |
|---|---|
| Gateway address | rHs7o2n6r6YaRkzhg7zZFa1VWwiEx84hKr |
| Hook hash | 9D35CFCE2ACF4C59E15063AD09119AC4269EA1E11766F6A412D2B1443BDBBF6A |
| SetHook tx | 39249C41... |
| Network | Xahau Mainnet (NetworkID 21337) |
| Status | LIVE |
| Check | Condition | On failure |
|---|---|---|
| HookParameter present | Parameter named 444E41 must exist | Rollback |
| Anchor format | Value must be 48 hex chars (24-char anchor, hex-encoded) | Rollback |
| Single-use state | Anchor must not exist in Hook state_set | Rollback |
| State commit | Anchor written to state on acceptance | N/A |
Anyone can install the ZPK-Enforcer Hook on their own Xahau address using the Hook hash above. Use the Xahau Hooks Builder at hooks-builder.xrpl.org and select "Install from HookHash".
ZPK-Enforcer: DNA anchor verified. ZPK-compliant. Accepted. Validated in ledger 22189069 on Thursday, April 16, 2026 1:53 PM
Every ZPK transaction must include a Memo field containing the DNA anchor. This is the human-readable forensic pointer on the ledger.
| Field | Value | Notes |
|---|---|---|
| MemoType | 444E41 | Hex for "DNA" -- constant, never changes |
| MemoData | hex("DNA" + anchor) | Prefix "DNA" + 24-char anchor, hex-encoded |
function toHex(str) {
return Array.from(str)
.map(c => c.charCodeAt(0).toString(16).padStart(2,'0').toUpperCase())
.join('');
}
const anchor = '09BC5A5D157C2E503831A3F2'; // 24-char DNA anchor
const memo = {
Memo: {
MemoType: toHex('DNA'), // 444E41
MemoData: toHex('DNA' + anchor) // hex("DNA09BC5A5D157C2E503831A3F2")
}
};
const hookParameter = {
HookParameter: {
HookParameterName: '444E41', // hex for "DNA" -- constant
HookParameterValue: toHex(anchor) // 24-char anchor hex-encoded = 48 hex chars
}
};
Base URL: https://api.aifs.dev/api/v1
Shatters an ISO message into 1,024 particles and returns the DNA anchor.
{
"manifest": "<ISO 20022 XML string>",
"originAddress": "rSenderWalletAddress...",
"receiverAddress": "rReceiverWalletAddress...",
"allowSenderReassembly": true
}
{
"success": true,
"dna": "09BC5A5D157C2E503831A3F2",
"arweaveId": "arweave-tx-id-if-uploaded"
}
Reassembles the ISO message in RAM. Requires a valid Xaman signature proving wallet identity.
{
"address": "rAuthorizedWalletAddress...",
"xamanUuid": "xaman-payload-uuid",
"authType": "xaman",
"timestamp": 1713300000000
}
{
"success": true,
"data": "<reassembled ISO 20022 XML>",
"integrity": 1.0,
"arweaveId": "arweave-tx-id"
}
| Code | Meaning |
|---|---|
IDENTITY_MISMATCH | Requesting wallet is not the authorized sender or receiver |
SENDER_REASSEMBLY_DISABLED | Record is sealed. Receiver-only reassembly. |
ZPK_ANCHOR_INVALID | Anchor failed engine signature verification |
IDENTITY_REQUIRED | originAddress missing from shatter request |
MISSING_MANIFEST | No payload provided to shatter |
EXTRACTION_CAP_REACHED | Rate limit exceeded (50/min per wallet) |
Compliance is not a parallel process in ZPK. It is a mathematical precondition for settlement. The payment cannot be made unless the compliance anchor is valid.
| Rail | What moves | Enforced by |
|---|---|---|
| Private Rail | ZPK compliance anchor (DNA) | AIFS API + Hook WASM |
| Public Rail | Asset transfer (XAH or token) | Xahau ledger consensus |
Both rails are committed in a single signed transaction. They are mathematically inseparable. If the Hook rejects the anchor, the entire transaction -- including the asset transfer -- rolls back.
| Condition | Result |
|---|---|
No HookParameter named 444E41 | Full rollback. Payment not made. |
| Anchor wrong format or length | Full rollback. Payment not made. |
| Anchor already used (replay) | Full rollback. Payment not made. |
| Anchor fails engine signature (v2) | Full rollback. Payment not made. |
The shattered message can be reassembled only by cryptographically verified authorized parties. Authorization is wallet-based and enforced server-side.
| Role | Authorization | Salt used for XOR |
|---|---|---|
| Sender | Wallet address matches originAddress from shatter time | Sender wallet address (lowercase) |
| Receiver | Wallet address matches receiverAddress from shatter time | Sender wallet address (stored) |
The reassembled message exists only in server RAM during the active session. It is never written to disk. It is never logged. When the session closes, it is gone. This is the Zero Persistent Knowledge guarantee.
| Item | Status | Notes |
|---|---|---|
| Hook deployed on Mainnet | LIVE | Single-use enforcement active |
| Engine signature (API layer) | LIVE | HMAC verified before HookParameter injection |
| Replay protection | LIVE | Hook state_set enforced |
| Dual authorization (sender + receiver) | LIVE | Both roles supported |
| 64-char anchor (full SHA-256) | REQUIRED | Requires Hook v2 + coordinated deploy |
| Hook-side HMAC verification | REQUIRED | Closes direct Xahau submission gap |
| Ed25519 engine signature | REQUIRED | Replaces HMAC for production |
| Arweave permanent storage | PILOT | Available, not mandatory in all flows |
const API = 'https://api.aifs.dev/api/v1';
// Step 1: Shatter the ISO message
const shatterRes = await fetch(`${API}/liquify`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
manifest: isoXmlString,
originAddress: senderWalletAddress,
receiverAddress: receiverWalletAddress,
allowSenderReassembly: true
})
});
const { dna } = await shatterRes.json();
// Step 2: Build the Xahau transaction
function toHex(str) {
return Array.from(str)
.map(c => c.charCodeAt(0).toString(16).padStart(2,'0').toUpperCase())
.join('');
}
const txjson = {
TransactionType: 'Payment',
Destination: 'rHs7o2n6r6YaRkzhg7zZFa1VWwiEx84hKr',
Amount: '1000', // XAH drops
NetworkID: 21337,
Memos: [{
Memo: {
MemoType: toHex('DNA'),
MemoData: toHex('DNA' + dna)
}
}],
HookParameters: [{
HookParameter: {
HookParameterName: '444E41',
HookParameterValue: toHex(dna)
}
}]
};
// Step 3: Submit via AIFS settle endpoint
const settleRes = await fetch(`${API}/auth/xaman/settle-xahau`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ txjson, dna })
});
const { uuid, qrUrl } = await settleRes.json();
// Display qrUrl to user for Xaman signing
// After user signs a Xaman SignIn challenge
// xamanUuid and account come from the challenge poll response
const res = await fetch(`${API}/materialize/${dnaAnchor}`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
address: account, // wallet address from Xaman signing
xamanUuid: xamanUuid, // UUID of the signed challenge payload
authType: 'xaman',
timestamp: Date.now()
})
});
const result = await res.json();
if (result.success) {
// result.data contains the reassembled ISO 20022 XML
// It exists in RAM only. Purged when session closes.
console.log(result.data);
}
// Client-side format check only.
// Engine signature verification requires the AIFS API.
function isValidAnchorFormat(anchor) {
return typeof anchor === 'string' && /^[0-9A-F]{24}$/.test(anchor);
}
// HookParameterValue encoding
function anchorToHookValue(anchor) {
return Array.from(anchor)
.map(c => c.charCodeAt(0).toString(16).padStart(2,'0').toUpperCase())
.join('');
// 24-char anchor becomes 48-char HookParameterValue
}
curl -X POST https://api.aifs.dev/api/v1/liquify \
-H "Content-Type: application/json" \
-d '{
"manifest": "<?xml version=\"1.0\"?><Document>...</Document>",
"originAddress": "rYourSenderWalletAddress",
"receiverAddress": "rYourReceiverWalletAddress",
"allowSenderReassembly": true
}'