SupersededThis page records DevNet runs from July 2026. It is not the current record of this system, and it should not be read as describing what ZeroVaultID runs today.
The same settlement design was subsequently run on the Canton MainNet global synchronizer on 2026-09-04, under a later package, with a wider set of controls and a fuller statement of what the run does not establish. That run supersedes the three runs on this page as the current record: the MainNet DvP run of 2026-09-04.
This page is kept, unretracted, because the runs it describes did happen and the
evidence for them is real. It is history, not a current claim. Two specific things to
carry into it: these runs were on DevNet, which is not MainNet and not
production, and one claim in section 7 about reproducing the
bundleHash was wrong and has been corrected in place. That correction is
marked where it appears.
Addendum of 5 October 2026. Three qualifications apply to this page. First, the "consumed exactly once" statements below were computed by our software's read-back after each transaction, which found each shard by first match among active shards, a pattern later found wrong for other runs and not re-derived here; they record what our software read back, not an established property of the transactions. Second, the legs are data labels and denote no asset, amount or instrument; no value moved. Third, the check behind each clearance covers two identity document numbers only and does not screen names or dates of birth. The signed roots in section 8 expired on 21 September 2026.
A two-leg settlement committed in a single transaction on the public
Canton DevNet. Each leg opened its own rail and bound a cleared attestation to that
leg's realized anchor, both nullifiers were recorded as consumed once by our read-back
(see the addendum above), and every forged
variant was refused at command interpretation. Every value below is copied from the run
evidence, and that evidence is published rather than described: one archive, sha256
60651427…, carrying the records of all three runs, against
which every gate, anchor, nullifier and verbatim refusal quoted on this page can be
checked using sha256sum and jq alone. The verification key both
0.7.0 runs proved under, sha256 069d3c10…, is still in
this repository and unchanged since they ran. What lies outside a reader's reach is named
where it arises: re-fetching the transaction takes DevNet participant access (section 5),
the curator-signed list roots stay in the curator's custody (section 8), and one artifact
claim did not survive a later repoint (section 7).
Canton DevNet
Packages exercised: zerovault-canton-gate-accum, package id
395e49e4… (0.6.0) and
da26b65d… (0.7.0). Three recorded DvP runs: 2026-07-23
under 0.6.0, re-verified read-only against the live DevNet participant on 2026-07-24;
2026-07-30 and 2026-07-31 under 0.7.0.
| Date | 2026-07-23 (settlement effective at 2026-07-23T05:54:09.944671Z) |
| Network | Canton Network public DevNet global synchronizer (DevNet, not MainNet, not production) |
| Synchronizer id | global-domain::1220be58c29e65de40bf273be1dc2b266d43a9a002ea5b18955aeef7aac881bb471a |
| Party namespace | ZeroVaultID::122062d7ab2a3a33bb08d45ae557e61e379e3d9dfbb7291b691eda59063c9e9be800 |
| Package id | 395e49e4b8bdd3c9873a955a56502674648627101f5b8cfc2d1fee39c883d973 |
| Package version | zerovault-canton-gate-accum 0.6.0 |
| Positive update id | 12209bd1301efe7cc6dc7bca39f6ae0efb9b9a2e0c6688741930eecee907febbc54c |
The positive update id is the committed settlement transaction. It was re-verified
read-only against the live DevNet participant on 2026-07-24; the participant's verbatim
response is update-verification.json in the evidence pack, carrying this
update id and the command id dvp-20260723T054053Z-settle-pos.
Both legs settled atomically in one transaction through the
SettleAtomicBound choice, creating two OpenAnchor contracts. Each
leg is bound to its own realized anchor: the recipient's cleared attestation is accepted
only when it belongs to that recipient, is cleared, and its boundOpenA
equals that leg's OpenAnchor.openA. Both nullifiers were recorded as consumed
once by our read-back (see the addendum above).
| Leg | Delivery | Payment |
|---|---|---|
| OpenAnchor contract id | 0025666751c6a552f22ad9536e02975c68b9e8c67faa412373358682ea269db48aca121220b46a447e15530fd8a6155815714fdb43e094cad9870ba7e7c34c908850277b46 | 0014c7ba621129b5637f2b46e27147200a8b21e06720517826c6a28b1ec3d4ee52ca12122089f2ea585ae6be013e69e83809174e28b779659bf97671eec71b7f84a331be1b |
| Realized anchor openA | 81d26e96d424a1c837aeabbeb557eba36696939adb1a9f96281325f0004d8bc9 | 382c3d543eb09cf21443e121863c6692302aab21f4be6e0efacafc5ab5a9757b |
| Bound cleared attestation | 0082c3d8cf5a1cc4c4870be0616582a71969ebd4f594bab71144cce653b38e2164ca121220685f480860c29e8172e24b66a4be470d9b97b7af1e4ac09e6e06d729372a745b | 009edb4f58c478d1629f98768631a08f619f17d2ca5a43a77c3dbd233a70f5286eca121220293be122dfcea5bafb937ac6e0b2639cfeb4f24b9c6d36bf98a7ff20b13b381d |
| Nullifier (consumed once) | nu:fbf2b8709a0dd091a20d0f19568a418e1f797c738c8414fb19869fa3bd464cad | nu:e1add0d98676fed6d01654f07c27f2072b25589d5e531af2c6d0352b27822c4b |
| Shard id | 251 | 225 |
The settlement is all-or-nothing across the two legs. A failed bind on either leg, after both legs have opened in-transaction, aborts both opens and both consumes, so no anchor is created and neither nullifier is spent.
Each forged variant below was submitted against the same bound choice and refused.
The named assert text is quoted verbatim from the ledger error message
field recorded for that control.
| Control | Shard ids d / p | Named assert (verbatim) | Classification |
|---|---|---|---|
| BIND-D | 209 / 197 | attestation not bound to this envelope | interpretation-time assertion failure, rolled back, no committed update id, not sequenced |
| BIND-P | 186 / 123 | attestation not bound to this envelope | interpretation-time assertion failure, rolled back, no committed update id, not sequenced |
| UNCLEARED | 114 / 13 | recipient is not cleared (KYC / sanctions) | interpretation-time assertion failure, rolled back, no committed update id, not sequenced |
| SUBJECT | 77 / 247 | attestation must belong to the recipient | interpretation-time assertion failure, rolled back, no committed update id, not sequenced |
| XLEG | 208 / 124 | attestation not bound to this envelope | interpretation-time assertion failure, rolled back, no committed update id, not sequenced |
Each refusal rolled back the whole settlement: no OpenAnchor at the
scenario's openA, both leg shards still active with consumed = [], and both
sealed envelopes still active, verified from ledger state per scenario. The full verbatim
ledger error payload for each control, including grpcCodeValue: 9 and
AssertionFailed, is in dvp-run.json in the evidence pack.
Package 0.6.0 was accepted under Smart Contract Upgrade validation against the
vetted 0.5.0 predecessor at upload. The run reused the standing
EpochRegistry that was created under 0.5.0, rather than recreating it, so
the upgrade-at-exercise validated at upload. The reused contract id is:
00c2a64c412f46f2d1e1a3b1e0c17c0d2e47dd5c19b9db05de2678152386091ea6ca12122052d648ae4f8bf9e10551f1d0a133d44eb736d0f732b01d7d7f13cc05fe8c30ef
The later runs in section 7 were exercised under package id da26b65d26207e36de2850f2cdbfc0ec2e1b19c84b910e3d31e2c0fe7a22a627 (0.7.0).
sha256 of evidence-pack.zip:
606514277ea6773961412635cd0d202cf419e5843229c99d923dffd53fa8bcad
The exact re-verification commands, using only unzip,
sha256sum, jq, and curl, are:
sha256sum evidence-pack.zip # expect the sha256 above
unzip evidence-pack.zip
sha256sum CLAIMS-DVP.md dvp-provision-checkpoint.json dvp-run.json update-verification.json
jq '{allGreen, gates}' dvp-run.json
jq '.positive | {exercisedChoice, boundOpenA, consumedOnce, anchorOpenA: [.anchors[].openA]}' dvp-run.json
jq -r '.negativeControls | to_entries[] | [.key, .value.rejection.expectedAssert, .value.rejection.provenance] | @tsv' dvp-run.json
# re-verify the positive update id against a live DevNet participant:
export ZV_JSON_API=<participant JSON Ledger API base>
export ZV_PACKAGE_ID=395e49e4b8bdd3c9873a955a56502674648627101f5b8cfc2d1fee39c883d973
export ZV_USER_ID=ledger-api-user
UPDATE_ID=$(jq -r '.update.Transaction.value.updateId' update-verification.json)
curl -s -X POST "$ZV_JSON_API/v2/updates/update-by-id" -H 'Content-Type: application/json' \
-d "{\"updateId\":\"$UPDATE_ID\",\"updateFormat\":{\"includeTransactions\":{\"eventFormat\":{\"filtersByParty\":{\"zvCanton::122062d7ab2a3a33bb08d45ae557e61e379e3d9dfbb7291b691eda59063c9e9be800\":{\"cumulative\":[{\"identifierFilter\":{\"WildcardFilter\":{\"value\":{\"includeCreatedEventBlob\":false}}}}]}},\"verbose\":true},\"transactionShape\":\"TRANSACTION_SHAPE_ACS_DELTA\"}}}" \
| jq '.update.Transaction.value | {updateId, commandId, effectiveAt}'
Every command above is reproduced with its real output in the
README.md inside the pack. Canton contract contents are private to their
stakeholder parties by design, so the live re-verification in the last command requires
DevNet access as a party that can see the transaction. The ZeroVaultID validator and
party are publicly visible on the
Lighthouse DevNet explorer; look
up the party namespace ZeroVaultID::122062d7ab2a3a33bb08d45ae557e61e379e3d9dfbb7291b691eda59063c9e9be800.
The pack's CLAIMS-DVP.md item 2 states that Rail Open's five checks gate
each leg. Three of the five are enforced by the ledger; the two cryptographic ones,
Merkle inclusion and signature with proof of possession, are boolean results the driver
supplies, and both legs supplied true. That item overstates check coverage and is
corrected here rather than edited in the pack.
errorCategory field is null in this capture,
because the capture looked for a string token while the JSON Ledger API body carries
the category numerically as grpcCodeValue: 9. The verbatim
message field is the authoritative source and is complete.Two further two-leg settlements were recorded on 2026-07-30 and 2026-07-31 under
package zerovault-canton-gate-accum 0.7.0. Both are the same scenario run
twice, with freshly allocated parties each time; both recorded
allGreen: true. Every value below is copied from each run’s own
dvp-run.json.
These two runs did not capture a ledger transaction record for the positive
settlement. Unlike the 2026-07-23 run above, neither run recorded an
updateId, commandId or effectiveAt for the
committed settlement, so none is quoted here. What each run does record for the
positive settlement is the exercised choice, the two created anchors, the bound
attestation digests, the consumed nullifiers and the gate results, all shown below.
The command ids that do appear in these runs belong to the refused negative controls,
not to the settlement.
| Package id | da26b65d26207e36de2850f2cdbfc0ec2e1b19c84b910e3d31e2c0fe7a22a627 |
| Package version | zerovault-canton-gate-accum 0.7.0 |
| Synchronizer id | global-domain::1220be58c29e65de40bf273be1dc2b266d43a9a002ea5b18955aeef7aac881bb471a |
| Exercised choice | SettleAtomicBound |
| Settlement reference | stl:dvp-0001 |
| Leg | Delivery | Payment |
|---|---|---|
| OpenAnchor contract id | 00ec57e22fadc173ca09c43f1b0bec06d3573526f35a2b771ae3fc7e4663bb28d3ca121220dbca742517a198f4a1913e456841de7807e4f16a702f55c30c18c29b074801ac | 0094d0cf308d188cc1e423edc84546f0b727ccc5f8fc83aff07b59c7d9bd98dc70ca121220f4856cc728e2617510b35704c7655ada6c67e744a667ef3a36d31cb27920738f |
| Realized anchor openA | ba455d696e6cc2fa250cfc26014246e377bc5a8612fbf8407ea0f5dc52e84abf | 8e8e53f710495e706cafbd1bc9f742152714f23f0668cde7d987b728c4bbb775 |
| Attestation boundOpenA | ba455d696e6cc2fa250cfc26014246e377bc5a8612fbf8407ea0f5dc52e84abf | 8e8e53f710495e706cafbd1bc9f742152714f23f0668cde7d987b728c4bbb775 |
| Rail nullifier (consumed once) | nu:527455a5971e5bc3c636fddc1479812b9a943caeaa84a40db9ed5c74c35470b9 | nu:f09819dbf32719b17996cfc849d6dbbb9d41801ab4a5d01e97b018ed43a28789 |
| Shard id | 82 | 240 |
| Leg settlement reference | stl:dvp-0001:delivery | stl:dvp-0001:payment |
| Sealed envelope | 0037e771b6af664fb847e79abbe7854a68177c7c2252bb23e6e23622fa00a5cf25ca12122076d6d4745ab54844719fd32820cee1942338e062b362fa7e76ef03c402864c3b | 00e1dbf3b709a8a9381104fee5504bc27b1f3b5ca58b29142c34bd4a0a3e8cc01eca121220c288b842077753897e179ec22f168d3da1bd6613f52d0579d75e4e3af19dee59 |
For each leg the attestation’s boundOpenA equals that leg’s realized
OpenAnchor.openA, and each rail nullifier appears exactly once in its shard’s
consumed set (deliveryOnce and paymentOnce both true). All nine
settlement gates are true:
twoAnchors, deliveryBound, paymentBound, exercisedChoiceIsBound, deliveryConsumedOnce, paymentConsumedOnce, legBoundDistinct, deliveryLegBound, paymentLegBound
A clearance valid for one leg, presented for the other, was refused at
SettleAtomicBound with clearance is not for the buyer leg of this settlement
(FAILED_PRECONDITION / DAML_FAILURE, interpretation-time refusal (rolled back, not sequenced)). Verbatim ledger payload:
[public-dvp] /v2/commands/submit-and-wait-for-transaction -> 400: {"code":"DAML_FAILURE","cause":"Interpretation error: Error: User failure: UNHANDLED_EXCEPTION/DA.Exception.AssertionFailed:AssertionFailed (error category 9): clearance is not for the buyer leg of this settlement","correlationId":"6a8571bd-eeac-471f-aeee-f1ca23cdb091","traceId":"934b7b5dd88dc0889f10b38b04a1688c","context":{"participant":"'participant'","error_id":"UNHANDLED_EXCEPTION/DA.Exception.AssertionFailed:AssertionFailed","exercise_trace":" in choice da26b65d:AtomicDvP:DvPSettlement:SettleAtomicBound on contract 0053bf03f0 (#0)\n in exercise command da26b65d:AtomicDvP:DvPSettlement:SettleAtomicBound on contract 0053bf03f0.\n","category":"9","tid":"934b7b5dd88dc0889f10b38b04a1688c","definite_answer":"false","commands":"{readAs: [], deduplicationPeriod: {duration: 'PT30S'}, submittedAt: '2026-07-30T23:24:18.779392Z', submissionId: '6a8571bd-eeac-471f-aeee-f1ca23cdb091', actAs: ['zvCanton::122062d7ab2a3a33bb08d45ae557e61e379e3d9dfbb7291b691eda59063c9e9be800'], commandId: 'dvp-20260730T232137Z-settle-WRONG-LEG', userId: 'ledger-api-user', workflowId: }"},"resources":[],"errorCategory":9,"grpcCodeValue":9,"retryInfo":null,"definiteAnswer":null}
The refusal rolled the whole settlement back, verified from ledger state:
noAnchor, deliveryUnspent, paymentUnspent and
envelopesActive are all true. Four further controls in this run
(BIND-D, BIND-P, UNCLEARED, XLEG)
were refused and rolled back the same way; their verbatim payloads are in
dvp-run.json.
The run recorded, per leg, the exact claim the clearance stands for. Quoted verbatim
from f7Scope.delivery.claim and f7Scope.payment.claim:
delivery: Under vk-govid-m4-05b9caa0, at epoch 1785368536, the holder of two government-ID credentials signed by issuer_root 0x232de6aec4bc575a988e62e94a69fb00e6849cf19318c9a30b6bb2a49c66ef37 proved non-membership of all three curator-signed sanctions lists under policy_commit 0x2eb3fa93b476bdeadbe18956e0dd48267fd11f78aedb8aa7013d5b7a4826bc36, bound to destination context 0x00d04d068aecf06f3230a387584d6ea59b6481497936b33cd23a3687388266b0, single-use under nullifier 0x1f9b42a9ff09e6fd8450de3a76c6c5e1be9890f795f3dddefeb83f4e5d607829. NO party identity is asserted: the M4 public vector binds no subject identifier. payment: Under vk-govid-m4-05b9caa0, at epoch 1785368536, the holder of two government-ID credentials signed by issuer_root 0x232de6aec4bc575a988e62e94a69fb00e6849cf19318c9a30b6bb2a49c66ef37 proved non-membership of all three curator-signed sanctions lists under policy_commit 0x2eb3fa93b476bdeadbe18956e0dd48267fd11f78aedb8aa7013d5b7a4826bc36, bound to destination context 0x0ddf71673ff21c4cb35e19c077bdee0bd123e8196ff0c1fec8654dda380ba8f5, single-use under nullifier 0x1374f62563b973720f8dcdae4bf1c59d999d9ba32e816469825c0edde529cf6b. NO party identity is asserted: the M4 public vector binds no subject identifier.
The two claims are identical except for the destination context and the nullifier, which
is what makes the legs distinct and non-interchangeable
(legBoundDistinct = true).
| Package id | da26b65d26207e36de2850f2cdbfc0ec2e1b19c84b910e3d31e2c0fe7a22a627 |
| Package version | zerovault-canton-gate-accum 0.7.0 |
| Synchronizer id | global-domain::1220be58c29e65de40bf273be1dc2b266d43a9a002ea5b18955aeef7aac881bb471a |
| Exercised choice | SettleAtomicBound |
| Settlement reference | stl:dvp-0001 |
| Leg | Delivery | Payment |
|---|---|---|
| OpenAnchor contract id | 00f2959e8a907fbce2d2fc8a730916985328dc0fde21d021ab8e6b9ac14abe53b7ca12122013326f24e067606c7fd3183f9ba0ed57703bfe4be7ecb5a46c4b5ca941cceadc | 0058b7fd6d866f2cbc0eb75fdef685ecefbbafcaead9d636cdbf6f0c5c28181435ca121220bca96fa03fb760e29230162710b3fdf1c1d59abbe1b1d2143171c78203f42638 |
| Realized anchor openA | 75560f2910c4064bd2aacb18319305bbe106c01fe2bebeda5248922ca0ef0534 | b26c493491d6dc32f3541f4b95d70c311af677b527d06aeac4bee75d29611837 |
| Attestation boundOpenA | 75560f2910c4064bd2aacb18319305bbe106c01fe2bebeda5248922ca0ef0534 | b26c493491d6dc32f3541f4b95d70c311af677b527d06aeac4bee75d29611837 |
| Rail nullifier (consumed once) | nu:ad24a32f6eea488464052f608368be618999ac364e97c7afe7f4a3f22dd4909e | nu:1cc3d4b3203450305de973a208bf45fe9663917fcdd8287b1e2af77385839c1e |
| Shard id | 173 | 28 |
| Leg settlement reference | stl:dvp-0001:delivery | stl:dvp-0001:payment |
| Sealed envelope | 00129b6b50c809b5719885281d79582a9d16098fddee1d9cc212d1b2ae962de0feca121220a6a72e74e1eeef30d299a122c3954f1b9c55d4c3f54d395c575ebb2f376ef4dd | 00b652deeb9d0f1c1932d30bc712551ab222ad2597119abfe090658b04598b08e4ca1212206f8329476b9f1844fc77468cbbda817bbbf477e2be8d40d2c63f033edcee1a89 |
For each leg the attestation’s boundOpenA equals that leg’s realized
OpenAnchor.openA, and each rail nullifier appears exactly once in its shard’s
consumed set (deliveryOnce and paymentOnce both true). All nine
settlement gates are true:
twoAnchors, deliveryBound, paymentBound, exercisedChoiceIsBound, deliveryConsumedOnce, paymentConsumedOnce, legBoundDistinct, deliveryLegBound, paymentLegBound
A clearance valid for one leg, presented for the other, was refused at
SettleAtomicBound with clearance is not for the buyer leg of this settlement
(FAILED_PRECONDITION / DAML_FAILURE, interpretation-time refusal (rolled back, not sequenced)). Verbatim ledger payload:
[public-dvp] /v2/commands/submit-and-wait-for-transaction -> 400: {"code":"DAML_FAILURE","cause":"Interpretation error: Error: User failure: UNHANDLED_EXCEPTION/DA.Exception.AssertionFailed:AssertionFailed (error category 9): clearance is not for the buyer leg of this settlement","correlationId":"20ad233e-e3b7-49e2-aa43-eed73824ea04","traceId":"e320c1ee853dd325cfd3030928449dfb","context":{"participant":"'participant'","error_id":"UNHANDLED_EXCEPTION/DA.Exception.AssertionFailed:AssertionFailed","exercise_trace":" in choice da26b65d:AtomicDvP:DvPSettlement:SettleAtomicBound on contract 009772ef46 (#0)\n in exercise command da26b65d:AtomicDvP:DvPSettlement:SettleAtomicBound on contract 009772ef46.\n","category":"9","tid":"e320c1ee853dd325cfd3030928449dfb","definite_answer":"false","commands":"{readAs: [], deduplicationPeriod: {duration: 'PT30S'}, submittedAt: '2026-07-31T00:14:37.056754Z', submissionId: '20ad233e-e3b7-49e2-aa43-eed73824ea04', actAs: ['zvCanton::122062d7ab2a3a33bb08d45ae557e61e379e3d9dfbb7291b691eda59063c9e9be800'], commandId: 'dvp-20260731T001019Z-settle-WRONG-LEG', userId: 'ledger-api-user', workflowId: }"},"resources":[],"errorCategory":9,"grpcCodeValue":9,"retryInfo":null,"definiteAnswer":null}
The refusal rolled the whole settlement back, verified from ledger state:
noAnchor, deliveryUnspent, paymentUnspent and
envelopesActive are all true. Four further controls in this run
(BIND-D, BIND-P, UNCLEARED, XLEG)
were refused and rolled back the same way; their verbatim payloads are in
dvp-run.json.
The run recorded, per leg, the exact claim the clearance stands for. Quoted verbatim
from f7Scope.delivery.claim and f7Scope.payment.claim:
delivery: Under vk-govid-m4-05b9caa0, at epoch 1785368536, the holder of two government-ID credentials signed by issuer_root 0x232de6aec4bc575a988e62e94a69fb00e6849cf19318c9a30b6bb2a49c66ef37 proved non-membership of all three curator-signed sanctions lists under policy_commit 0x2eb3fa93b476bdeadbe18956e0dd48267fd11f78aedb8aa7013d5b7a4826bc36, bound to destination context 0x00d04d068aecf06f3230a387584d6ea59b6481497936b33cd23a3687388266b0, single-use under nullifier 0x1f9b42a9ff09e6fd8450de3a76c6c5e1be9890f795f3dddefeb83f4e5d607829. NO party identity is asserted: the M4 public vector binds no subject identifier. payment: Under vk-govid-m4-05b9caa0, at epoch 1785368536, the holder of two government-ID credentials signed by issuer_root 0x232de6aec4bc575a988e62e94a69fb00e6849cf19318c9a30b6bb2a49c66ef37 proved non-membership of all three curator-signed sanctions lists under policy_commit 0x2eb3fa93b476bdeadbe18956e0dd48267fd11f78aedb8aa7013d5b7a4826bc36, bound to destination context 0x0ddf71673ff21c4cb35e19c077bdee0bd123e8196ff0c1fec8654dda380ba8f5, single-use under nullifier 0x1374f62563b973720f8dcdae4bf1c59d999d9ba32e816469825c0edde529cf6b. NO party identity is asserted: the M4 public vector binds no subject identifier.
The two claims are identical except for the destination context and the nullifier, which
is what makes the legs distinct and non-interchangeable
(legBoundDistinct = true).
sanctions_deploy_delivery/ and sanctions_deploy_payment/ in
this repository, and the run evidence records their directories on the machine that
produced them. An earlier version of this page said that the public inputs stored at
those paths reproduce the bundleHash both runs recorded, and described
that value as a sha256 over the public inputs alone. That was wrong on two
counts, and neither is a defect in the artifacts.
First, the bundleHash is a sha256 over a canonical serialization of
the proof's public inputs, not over the public_inputs file as it is
stored on disk. Running sha256sum on the stored file does not return the
recorded value and never could. The two runs recorded
sha256:pi:6aed0e3a… and sha256:pi:baf543b2…,
and no file in this repository hashes to either.
Second, the files now stored at those two paths are no longer the ones these July
runs referenced. On 2026-08-23 the sanctions rail was repointed to the 2026-08-22
curator-signed roots, which replaced proof and public_inputs
in both directories. The July artifacts remain recoverable from this repository's
history, at the tree that was current when these runs executed, but they are not what
a reader checking out the current tree will find.
What does still hold, and was checked when this correction was written: the
verification key is unchanged across that repoint. Both directories carry the same
vk, sha256
069d3c10444c526fe1b6de7ceb9dd7ec6fdce75f5319f61e36670d4238b0602a, and the
same vk_hash beginning 05b9caa0, which is the
vk-govid-m4-05b9caa0 named above and recorded by both runs. That is the
one artifact claim on this page a reader can still check against the current tree.
The proof bytes themselves are not covered by any hash the runs recorded. No claim is made here about which list roots those runs read at verification time.
TEST-ONLY, NOT PRODUCTION; no real person was
screened and no personal data is recorded.available: false for the before and after readings.The check compares two identity document numbers against three curator-signed list roots; names and dates of birth are not screened. These are the roots themselves, read from the curator-signed root artifacts; they are not attributed to any one run’s public inputs on this page. Each root is signed over a canonical byte string committing to the root, the list id and the expiry, under a single curator key.
| List | List id | Signed artifact | bracket_root | Expiry |
|---|---|---|---|---|
| OFAC | 1 | ofac_v4.json | 0x1d9e3ec34570a6acb7bad8980618af48a6958e1f139eff2eab49283eb7d2dba3 | 1789964030 |
| UN | 2 | un_v3.json | 0x04eced49a48c71a3da309264a60c4b41e9f720a2033c929ea4b7ce14e1a561f1 | 1789964031 |
| EU | 3 | eu_v3.json | 0x135a6a4f9bbc24e8c28cd1832aa4a554c4e83b1057564b46dd05d7903599d884 | 1789964034 |
| Curator key hash | 0x0b53473c0c564bd9fdb4dbdb4a08ef07b9d625bcaf321b071d552a061b004bdd |
All three artifacts carry the same curator key hash. Their expiries differ, by seconds:
each root was signed in its own second of the 2026-08-22 ceremony, and the window that
binds is the intersection of the three, which closes at 1789964030. In each one
the first 32 bytes of the signed canonical_bytes reproduce the
bracket_root exactly, the next 8 encode the list id, and the last 8 encode
the expiry, so the root, its list identity and its expiry are covered by one signature.
These artifacts live outside the repository, in the curator’s custody location. This page states what the signed roots are; it does not assert that any particular run on this page read these bytes.
The passport line this DvP work builds on: a zero-knowledge compliance attestation gating a DevNet test transaction, and its accumulator successor run.